如何定义一个类——单一职责原则

单一职责原则:就一个类而言,应该仅有一个引起他变化的原因。

1 一个老师类的例子

或者说在外部看来,一个类只应该能看到它的类的相关功能。如老师类只应该负责教授知识,备课,但是不应该负责开车。

切合实际的说一个TaskService类不应该包含处理时间的类,他可以是private的,但是肯定不能是public的。
这里引出另一个角度

2 如何看待一个类?

2.1通常的看法

通常的看法是,类是由成员属性和成语方法组成的数据结构

或者是现实事物的抽象
如对现实中的人抽象出Person,他具备人的基本属性和基本行为

2.2另外一个角度

但是另外一个角度来看,类是一组职责的集合。类负责他所代表的抽象的职责。
如老师类,就是上课,下课,教书,备课等职责的集合,他对外提供这些接口。姓名年龄这些通常是private封装的。

举日常开发的例子
如任务类,就是查看任务,发布任务,撤回任务,处理任务,完成任务,关闭任务等职责集合。
虚线表示依赖关系,可以认为是使用关系,任务服务类依赖于任务实体类。

如果这里面有个时间处理的方法,那么这个方法肯定是不应该对外public的,如果这个方法比较独立的话,可以封装在日期类中,再通过依赖引入进来。

3 高内聚低耦合

提到单一职责的时候经常提到高内聚低耦合。
内聚性是 类中操作之间联系的紧密程度。
低内聚就是很多功能互不相关,比如时间处理功能和上课功能,就是风马牛不相及的两个功能。高内聚就是联系紧密。
耦合性是 类之间联系的紧密程度。
或者说依赖程度。低耦合就是互相之间的依赖小。
低耦合,首先所有类都负责自己的职责,不同职责由不同类去维护,所以类与类之间的耦合是低的
高内聚,一系列职责由单个类去维护,所有相似的职责内聚在一个类中,这个就是高内聚
一类职责应该集中在一个类中,而不是分散在不同的类中,而不同的职责应该准确划分到不同的类中。
高内聚低耦合的一个反面例子是我在维护的一个老项目。。
一个功能的几个部分被分在了不同的地方,sql在jsp上能看到,没有控制层,一个方法缠缠绕绕出现在了多个类中,而且这个划分的几个部分大多数是没有复用性的。

我们常说有的框架重,让开发者的类和框架类耦合在了一起,开发者的类必须继承框架的某个基类,一旦基类进行了版本升级,那么可能对整个系统都造成影响。

问答部分

Q 我有一个任务类,它有一个发布任务和撤回任务,他是不是单一职责的
A:是的,这两个都属于任务类的职责。
Q 单一职责是仅有一个引起类变化的原因,这里发布任务和撤回任务有变动的话类不是都要变动吗
A:原因是指一系列职责。
Q 如果任务类里包含了一个对外开放的时间处理接口,这个任务类是单一职责吗
A:不是,时间不属于任务处理系列的职责,他应该被设置成private或者放到DateUtil中。
Q 任务处理类中定义时间接口有什么坏处吗
A:

  • 首先时间处理不属于任务处理类的职责
  • 其次时间处理处理接口放在任务处理类中,正常情况下不会把所有时间处理的接口都放在任务处理类里,那么时间处理的职责就分散在了不同的类中,违反了高内聚;由于时间处理接口分布在不同的类中,这些类的职责耦合在了一起,违反了低耦合
  • 当第三方调用任务处理类的时候会不明所以,为什么这里会有一个时间接口,不确定这个方法能不能调用,后期会不会有改动。
  • 一旦时间接口改动,要考虑到是否影响到任务类中的其他接口,需要考虑很多,而如果内聚在时间处理类中,相对影响要小。
    如果用任务处理类和时间接口做例子比较不明显,我们换下面这个例子就立马可以发现问题了,他们本质是一个问题,只是错误程度不同:
    在老师类中定义一个清除系统缓存的接口

原文地址:http://blog.51cto.com/13985113/2310893

时间: 2024-08-28 13:22:55

如何定义一个类——单一职责原则的相关文章

单一职责原则进阶——多个地方的不同见解和解读

首先是定义 单一职责原则:一个类应该只有一个发生变化的原因英文名叫Single Responsibility Principle,以下简称为SRP 下面我们从三本著作中去解读这个单一职责这三本著作分别是<深入浅出面向对象分析与设计>.<设计模式解析>和<敏捷开发:原则.模式与实践>. 深入浅出面向对象分析与设计 首先他对SRP的解读稍有不同: 单一职责原则:系统里的每一个对象应该具有单一职责,所有对象的服务都应该聚焦在实现该职责上. 且他认为 内聚性是SRP的另一个名称

设计模式六大原则(1):单一职责原则

单一职责原则 定义: 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障. 解决方案: 遵循单一职责原则.分别建立两个类T1.T2,使T1完成职责P1功能,T2完成职责P2功能.这样,当修改类T1时,不会使职责P2发生故障风险:同理,当修改T2时,也不会使职责P1发生故障风险. 单一职责原则是最简单的面向对象设计原则,它用于控制类的粒

面向对象设计原则之单一职责原则

单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小.单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因. 单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小,而且一个类承担的职责过多,就相当于将这些职责耦合在一起,当其中一个职责变化时,可能会影响其他职责的

设计模式(三)面向对象设计原则之单一职责原则

引用自:http://blog.csdn.net/lovelion  作者:刘伟 单一职责原则是最简单的面向对象设计原则,它用于控制类的粒度大小.单一职责原则定义如下: 单一职责原则(Single Responsibility Principle, SRP):一个类只负责一个功能领域中的相应职责, 或者可以定义为:就一个类而言,应该只有一个引起它变化的原因. 单一职责原则告诉我们:一个类不能太"累"!在软件系统中,一个类(大到模块,小到方法)承担的 职责越多,它被复用的可能性就越小,而

6大设计原则之单一职责原则

单一职责原则 如果有一个用户管理类,类图如下 我想,任谁也能看的出这个接口设计的有问题,用户的属性和用户的行为没有分开,应该把用户的信息抽取成一个业务对象,把用户的行为抽取成一个业务对象,按照这个思路对类图进行修正,如下图所示 其实,在实际使用中我们更倾向于使用两个不同的接口: 一个IUserBO,一个IUserBiz 单一职责原则定义 应该有且仅有一个原因引起类的变更 单一职责原则的好处: 类的复杂性降低,实现什么职责都有清晰明确的定义 可读性提高,复杂性降低了,可读性当然就提高了 可维护性提

【设计模式之禅】第1章 单一职责原则

1.1 我是"牛"类,我可以担任多职吗 SRP 单一职责原则的英文名称是Single Responsibility Principle,简称是SRP. RBAC模型(Role-Based Access Control)基于角色的访问控制        通过分配和取消角色来完成用户权限的授予和取消,使动作主体(用户)与资源的行为(权限)分离 单一职责原则的定义是:应该有且仅有一个原因引起类的变更. 1.2 绝杀技,打破你的传统思维 SRP的原话解释是:        There shou

敏捷软件开发 – SRP 单一职责原则

SRP:单一职责原则  一个类应该只有一个发生变化的原因. 为何把两个职责分离到单独的类中很重要呢?因为每一个职责都有变化的一个轴线.当需求变化时,该变化会反映为类的职责的变化.如果一个类承担了多于一个的职责,那么引起它变化的原因就会有多个. 如果一个类承担的职责过多,就等于把这些职责耦合在了一起.一个职责发生变化可能会削弱或抑制这个类完成其他职责的能力.这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏. 有两个不同的应用程序使用Rectangle类.一个应用程序是有关计算几何

单一职责原则

什么是单一职责原则 什么是单一职责原则? 单一职责原则的英文名称是Single Responsibility Principle,简称SRP.SRP的原话解释是:There should never be more than one reason for a class to change. 也就是说一个类,只有一个引起它变化的原因.应该只有一个职责.每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起. 这会导致脆弱的设计.当一个职责发生变化时,可能会影响其它的职责

面向对象编程6大设计原则:单一职责原则

单一职责原则(Single  Responsibility Principle)简称SRP原则. 定义 应该有且仅有一个原因引起类的变更. 优点 可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多: 提高类的可读性,提高系统的可维护性: 变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响. 说明 单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都适用单一职责原则: 单一职责原则要根据项目的实际情