前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >创建对象时If语句该放哪?

创建对象时If语句该放哪?

作者头像
chenchenchen
发布2019-09-02 17:04:46
8260
发布2019-09-02 17:04:46
举报
文章被收录于专栏:chenchenchenchenchenchenchenchenchen

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

public class Customer{
    private int type;
    ......
    void validate(){
        if (type == Employee){
            //针对内部员工做处理
        }
        else if(type == Partner){
            //如果是合作伙伴,做另外的处理
        }
        ......         
     }
     float getDiscount(){
        if (type == Employee){
            //针对内部员工做处理
        }
        else if(type == Partner){
            //如果是合作伙伴,做另外的处理
        }
        ......         
     }
}

这一次,张大胖心里打鼓了: 同样的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这个类是这样的:

public class OrderProcessor(){
    public void createOrder(...){
        Customer customer = new Customer(type,id);
        ......
    }
}

然后张大胖改成了下面的代码:

public class OrderProcessor(){
    public void createOrder(...){
        Customer customer = null;
        if (type == Employee){
            customer = new Employee(id);
        }
        else if(type == Partner){
            customer = new Partner(id);
        }
        ......         
    }
    public Order getOrder(...){
        Customer customer = null;
        if (type == Employee){
            customer = new Employee(id);
        }
        else if(type == Partner){
            customer = new Partner(id);
        }
        ......         
    }
}

我哈哈大笑,我只是从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语句还是跑不掉的,我下次再说说发生在那里的故事吧。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月13日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档