摘要:設(shè)計模式中依賴倒置原則的定義是高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象抽象不應(yīng)該依賴細節(jié)細節(jié)應(yīng)該依賴抽象。像這樣,是無法真正體現(xiàn)依賴倒置原則的。
設(shè)計模式中依賴倒置原則(Dependence Inversion Principle)的定義是“高層模塊不應(yīng)該依賴低層模塊,二者都應(yīng)該依賴其抽象;抽象不應(yīng)該依賴細節(jié);細節(jié)應(yīng)該依賴抽象。”理解起來并不難,但在具體實現(xiàn)上,網(wǎng)上給出的很多PHP示例都有缺陷。
就拿這篇文章來說,概念講的沒有問題,但在具體實現(xiàn)上,特別是代碼中有很多錯誤,不能體現(xiàn)PHP特色,比如PHP中應(yīng)該用->而不是用.來調(diào)用方法,變量名應(yīng)該帶$等很多錯誤,這就不說了,最關(guān)鍵的是即使把這些語法錯誤都改正,例子也不能說明原則,不夠有說服力。因為即使不加接口或抽象類,媽媽也一樣能給孩子講故事、讀報紙、讀雜志。
以下可運行代碼,沒有用到任何接口和抽象類,一樣可以實現(xiàn)功能,并且可擴展,不需要修改Mother類里的任何代碼,一樣可以輕松自如地讓媽媽讀各種讀物,無非就是在上面追加各種class,只要這個class里有getContent方法,媽媽全部可以識別:
getContent(); } } class Client{ public static function main(){ $mother = new Mother(); $mother->narrate(new Book()); $mother->narrate(new Newspaper()); } } Client::main();
既然如此隨意,還如何體現(xiàn)依賴倒置呢?這是因為PHP是弱類型語言,特點就是不需要為變量指定類型,導(dǎo)致的結(jié)果就是只要你的class里有我需要調(diào)用的方法(在這里是getContent方法),那就無論如何也不會出錯,至于你是不是實現(xiàn)了什么interface接口,都無所謂的。像這樣,是無法真正體現(xiàn)依賴倒置原則的。那到底如何才能真正體現(xiàn)依賴倒置呢?秘訣就是我們通過使用PHP的類型約束來規(guī)定narrate函數(shù)的$book參數(shù)必須是一個接口:
class Mother{ public function narrate(IReader $book){ echo "媽媽開始講故事 "; echo $book->getContent(); } }
在這里,我們規(guī)定了$book參數(shù)必須是一個IReader接口,那么凡是需要讓媽媽講的讀物都必須是對于IReader這個接口的一個實現(xiàn),否則就會報錯。完整代碼如下:
getContent(); } } class Client{ public static function main(){ $mother = new Mother(); $mother->narrate(new Book()); $mother->narrate(new Newspaper()); } } $client = new Client(); $client->main();
你可以試著把class Newspaper后面的implements IReader去掉然后運行一下,馬上就會報錯:
PHP Fatal error: Uncaught TypeError: Argument 1 passed to Mother::narrate() must implement interface IReader, instance of Newspaper given, called in /Users/zhangjing/Projects/phpdesignpattern/client.php on line 29 and defined in /Users/zhangjing/Projects/phpdesignpattern/client.php:19
所以結(jié)論是:對于PHP這種弱類型語言來講,要想真正實現(xiàn)依賴倒置原則,必須加上類型約束,否則實現(xiàn)的只是表象,并不能真正體現(xiàn)原則的作用。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/23320.html
摘要:四依賴倒置原則依賴倒置原則簡介依賴倒置原則的英文名稱是,簡稱。依賴倒置原則的表現(xiàn)其實就是面向接口編程。依賴倒置原則的優(yōu)點減少類間的耦合性,提高系統(tǒng)的穩(wěn)定性。結(jié)合里氏替換原則使用接口負責定義屬性和方法,并且聲明與其他對象的依賴關(guān)系。 面向?qū)ο蠡驹瓌t(2)- 里式代換原則與依賴倒置原則 面向?qū)ο蠡驹瓌t(1)- 單一職責原則與接口隔離原則面向?qū)ο蠡驹瓌t(2)- 里式代換原則與依賴倒置原...
摘要:常用的六大設(shè)計模式有單一職責原則,里氏替換原則,依賴倒轉(zhuǎn)原則,接口隔離原則,迪米特法則,開閉原則。這六大原則是最虛,最抽象的,很難理解。這就是接口隔離原則。當我們遵循前面介紹的五大原則,以及使用種設(shè)計模式的目的就是遵循開閉原則。 設(shè)計模式的目的是為了更好的代碼重用性,可讀性,可靠性和可維護性。常用的六大設(shè)計模式有:單一職責原則(SRP),里氏替換原則(LSP),依賴倒轉(zhuǎn)原則(DIP...
摘要:可以為服務(wù)提供者的方法設(shè)置類型提示。方法將在所有其他服務(wù)提供者均已注冊之后調(diào)用。所有服務(wù)提供者都在配置文件中注冊。可以選擇推遲服務(wù)提供者的注冊,直到真正需要注冊綁定時,這樣可以提供應(yīng)用程序的性能。 本文最早發(fā)布于 Rootrl的Blog 導(dǎo)言 Laravel是一款先進的現(xiàn)代化框架,里面有一些概念非常重要。在上手Laravel之前,我認為先弄懂這些概念是很有必要的。你甚至需要重溫下PHP...
摘要:依賴注入控制反轉(zhuǎn)的一種具體實現(xiàn)方法。接下來,我們使用依賴注入實現(xiàn)控制反轉(zhuǎn),使依賴關(guān)系倒置依賴被動傳入。從單元測試的角度看,依賴注入更方便和操作,方便了測試人員寫出質(zhì)量更高的測試代碼。 前言 好的設(shè)計會提高程序的可復(fù)用性和可維護性,也間接的提高了開發(fā)人員的生產(chǎn)力。今天,我們就來說一下在很多框架中都使用的依賴注入。 一些概念 要搞清楚什么是依賴注入如何依賴注入,首先我們要明確一些概念。 D...
摘要:面向?qū)ο笤O(shè)計的五大原則單一職責原則接口隔離原則開放封閉原則替換原則依賴倒置原則。主要是針對繼承的設(shè)計原則,繼承與派生多態(tài)是的主要特性。 面向?qū)ο笤O(shè)計的五大原則:單一職責原則、接口隔離原則、開放-封閉原則、替換原則、依賴倒置原則。這些原則主要是由Robert C.Martin在《敏捷軟件開發(fā)——原則、方法、與實踐》一書中總結(jié)出來,這五大原則也是23種設(shè)計模式的基礎(chǔ)。 單一職責原則 Sin...
閱讀 2181·2021-11-24 10:26
閱讀 2792·2021-11-23 09:51
閱讀 2907·2021-10-08 10:05
閱讀 1683·2021-09-22 15:18
閱讀 1619·2019-08-29 18:45
閱讀 2143·2019-08-29 18:40
閱讀 3332·2019-08-29 16:16
閱讀 2849·2019-08-29 14:21