作者qrtt1 (null)
看板OOAD
标题Re: [概念] single responsibility principle
时间Sun Jul 4 11:20:44 2010
※ 引述《hsnucsc (hsnugo)》之铭言:
: 我找了很多网站
: 都将解释SRP成: 每一个物件, 应该要只有单一的responsibility
: 而将responsibility解释成: 只有一个理由去改变物件
: 但是我还是觉得responsibility这个词很模糊
: (如果直接翻译成中文, "责任", 仍然很难知道这个责任的大小)
: 以书上的例子而言
: Automobile 车子有很多功能
: start()
: stop()
: changeTiles(Tile [*])
: drive()
: wash()
: checkOil()
: getOil()
: 应该要被分解成
: Automobile
: start()
: stop()
: getOil()
: Driver
: drive(Automobile)
: Carwash
: wash()
: Mechanic
: changeTires(Automobile, Tire[*])
: checkOil(Automible)
: 有一些method移交到其他物件处理
[恕删]
: 不过仍然让人很难分辨responsibility
: 说严格一点, 好像每个method, 都有理由改变
: 但是又不可能把每个method都新增一个物件去处理这项功能
: 希望有人可以帮忙解答
: 谢谢
弟刚好看到同一本书了,虽然这讨论已经有一阵子了。
我想试着把书上较完整的说法写下来。
最初 Automobile 类别含有下列功能:
class Automobile {
public void start();
public void stop();
public void changeTires(Tire[] tires);
public void drive();
public void wash();
public void checkOil();
public int getOil();
}
书上说 (深入浅出软体开发 中文版 P156)
大多数的时间,你可以利用简单的测试,找出未使用 SRP 的类别:
1. 在一张纸上,写下几行像这样的东西:
The [ ] [ ] itself。
对你正在测试 SRP 的类别里的每一个方法,
你应该有一行像这样的东西。
2. 在每一行的第一个空格里,写下类别名称;
在第二个空格里,写下类别的方法之一。
3. 大声把每一行读出来(你可能得加一点字才会好念)。
你所念出来的东西合理吗?
你的类别真的具有该方法所指的责任吗?
万一你所出来的东西不合理,你的方法可能违反 SRP。
该方法很可能属於别的类别...考虑移掉它吧。
==================================================
SRP 分析: Automobile
The Automobile start[s] itself.
The Automobile stop[s] itself.
(汽车负责启动与停止,很合理,那是汽车的功能。)
The Automobile changesTires itself.
(汽车不负责自己换轮贻)
The Automobile drive[s] itself.
(
这一个有点吊诡...我们认为虽然可以启动与停止它自己,
但驾汽车实际上是驾驶人的责任。
)
The Automobile wash[es] itself
The Automobile check[s] oil itself.
(汽车不负责自己清洗自己,或自己换机油。)
The Automobile get[s] oil itself.
(汽车能传回剩余油量)
==================================================
我觉得书上提供的方量很简单易用,
至少比起直接看 SRP 的定义,
用初学者较无系统化地步骤去思索:
"哪些功能在类别内可能是被错置的?",来得有效率。
确实每个 method 都可能存在改变的理由,
但在明辨出"单一责任"区後,只为负责任而改变。
事情会单纯许多,一但类别承担较多的责任,
那改变的理由、机率就相对增加了不是吗 :)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.165.131
※ 编辑: qrtt1 来自: 140.112.165.131 (07/04 11:24)
1F:推 H45 :这麽久的文章也被你挖出来回 XD 07/04 12:35
2F:→ qrtt1 :因为觉得书上的内容也很值得说出来啊 ha ha 07/04 14:11
3F:推 H45 :关於 a car drives itself 的部分,如果车子会认惊驶 07/05 03:53
4F:推 H45 :人的话,那麽就需要考量 a driver drives a car 的设 07/05 03:54
5F:推 H45 :计。不过嘛,在现实生活中,车经常是不认惊驶员的, 07/05 03:55
6F:推 H45 :不管是谁开车,"drive" 这个行为是不变的,这时候就 07/05 03:55
7F:推 H45 :可以说 a car drives itself 07/05 03:56
8F:→ qrtt1 :惊驶!!! 听起来好有趣呦 07/05 09:23
9F:→ qrtt1 :我在抄书时, 想到的是自动驾驶技术。 07/05 09:25
10F:→ qrtt1 :如果醉了车子可以自己载你回家就太棒了 XD 07/05 09:25
11F:→ H45 :虽然我第一时间也是像楼上这样想,但是後来觉得说不 07/05 11:18
12F:→ H45 :太通 XD 最後我分析 "drive" 的行为後,认为三楼的说 07/05 11:19
13F:→ H45 :法比较合理些 :D 07/05 11:19
14F:→ qrtt1 :可是我觉得五楼比较专业耶 >"< 07/05 11:23
15F:→ H45 :我是指三到七楼这整段啦 XD 07/05 11:34
16F:→ rofellosx :自动驾驶并无不通吧 不须迁就现实.... 07/06 08:15
17F:→ qrtt1 :是都能通,只是缺少了买货人的决策orz 07/06 08:17
18F:→ qrtt1 :让我想起了最近读 agile 的书,"与客户一起做决定" 07/06 08:18
19F:→ qrtt1 :"this is not your business" 让能做决策的人做呗>"< 07/06 08:19