欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-06 22:53:16
...

本文转载自 码农翻身 

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

我就是你们最常用的分支,名字叫做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语句在新的方法中又出现了,如果再增加新的方法,if语句还会重复 !

Bill也在一旁帮腔: 是时候用多态了。

于是张大胖定义了一个抽象类,然后让两个新的子类去继承,就把我从类中给彻底移除了:

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

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这个类中, 张大胖写下了下面的代码:

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

我哈哈大笑,我只是从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的一个重大作用,喜不自胜。

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

Spring接管了对象的创建,不用在应用代码中写if语句创建对象了,但是在业务逻辑中,if语句还是跑不掉的,我下次再说说发生在那里的故事吧。

后记1:多态虽然好用,但也不能滥用!

后记2:本文受到这个视频的启发而写:https://www.youtube.com/watch?v=4F72VULWFvc

相关标签: 重构