2012年3月13日

白話- OO設計原則 (SOLID原則) - 附生活實例

世界最遙遠的開發目標,不是老闆的天馬行空,不是技術的困難程度,而是你以為就要完成了,需求卻仍然改個不停。   - - -血汗工程師的心聲

以下的5個原則,也稱為SOLID原則,是用來檢視當系統需求改變時,你是否能快速、安心的面對。是否應該引用Design Pattern,也可用目前是否符合這些原則來做檢視。

這些原則間並非完全互斥,即當你發現違反了某個原則時,通常也會違反其他原則。而其中最重要的便是OCP原則。


1. SRP:Single Responsibility Principle(單一職責)

定義:一個class應該只有一個需要改變的原因。
There should never be more than one reason for a class to change.

白話:一個class只作一件事。

問題:
1)到底切多細,很難一開始就知道。
2)切太細造成複雜度過高。



2. OCP: Open Closed Principle(開放封閉)

定義:軟體設計,應該對擴充開放,對修改封閉。
Software entities like classes, modules and functions should be open for extension but closed for modifications.

白話:軟體要很容易擴充功能,且擴充時原有的code都不需修改。

重要性:OCP是OOD諸多主張的核心。

生活實例:
某情聖:『我永遠在電話中叫女朋友"寶貝",這樣怎麼換人或劈腿都不會穿幫』





3. LSP : Liskov Substitution Principle(Liskov替換)

定義:子類必須能夠替換其父類別。
Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.

白話:設計父類別時,只把所有的子類都有的東西放進來。

生活實例:
女兒問你『把拔,什麼是鳥類?』
你很得意的說『很簡單啊,就是會的動物嘛!』 (把『會飛』加到『鳥類』這個概念中)
接著打開鳥類大百科開始解說:
『就像這個老鷹就是會飛的動物』
『這個烏鴉也是會飛的動物 』
『還有.........這個... 企鵝 ......?』@ @|||


PS.『不會飛的鳥』請見Wiki...

與OCP關係:LSP也是為了確保子類別擴充時不會違反OCP 。



4. ISP:Interface Segregation Principle(介面隔離)

定義:客戶(Client)只要依賴它們所需的介面
Clients should not be forced to depend upon interfaces that they don't use.

白話:設計介面也盡量簡單,別把不相關的東西放進來。

生活實例:
業務員:『太太!你看我們最新的遙控器,可以遙控電視、冷氣、撥放器,連洗衣機也可以遙控,讓你一機在手家事一手包辦...』
太太:『那我衣服洗到一半,被轉電視的小朋友按到停止怎麼辦?可以把洗衣機的部分拿掉嗎?』
業務員:『...』


解決方式:
1)委任
2)多重繼承




5. DIP : Dependency Inversion Principle(依賴倒轉)

定義:
1)高階模組不應依賴低階模組,兩者應依賴抽象概念。
High-level modules should not depend on low-level modules. Both should depend on abstractions.
2)抽象概念不應依賴細節,細節應依賴抽象概念。
Abstractions should not depend on details. Details should depend on abstractions.

白話:不要具體的指明物件的關係,而要抽象觀念替代之。

相關觀念:IoC(Inversion of Control, 控制反轉)。另DI(Dependency Injection, 依賴注入)則為其實作的方法。

生活實例:
你下班快到家時,接到老婆的電話,才驚覺今天是結婚紀念日。
千萬別在電話中說,『當然,我帶了妳最愛的玫瑰花回家哦!』(具體)
因為很可能稍後發現......附近的花店都關門了...
只要說『當然,親愛的,我帶了禮物回家』(抽象)
這樣一來就能看到路邊賣什麼就買什麼。




PS.你真的以為這樣能過關嗎?



7 則留言: