• If语句:你们到底想把我放到哪儿?
  • 发布于 2个月前
  • 211 热度
    0 评论
  • 李宏荣
  • 0 粉丝 39 篇博客
  •   
顺序、循环、分支,是你们所说的程序的三个基本元素。
我就是你们最常用的分支,名字叫做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语句还是跑不掉的,我下次再说说发生在那里的故事吧。
用户评论