心法
一個類別/方法只負責一個職責。
範例
UserSettings做太多事情了,檢查設定又驗證憑證,沒有符合單一職責,一個功能一件事情。
<?php class UserSettings { private $user; public function __construct($user) { $this->user = $user; } public function changeSettings($settings) { if ($this->verifyCredentials()) { // ... } } private function verifyCredentials() { // ... } }
解決方式(單一職責)
<?php class UserAuth { private $user; public function __construct($user) { $this->user = $user; } public function verifyCredentials() { // ... } } class UserSettings { private $user; private $auth; public function __construct($user) { $this->user = $user; $this->auth = new UserAuth($user); } public function changeSettings($settings) { if ($this->auth->verifyCredentials()) { // ... } } }
遵守單一職責好處
單一個方法太多功能,會導致物件相依性太多,這會讓程式耦合性變高,並讓測試不好寫,你必須mock一堆物件跟方法。
當一個類別的職責,越清楚越單純,內聚力越高。(單一功能)如果一個類別引入的檔案越少,就是相依性較低; 反觀如果引入的檔案數多,就是相依性較高。
相關文章:
- 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)