心法
稱為相依性反轉、依賴倒置原則。
解除高階模組 (Caller 呼叫者) 與 低階模組 (Callee 被呼叫者)的 耦合關係,使高階模組不再直接依賴低階模組。
相依於抽象或介面。而不相依於細節。
範例
人依賴(需要)蘋果填飽肚子。當自身需要呼叫其他類別實作時,這種關係就稱為依賴。
<?php class people { public function eat() { //實作蘋果,對蘋果產生依賴了。 $apple = new apple(); $apple->stuff(); } } class apple { public function stuff() { echo '吃下蘋果'; } } $people = new People(); $people->eat();
當不想吃蘋果時
<?php class people { public function eat() { $hamburger = new hamburger(); $hamburger->stuff(); } } class apple { public function stuff() { echo '吃下蘋果'; } } class hamburger { public function stuff() { echo '吃下漢堡'; } } $people = new People(); $people->eat();
這時會發現依賴產生的問題:
- 當要換吃別種食物就要去更改程式碼,食物百百種就要更改幾百次。
- 只是想填飽肚子卻要依賴漢堡,人的行為模式(填飽肚子)被漢堡綁死。
解決方式(依賴倒置)
讓人依賴的對象變成抽象、介面(填飽肚子),而非實際的類別(蘋果、漢堡)。
<?php class people { public function eat(stuffer $_ostuffer) { $_ostuffer->stuff(); } } interface stuffer { public function stuff(); } class apple implements stuffer { public function stuff() { echo '吃下蘋果'; } } class hamburger implements stuffer { public function stuff() { echo '吃下漢堡'; } } $apple = new apple(); $hamburger = new hamburger(); $people = new People(); $people->eat($hamburger); $people->eat($apple);
遵守依賴反轉好處
人(高階模組)依賴的對象變成填飽肚子(抽象介面),蘋果(低階模組)依賴的對象也變成填飽肚子(抽象介面)。
只要人提出填飽肚子的需求,就會有工廠幫他做出食物。
變成食物依賴人填飽肚子的需求。讓程式減少耦合,以及增加了擴充性。
相關文章:
- PHP物件導向 – 三大特性:封裝(Encapsulation)、繼承(Inheritance)、多型(Polymorphism)
- PHP物件導向 – 單一職責(Single Responsibility Principle, SRP)
- PHP物件導向 – 開放封閉(Open Closed Principle, OCP)
- PHP物件導向 – 里氏替換(Liskov Substitution Principle, LSP)
- PHP物件導向 – 最小知識(Least Knowledge Principle, LKP)
- PHP物件導向 – 介面隔離(Interface Segregation Principle, ISP)
- PHP物件導向 – 依賴反轉(Dependency-Inversion Principle, DIP)