本篇文章帶大家了解一下PHP面向對象設計的五個基準原則(S.O.L.I.D),希望對大家有所幫助!
前端(vue)入門到精通課程:進入學習
S.O.L.I.D 是 面向對象設計(OOD)的 5 個準則的首字母縮寫 ,這些準則是由 Robert C. Martin 提出的, 他更為人所熟知的名字是 Uncle Bob。
這些準則使得開發出易擴展、可維護的軟件變得更容易。也使得代碼更精簡、易于重構。同樣也是敏捷開發和自適應軟件開發的一部分。
備注: 這不是一篇簡單的介紹 “歡迎來到 _*S.O.L.I.D*” 的文章,這篇文章想要闡明 *S.O.L.I.D*** 是什么。
S.O.L.I.D 意思是:
擴展出來的首字母縮略詞看起來可能很復雜,實際上它們很容易理解。
- S – 單一功能原則
- O – 開閉原則
- L – 里氏替換原則
- I – 接口隔離原則
- D – 依賴反轉原則
接下來讓我們看看每個原則,來了解為什么 S.O.L.I.D 可以幫助我們成為更好的開發人員。
單一職責原則
縮寫是 S.R.P ,該原則內容是:
一個類有且只能有一個因素使其改變,意思是一個類只應該有單一職責.
例如,假設我們有一些圖形,并且想要計算這些圖形的總面積.是的,這很簡單對不對?
class Circle { public $radius; public function __construct($radius) { $this->radius = $radius; } } class Square { public $length; public function __construct($length) { $this->length = $length; } }
首先,我們創建圖形類,該類的構造方法初始化必要的參數.接下來,創建AreaCalculator 類,然后編寫計算指定圖形總面積的邏輯代碼.
class AreaCalculator { protected $shapes; public function __construct($shapes = array()) { $this->shapes = $shapes; } public function sum() { // logic to sum the areas } public function output() { return 'Sum of the areas of provided shapes: ' . $this->sum(); } }
AreaCalculator 使用方法,我們只需簡單的實例化這個類,并且傳遞一個圖形數組,在頁面底部展示輸出內容.
$shapes = array( new Circle(2), new Square(5), new Square(6) ); $areas = new AreaCalculator($shapes); echo $areas->output();
輸出方法的問題在于,AreaCalculator 處理了數據輸出邏輯.因此,假如用戶希望將數據以 json 或者其他格式輸出呢?
所有邏輯都由 AreaCalculator 類處理,這恰恰違反了單一職責原則(SRP); AreaCalculator 類應該只負責計算圖形的總面積,它不應該關心用戶是想要json還是HTML格式數據。
因此,要解決這個問題,可以創建一個 SumCalculatorOutputter 類,并使用它來處理所需的顯示邏輯,以處理所有圖形的總面積該如何顯示。
SumCalculatorOutputter 類的工作方式如下:
$shapes = array( new Circle(2), new Square(5), new Square(6) ); $areas = new AreaCalculator($shapes); $output = new SumCalculatorOutputter($areas); echo $output->JSON(); echo $output->HAML(); echo $output->HTML(); echo $output->JADE();
現在,無論你想向用戶輸出什么格式數據,都由 SumCalculatorOutputter 類處理。
開閉原則
對象和實體應該對擴展開放,但是對修改關閉.
簡單的說就是,一個類應該不用修改其自身就能很容易擴展其功能.讓我們看一下 AreaCalculator 類,特別是 sum 方法.
public function sum() { foreach($this->shapes as $shape) { if(is_a($shape, 'Square')) { $area[] = pow($shape->length, 2); } else if(is_a($shape, 'Circle')) { $area[] = pi() * pow($shape->radius, 2); } } return array_sum($area); }
如果我們想用 sum 方法能計算