If语句:你们到底想把我放到哪儿?
本文转载自 码农翻身
顺序、循环、分支,是你们所说的程序的三个基本元素。
我就是你们最常用的分支,名字叫做if语句。
今天上午,菜鸟张大胖写了一段代码:
public class Customer{
private int type;
......
void validate(){
if (type == Employee){
//针对内部员工做处理
}
else if(type == Partner){
//如果是合作伙伴,做另外的处理
}
}
}
看到我没有? 在那个validate函数中, if ...... else if ,那就是我。
张大胖写这段代码的时候其实犹豫了一下, 因为他联想到之前看到的面向对象的文章: 出现了if语句, 可以用多态来消除。
这里要不要试用多态呢?
他把疑惑给师傅Bill讲了一下, Bill说道:“暂时不用,这里的逻辑太简单了,用if else 就可以搞定,使用多态完全是多此一举!”
到了下午,菜鸟张大胖写了一个新函数: getDiscount(), 把我if ...else if 又写了一遍:
这一次,张大胖心里打鼓了: 同样的if语句在新的方法中又出现了,如果再增加新的方法,if语句还会重复 !
Bill也在一旁帮腔: 是时候用多态了。
于是张大胖定义了一个抽象类,然后让两个新的子类去继承,就把我从类中给彻底移除了:
public abstract class Customer{
abstract void validate();
abstract float getDiscount();
......
}
public class Employee extends Customer{
void validate(){
//对员工类型的Customer做处理
}
float getDiscount(){
//对员工类型的Customer做处理
}
}
public class Partner extends Customer{
void validate(){
//对合作伙伴做处理
}
float getDiscount(){
//对合作伙伴做处理
}
}
我很生气,这些代码中连一个If 都没有,业务逻辑都被分散到了各个具体的类中去了!
可是我转念一想: 虽然在Customer中消除了if语句,可是你总得创建具体的Customer对象吧! 创建的时候不还得使用If else ?
果然, 在OrderProcessor这个类中, 张大胖写下了下面的代码:
我哈哈大笑,我只是从Customer类被转移了到了OrderProcessor类而已,现在的代码更加凌乱了。
Bill 大惊:“大胖,可不能这么做啊,这么做重复代码更要命了,如果增加一个新的Customer的子类, 那得改多少地方啊!”
张大胖说:“那我把这些可恶的If 移到哪里去?”
“我们要提倡把对象和对象的创建分开! 对象只负责业务逻辑,对象的创建由factory, builder这些类来完成。”
public Customer createCustomer(int type,String id){
if(type == Employee){
return new Employee(id);
}
if(type == Parnter){
return new Partner(id);
}
......
}
Bill这个办法好厉害,一下子就把我集中关到了“工厂”小黑屋,无法分散到个各类了。
“奥,这就是设计模式中的简单工厂吧!原来集中式创建对象,好处很大啊!” 张大胖恍然大悟。
“不过,” 张大胖开始举一反三,“如果对象之间的依赖关系很复杂呢? 比如A依赖B, B依赖C..... 用factory的方式写起来也很麻烦啊!”
“你想想,能不能用声明式的方式来描述这种依赖关系,然后由某个程序自动地把这些对象给装配好?” Bill开始循循善诱。
我觉得大事不好,他们要把我放到某个通用的程序中去了。
“明白了,我们用的Spring就起到了这个作用, 在Spring当中,只要用声明的方式表达对象之间的依赖,什么构造器注入,setter方法注入,autowired等等, 然后Spring就可以自动把这些对象给装配起来,供我们使用,就不用担心创建对象的问题了。 ” 张大胖突然顿悟Spring的一个重大作用,喜不自胜。
Spring接管了对象的创建,不用在应用代码中写if语句创建对象了,但是在业务逻辑中,if语句还是跑不掉的,我下次再说说发生在那里的故事吧。
后记1:多态虽然好用,但也不能滥用!
后记2:本文受到这个视频的启发而写:https://www.youtube.com/watch?v=4F72VULWFvc
上一篇: 数据库,数据表的创建及数据表的约束
下一篇: 代码重构的常用方法(C++实现)
推荐阅读