我找了很多网站
都将解释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移交到其他物件处理
但是....
1. 假设Automible有
body, front-left_tire, front_right_tire, back-left-tire, back_right_tire
changeTires()为了要change车子的轮胎
势必要改变其四个轮胎
我猜写法是
changeTires(Automobile au, Tire[*] tires)
au.set_front_left_tire(tires[0]);
au.set_front_right_tire(tires[1]);
....
这样为什么不直接把changeTires这件事直接委派给Automible去做
同样的道理, 如果其他drive, wash等method, 需要get or set
来知道Automible的细节, 那何不直接把这样工作交给Automible做
2. 这样好像又回到procedural programming
data跟function是分开的, data当作function的input后, 由function来处理data
在这里, Automobile是要处理的data
而Driver, Carwash, Mechanic则有点像是处理data的function
再举个例子:
今天我们需要一个铁路线路网, 上面有多条线路, 多个车站
且在给予起点和终点后, 可以找出一个起点到终点的path, 并印出来
如果是我来设计的话
class会有Subway, Line, Station, Route
Subway.find(Sation s, Sation t)后, return 一个Route
Route.print()印出path
但是书上的方法,
class会有Subway, Connection, Station, Printer
(Line, Connection的差异先不讨论)
他用Printer来印一个List route(有Connection跟Station)
于是, Printer在print的method里
必须要不停的用route.getXX(), station.getXX() ......
这感觉很像是Printer在处理一个Data
为什么不直接把print的工作给statoin, 给route呢
java Exception 不是也有 printStackTrace, 并没有说特别把print的工作交给别人啊?
上面是增加新的物件来处理
我也有找到另一个方法, 是增加interface
http://www.codingefficiency.com/2009/07/18/
solid-s-single-responsibility-principle/
http://0rz.tw/QP6hs (缩过的网址)
不过仍然让人很难分辨responsibility
说严格一点, 好像每个method, 都有理由改变
但是又不可能把每个method都新增一个物件去处理这项功能
希望有人可以帮忙解答
谢谢