srp什么梗

首页 > 经验 > 作者:YD1662023-06-28 06:56:59

这是一个备受争议的原则,跟人吵架的时候这个是屡试不爽的一个梗。

为什么会备受争议呢?怎么就能吵起来呢?主要就是对职责如何定义,什么是类的职责,以及怎么划分类的职责。

​ 举个例子:我们新职课的老师对学生有很多的工作要做:例如了解个人信息、每天的学习情况、记录考勤;回答学 生问题,帮助解决bug,重难点串讲;行业经验分享等。

​ 如果将这些工作交给一位老师负责显然不合理,正确的做 法是现在我们新职课的模式:班主任负责日常工作,技术 辅导老师负责技术辅导;企业师傅负责行业经验分享等。

一、定义

单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规 定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)。

该原则提出对象不应该承担太多职责,如果一个对象承担了太多的职责,至少存在以下两个缺点:

(1)一个职责的变化可能会削弱或者抑制这个类实现其他职责的能力;

(2)当客户端需要该对象的某一个职责时,不得不将其他不需要的职责全都包含进来,从而造成冗余代码或代码 的浪费。

二、举个例子

public interface IPhone{ //拨通电话 public void dial(String phoneNumber); //通话 public void chat(Object o); //通话完毕,挂断电话 public void hangup(); }

以上是符合单一职责原则的吗?说白了是一个接口只负责一件事情吗?是只有一个原因引起变化么?

​ 好像不是哦! 其实他负责了两个内容:1、协议管理,2、数据传送。

​ dial()和hangup()两个方法实现的是协议管理;chat()方法负责的是数据的传送

​ 那么协议的改变可能引起接口或者 实现类的变化;同样数据传送(电话不仅可以打电话,还能上网)的变化也可能会引起接口或实现类的变化。两个 原因都能引起变化,而两个职责直接是互不影响的,所以可以考虑拆分为两个接口。

public interface IPhone{ } public interface IConnectionManager extends IPhone{ //拨通电话 public void dial(String phoneNumber); //通话完毕,挂断电话 public void hangup(); } public interface IDataTransfer extends IPhone{ //通话 public void chat(IConnectionManager con); }

三、优点

单一职责原则的核心就是控制类的粒度大小、将对象解耦、提高其内聚性。如果遵循单一职责原则将有以下优点。

单一职责原则是最简单但又最难运用的原则,需要设计人员发现类的不同职责并将其分离,再封装到不同的类或模 块中。而发现类的多重职责需要设计人员具有较强的分析设计能力和相关重构经验。

PS:单一职责同样也适用于方法。一个方法应该尽可能做好一件事情。如果一个方法处理的事情太多,其颗粒度会 变得很粗,不利于重用。

但是原则是死的,人是活的。所以有些时候我们可以为了效率,牺牲一定的原则性。

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.