软件设计原则之《单一职责原则》

    我们在来说一下单一职责原则。教课书给出的定义是:不要存在多于一个导致类变更的原因。对于这个定义的补充是一个类/接口/方法只负责一项职责。其实如果你不太理解这个单一职责原则的话,仅仅凭借这几句话很难去理解。

    优秀的前辈告诉我们单一职责原则的优点是:可以降低类的复杂度,提高类的可读性;提高系统的可维护性,降低变更引起的风险。其实如果没有在项目实践中经历过,很难理解透前辈们留下的忠言。

    下面我们通过一个一些简单的代码,更好的理解这一原则。代码如下:

package com.zybank.design.principle.singleresponsibility;

public class Bird {
    public void mainMoveMode(String birdName){
        System.out.println(birdName+"用翅膀飞");
    }
}
package com.zybank.design.principle.singleresponsibility;

public class Test {
    public static void main(String[] args){
        Bird bird = new Bird();
        bird.mainMoveMode("大雁");

    }
}

 在创建了一个Bird类,然后我在Test类中调用其中的方法。现在如果我传入一个鸵鸟参数,那怎么办?我们是不是要拓展Bird类如下:

package com.zybank.design.principle.singleresponsibility;

public class Bird {
    public void mainMoveMode(String birdName){
        if("鸵鸟".equals(birdName)){
            System.out.println(birdName+"用脚走");
        }else{
            System.out.println(birdName+"用翅膀飞");
        }
    }
}

如果我们这样拓展,就不是遵循单一职责原则。为了更好的遵循单一职责原则,我们可以这样拆分Bird类:

package com.zybank.design.principle.singleresponsibility;

public class FlyBird {
    public void mainMoveMode(String birdName){
        System.out.println(birdName+"用翅膀飞");
    }
}
package com.zybank.design.principle.singleresponsibility;

public class WalkBird {
    public void mainMoveMode(String birdName){
        System.out.println(birdName+"用脚走");
    }
}
package com.zybank.design.principle.singleresponsibility;

public class Test {
    public static void main(String[] args){
        FlyBird flyBird = new FlyBird();
        flyBird.mainMoveMode("大雁");

        WalkBird walkBird = new WalkBird();
        walkBird.mainMoveMode("鸵鸟");
    }
}

我们在应用层做好判断传入的是大雁还是鸵鸟。以上这些我们是从的类的角度遵循单一职责原则,下面我们从接口的角度遵循该原则,我们有一个课程接口如下:

package com.zybank.design.principle.singleresponsibility;

public interface Course {
    String getCourseName();
    byte[] getCourseVideo();
    
    void studyCourse();
    void refundCourse();
}

通过观察该接口中的方法,我们可以发现,该接口主要有两个职责:一个职责是获取课程的内容,一个是管理课程。根据单一职责原则,我们需要将这个接口拆开如下:

package com.zybank.design.principle.singleresponsibility;

public interface CourseManager {
    void studyCourse();
    void refundCourse();
}
package com.zybank.design.principle.singleresponsibility;

public interface CourseContent {
    String getCourseName();
    byte[] getCourseVideo();
}

我最后在从方法的层面看单一职责原则:

 package com.zybank.design.principle.singleresponsibility;

public class User {
    public void updateUserInfo(String userName,String address){
            userName = "张三";
            address = "中原银行";
            
    }
    
}

这里有一个updateUserInfo()方法,这个方法的职责是更新用户名和地址,按照单一职责原则,该方法被拆分成如下:

package com.zybank.design.principle.singleresponsibility;

public class User {
    public void updateUserName(String userName){
        userName = "张三";
    }
    public void updateUserAddress(String address){
        address = "中原银行";
    }


}

    单一职责原则在很多项目开发中很多类,接口,方法都不符合该要求。有句话叫理想很丰满显示很骨感啊。因为我们在项目开发的过程中受很多因素的影响例如:项目的规模、项目的周期、技术人员的水平,项目是否有deadline等。如果我们在项目中没有很好的面向接口编程,但是很好的遵循了单一职责原则,我们的项目的类会爆炸的。总结,我们在实际的项目开发中我们的接口和方法一定要做到单一职责,类的单一职责看实际情况吧。

 

-------------------------------------------------------------------------

中原银行总行科技岗内推,加我微信:18236913621。更新时间:2018年12月14日。

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值