以下的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.你真的以為這樣能過關嗎?