有了空间和域名 网站容易做吗,长春市快速建站网站,网站运营与网络营销,大良网站建设公司目录1 单一职责原则介绍2 单一职责原则应用1 单一职责原则介绍
单一职责#xff08;Simple Responsibility Pinciple#xff0c;SRP#xff09;是指不要存在多于一个导致类变更的原因。假设我们有一个 Class 负责两个职责#xff0c;一旦发生需求变更#xff0c;修改其中…
目录1 单一职责原则介绍2 单一职责原则应用1 单一职责原则介绍
单一职责Simple Responsibility PincipleSRP是指不要存在多于一个导致类变更的原因。假设我们有一个 Class 负责两个职责一旦发生需求变更修改其中一个职责的逻辑代码有可能会导致另一个职责的功能发生故障。这样一来这个 Class 存在两个导致类变更的原因。如何解决这个问题呢
我们就要给两个职责分别用两个 Class 来实现进行解耦。后期需求变更维护互不影响。这样的设计可以降低类的复杂度提高类的可读性提高系统的可维护性降低变更引起的风险。总体来说就是一个 Class/Interface/Method 只负责一项职责。
2 单一职责原则应用
接下来我们来看代码实例还是用课程举例我们的课程有直播课和录播课。直播课不能快进和快退录播可以可以任意的反复观看功能职责不一样。还是先创建一个 Course 类 public class Course {public void study(String courseName){if(直播课.equals(courseName)){System.out.println(不能快进);}else{System.out.println(可以任意的来回播放);}}}看代码调用 public static void main(String[] args) {Course course new Course();course.study(直播课);course.study(录播课);}
从上面代码来看Course 类承担了两种处理逻辑。假如现在要对课程进行加密那么直播课和录播课的加密逻辑都不一样必须要修改代码。而修改代码逻辑势必会相互影响容易造成不可控的风险。我们对职责进行分离解耦来看代码分别创建两个类 ReplayCourse 和 LiveCourse
LiveCourse 类 public class LiveCourse {public void study(String courseName){System.out.println(courseName 不能快进看);}}ReplayCourse 类 public class ReplayCourse {public void study(String courseName){System.out.println(可以任意的来回播放);}}
调用代码 public static void main(String[] args) {LiveCourse liveCourse new LiveCourse();liveCourse.study(直播课);ReplayCourse replayCourse new ReplayCourse();replayCourse.study(录播课);}业务继续发展课程要做权限。没有付费的学员可以获取课程基本信息已经付费的学员可以获得视频流即学习权限。那么对于控制课程层面上至少有两个职责。我们可以把展示职责和管理职责分离开来都实现同一个抽象依赖。设计一个顶层接口,创建 ICourse 接口 public interface ICourse {//获得基本信息String getCourseName();//获得视频流byte[] getCourseVideo();//学习课程void studyCourse();//退款void refundCourse();}我们可以把这个接口拆成两个接口创建一个接口 ICourseInfo 和 ICourseManager ICourseInfo 接口 public interface ICourseInfo {String getCourseName();byte[] getCourseVideo();}ICourseManager 接口 public interface ICourseManager {void studyCourse();void refundCourse();}
来看一下类图 下面我们来看一下方法层面的单一职责设计。有时候我们为了偷懒通常会把一个方法写成下面这样 private void modifyUserInfo(String userName,String address){userName Oldlu;address Shandong;}还可能写成这样 private void modifyUserInfo(String userName,String... fileds){userName Oldlu;
// address Shandong;}private void modifyUserInfo(String userName,String address,boolean bool){if(bool){}else{}userName Oldlu;address Shandong;}显然上面的 modifyUserInfo()方法中都承担了多个职责既可以修改 userName,也可以修改 address甚至更多明显不符合单一职责。那么我们做如下修改把这个方法拆成两个 private void modifyUserName(String userName){userName Oldlu;}private void modifyAddress(String address){address Shandong;}这修改之后开发起来简单维护起来也容易。但是我们在实际开发中会项目依赖组合聚合这些关系还有还有项目的规模周期技术人员的水平对进度的把控很多类都不符合单一职责。
但是我们在编写代码的过程尽可能地让接口和方法保持单一职责对我们项目后期的维护是有很大帮助的。