iT邦幫忙

DAY 10
4

軟體路上不孤單,給我SSD,學習之路狂飆系列 第 10

軟體路上不孤單Day10-物件導向原則介紹3[SRP]

  • 分享至 

  • xImage
  •  

今天要介紹的是SRP(Single Responsibility Principle)單一責任原則!
一般我們在寫程式時最怕的不是寫不出來,而是「改程式找不到地方改」。或者,不管什麼問題都是改同一支class(也就是那支class非常的肥大)。

這就跟假設我們要到市政府辦事情時居然找不到承辦人一樣,或者什麼事都找同一個人(那個人應該會累灘了吧)一樣,都不是很好的歸納方式。根據書上對於SRP的定義是:

『你只有一個理由需要更改這個class,如果有一個以上的理由就表示:這個class負責超過一個以上的責任。』

在這個社會上,每個人都各司其職。如果你牙齒痛,你不會去找獸醫;如果你想查旅遊資訊,你不會來問IT邦的論壇問。相對的軟體系統也是一樣,系統裡的每一個物件都應該具有單一的責任,所有的物件服務都應該聚焦在單一個責任上面。所以也有人稱SRP為內聚力。

那如果責任很大呢?那就分攤一下啊~有句話說的好:『如果要把昨天的重擔和明天的煩惱都在今天一起背上,再強的人也會倒下』。咦~好像扯太遠了!反正就是要做好分類責任歸屬啦!不要通通都攬在一起!

那要怎麼判斷到底這個責任屬不屬於這個class呢?其實沒有絕對的方法,還是要靠我們的經驗和常識去判斷。不過根據『深入淺出物件導向』這本書上有提供一個方法,雖然不是能百分之百適用所有的案例,但也是個不錯的方法:

這個方法就是:用 「類別名稱」 來做類別名稱裡面的 「方法名稱」

舉個例子來說, 看下面這個 class diagram,然後試著用這個規則唸念看:

可以使用「機車」來「加速」
可以使用「機車」來「減速」
可以使用「機車」來「檢查汽油存量」
可以使用「機車」來「加油」
可以使用「機車」來「開大燈」
可以使用「機車」來「洗車」

是不是覺得『可以使用「機車」來「加油」』和『可以使用「機車」來「洗車」
』這兩個很怪呢?沒做,「加油」及「洗車」不是機車內建的功能,所以就需要將這兩個Method移到其他的地方去。

可是說真的,這個還是需要靠一點經驗和常識才會比較容易區別。這樣說還是會有一點「籠統」。如果說是電視遙控器呢?是不是要把功能都放在電視遙控器這個類別上呢?
當然不要阿,如果是電視遙控器,這時候可以使用Facade這個設計模式來配合使用,一定會更好!

當然,我相信這些例子一定還是有人會看得很模糊,所以如果有更好的例子或方法,歡迎大家分享一下囉!

文章導覽
全系列
上一篇
下一篇


上一篇
軟體路上不孤單Day09-物件導向原則介紹2[DRY]
下一篇
軟體路上不孤單Day11-物件導向原則介紹4[LSP]
系列文
軟體路上不孤單,給我SSD,學習之路狂飆31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
ted99tw
iT邦高手 1 級 ‧ 2012-10-03 22:36:16

沙發
淺顯易懂,讚啦!

pajace2001 iT邦研究生 1 級 ‧ 2012-10-03 23:59:11 檢舉

前輩您客氣了~~~開心

0
magician
iT邦研究生 2 級 ‧ 2012-10-04 09:26:50

漏了
關大燈();

這個class一定有bug...

我來亂的^__________@

ted99tw iT邦高手 1 級 ‧ 2012-10-04 09:33:50 檢舉

magician提到:
漏了關大燈();

自從當上少林寺方丈後,我兩顆大燈就關不掉了....臉紅

pajace2001 iT邦研究生 1 級 ‧ 2012-10-04 10:18:14 檢舉

所以方丈您應該常換大燈吧 噴鼻血

ted99tw iT邦高手 1 級 ‧ 2012-10-04 10:32:47 檢舉

pajace2001提到:
所以方丈您應該常換大燈吧

換是不換啦,但三不五時reset倒是需要的....臉紅

我要留言

立即登入留言