您的位置:首页 > 其它

If语句:你们到底想把我放到哪儿?

码农翻身 2019-06-11 08:30 99 查看 https://www.geek-share.com/det

顺序、循环、分支,是你们所说的程序的三个基本元素。


我就是你们最常用的分支,名字叫做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



码农翻身公众号开放投稿,可能是全网最高片酬:

用故事讲技术 ,稿费1000

技术/职场/感悟/面试等,稿费700

翻译类文章,每千字200

详情猛戳: 可能是全网最高片酬,速来!


标签: