让代码飞一会,代码也可以重构?优雅写代码,挑战百万年薪
何谓重构?重构是对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低修改成本。重构是用微小的步伐修改程序,在这个过程中也能够很容易的发现程序中的错误。重构的时机可以是添加功能时,也可以是修补错误时,还可以是复审代码时。重构的目标是让代码容易阅读、所有逻辑都在唯一地点指定、新的改动不会危及现有行为、尽可能简单的表达逻辑。
需求:
创建订单成功后,我们要进行短信通知以及微信通知。
业务场景,用户下订单->短信通知->微信通知
我们一般会这么写
这样写的话实现我们的功能是没问题的。但是我们如果在这个流程上在加一个功能,比如说加一些app通知,加一些邮件通知。这个时候你就会把这些功能功能放在创建订单方法里面在把我们想要加的功能放进去。先不说,这样写是否违背了Java的一些编程思想。比如甲写了这套代码,由于一些事情,请了长假,项目经理把这项任务交给乙,对于乙来说,要去读懂这个代码,这个方法可能几千行,乙要一步一步读,然后在这个方法的基础上,在加几千行代码。每个功能都会有千行代码。这个时候你会发现写代码真的很难。
大家接触过spring的时候,都会看到spring的启动类。
看到这个类,我们会受到一些启发,看到listener和event这两个关键字。我们上面那个需求可不可以用事件监听的机制来实现呢?
代码要怎么写?
首先我们要创建事件,根据需求,我们知道,这里,一共有三个事件。
public class OrderEvent extends ApplicationEvent{
public OrderEvent(Object source){
super(source)
}
}
发布事件
public class OrderService{
@Autowired
ApplicationContext applicationContext
public void saveOrder(){
OrderEvent orderEvent=new OrderEvent("传入一个参数");
applicationContext.publishEvent(orderEvent);
}
}
通知:
@Component
public class SmsListener implements ApplicationListener{
@Override
public void onApplicationEvent(OrderEvent orderEvent){
//写发送短信的业务逻辑
}
}
@Component
public class WxListener implements ApplicationListener{
@Override
public void onApplicationEvent(OrderEvent orderEvent){
//写发送微信的业务逻辑
}
}
有的小伙伴项目中没有用到spring,完全可以自己手写一个类似spring的事件发布订阅机制。这是做架构设计必须具备的一个能力。
这篇我们不去手写这个,在以后的文章更新中再讲。
需求:
我们在做电商系统中会遇到计算商品的会员的价格和非会员的价格。
需求下来,我们一般这样写代码:
你会发现每一个计算价格的业务代码会很多,不仅仅是我写的那一行计算代码,并且你可能要加入超级vip的业务。
这样我们会怎么去即实现业务扩展,又降低耦合的呢?
好多人会这样改进:
public interface CalculateService(){
public double calculate(double fee);
public String userType();
}
@Service
public class VIPCalculateService implements CalculateService{
@Override
public double calculate(double fee){
//具体计算vip费用业务实现代码
}
@Override
public String userType(){
return "vip";
}
}
@Service
public class NormalCalculateService implements CalculateService{
@Override
public double calculate(double fee){
//具体计算普通用户费用业务实现代码
}
@Override
public String userType(){
return "normal";
}
}
这样写问题是不是真正解决了?
很明显,这些if else 让我感觉很难受。注入那么多service也不太好看。
研究spring 我们可以结合spring的应用:spring注入的高级注入功能。
//取代if else
@Autowired
//ListcalculateServices;
//MapcalculateServices;
public SaleService(ListcalculateServices){
for(CalculateService calculateService:calculateServices){
serviceHashMap.put(calculateService.userType(),calculateService);
}
}
public double sale(String userType,double fee){
CalculateService calculateService =calculateServices.get(userType);
If(null==calculateService ){
Return fee;
}
return calculateService.calculate(fee);
}
上面我们把有关计算的service 注入到一个serviceHashMap中,实现了取代if else效果。
还可以用applicateContext。我们知道实例话的bean都在springbean工厂中。我们可以从工厂中去拿我们所要的bean.
@Autowired
ApplicationContext applicationContext;
ApplicationContext.getBean(“VIPCalculateService”);
领取专属 10元无门槛券
私享最新 技术干货