确定一个类是否具有单一职责

本文探讨了面向对象设计中单一职责原则的应用,通过分析Gear类的功能,讨论了如何判断一个类是否承担了过多职责,并提出了提高类内聚性的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章摘录自《面向对象设计实践指南Ruby语言描述》,作者:【美】Sandi Metz著  张雪平 彭晓东 译。


如何才能确定Gear类是否包含有应该属于其他某个地方的行为呢?有一种方法是假设它存在意识,然后质询它。如果将它的每个方法都改述为一个问题,那么提问应该会行之有效。例如,“齿轮先生,请问你的比率是多少呀?”这似乎很合情理;“齿轮先生,请问你的齿轮英寸数是多少呢?”则有些不靠谱;而“齿轮先生,请问你的轮胎(尺寸)是多少呀?”简直就是荒唐可笑。

请接受这样的想法,即“你的轮胎是什么”就是一个会被正当提出的问题。从Gear类的内部来看,tire感觉上可能与ratio和gear_inches不太一样,但这并不重要。从其他所有对象的视角来看,Gear能响应的所有内容只不过是一条消息而已。如果Gear响应它,那么便有人发送它。当Gear发生变化时,这个发送者便会感到莫名的诧异。

另一种策底弄清某个类实际上做什么的方法是:尝试着用一句话来描述它。请记住,一个类应该尽可能做最小用途事情。这件事情应该描述起来很简单。如果你能想出的最简单描述使用了“和”这样一个字,那么这个类便有可能有多种职责。如果它使用了“或”这样一个字,那么这个类便具有了多种职责,只是它们的关系没那么紧密。

OO设计者使用了“内聚”(cohesion)一词来描述这个概念。当某个类的所有内容都与其中心目标相关联时,就可以说这个类属于“高内聚”(highly cohesive),或者具有单一职责。单一职责原则(Single Responsibility Principle,SRP)源于Rebecca Wirfs-Brock和Brian Wilkerson的“职责驱动设计”(Responsibility-Driven Design,RDD)思想。他们认为“一个类有责任实现其目标。”SRP并不是要求一个类非常狭窄地只做一件事情,也不是要求这个类只为某种吹毛求疵的原因而进行更改。与之相反,SRP要求一个类是内聚的——这个类做的所有事情都与其目标高度相关。

要如何描述Gear类的职责呢?描述成“计算两个带齿链轮之间的比率”怎么样?如果真的是这样描述,那么这个类便会跟当前的状态一样,要完成太多的事情。描述成“计算自行车上齿轮的影响”如何呢?如果这样也可以的话,那么gear_inches算是落到了实处,但tire尺寸仍然不太靠谱。

这个类让人感觉不太对劲。Gear拥有多种职责,但具体应该做什么却并不明显。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值