摘要:在改變存儲系統(tǒng)的情況下,必須對進行修改,違背了開放封閉原則。傳統(tǒng)的依賴痛過倒置就能事代碼變得非常靈活,易于改變
聲明:本文并非博主原創(chuàng),而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當然也不是原汁原味的翻譯,能保證90%的原汁性,另外因為是理解翻譯,肯定會有錯誤的地方,歡迎指正。
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處,謝謝!
依賴反轉(zhuǎn)原則 介紹我們來到了SOLID設(shè)計原則的最終的目標遠景!它就是依賴反轉(zhuǎn)原則,它是指高階代碼不能依賴低階代碼。相應的,高階代碼應該依賴一個抽象層,它是在高階代碼和低階代碼之間的“中間人”角色。另一方面,該原則指代抽象層不依賴具體實現(xiàn),而是細節(jié)依賴抽象。如果這個讀起來很晦澀,別擔心。我們下面會對這兩個方面具體的闡述本原則。
實探依賴反轉(zhuǎn)原則 本原則是指高階代碼不依賴低階代碼,抽象不依賴具體細節(jié)。
如果你已經(jīng)讀過本書之前的章節(jié),就應該對依賴反轉(zhuǎn)有一個很好的理解。我們通過下面例子來解釋:
class Authenticator { public function __construct(DatabaseConnection $db) { $this->db = $db; } public function findUser($id) { return $this->db->exec("select * from users where id = ?", array($id)); } public function authenticate($credentials) { // Authenticate the user... } }
可以猜到,Authenticator類是負責查找并驗證用戶的。我們來檢驗下類的構(gòu)造器??梢钥吹轿覀冇袀€鏈接數(shù)據(jù)庫的實例DatabaseConnection。所以我們將驗證器和數(shù)據(jù)庫緊密的接合在一起了,這意味著用戶對象必須建立在關(guān)系型數(shù)據(jù)庫查詢之上。此外,我們的高階代碼(Authenticator類)直接依賴了低階代碼(DatabaseConnection類)。 首先,我們解釋下“高階”和“低階”代碼。低階代碼實現(xiàn)像這種磁盤文件訪問,數(shù)據(jù)庫接入等。高階代碼在低階代碼之上實現(xiàn)邏輯功能的封裝,但不能將他們耦合進來。或者,高階代碼依賴建立在低階代碼之上的抽象層,如接口。不僅如此,低階代碼_也_依賴于抽象層。我們來實現(xiàn)一個可以在Authenticator類中使用的接口:
interface UserProviderInterface { public function find($id); public function findByUsername($username); }
然后,將接口的實現(xiàn)注入到Authenticator:
class Authenticator { public function __construct(UserProviderInterface $users, HasherInterface $hash) { $this->hash = $hash; $this->users = $users; } public function findUser($id) { return $this->users->find($id); } public function authenticate($credentials) { $user = $this->users->findByUsername($credentials["username"]); return $this->hash->make($credentials["password"]) == $user->password; } }
這些改變之后,我們的Authenticator現(xiàn)在依賴兩個高階抽象:UserProviderInterface和HasherInterface。我們就能自由的將任何針對接口的實現(xiàn)注入到Authenticator中了。比如,如果我們用戶存儲在Reids中,可以實現(xiàn)針對UserProvider實現(xiàn)一個RedisUserProvider類。Authenticator現(xiàn)在不在直接依賴低階的存儲操作了。 此外,自從它實現(xiàn)接口本身后,我們的低階代碼現(xiàn)在也是依賴高階的UserProviderInterface抽象:
class RedisUserProvider implements UserProviderInterface { public function __construct(RedisConnection $redis) { $this->redis = $redis; } public function find($id) { $this->redis->get("users:".$id); } public function findByUsername($username) { $id = $this->redis->get("user:id:".$username); return $this->find($id); } }
反轉(zhuǎn)思想 很多開發(fā)人員在應用中使用_反轉(zhuǎn)_原則。代替這種高階直接耦合低階代碼的“自上而下”的方式,本原則指高階、低階代碼“同時”依賴一個高階抽象層。
在我們將Authenticator的依賴“倒置”前,他是無法在其他數(shù)據(jù)存儲系統(tǒng)中使用的。在改變存儲系統(tǒng)的情況下,必須對Authenticator進行修改,違背了開放封閉原則。我們已經(jīng)知道,幾種原則之間是相互貫穿的。 在將Authenticator強制實現(xiàn)在存儲層之上的抽象層,我們可以根據(jù)UserProviderInterface接口約定切換成任意其他存儲系統(tǒng),而無需對Authenticator本身進行修改。傳統(tǒng)的依賴痛過“倒置”就能事代碼變得非常靈活,易于改變!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/23041.html
摘要:可以為服務(wù)提供者的方法設(shè)置類型提示。方法將在所有其他服務(wù)提供者均已注冊之后調(diào)用。所有服務(wù)提供者都在配置文件中注冊。可以選擇推遲服務(wù)提供者的注冊,直到真正需要注冊綁定時,這樣可以提供應用程序的性能。 本文最早發(fā)布于 Rootrl的Blog 導言 Laravel是一款先進的現(xiàn)代化框架,里面有一些概念非常重要。在上手Laravel之前,我認為先弄懂這些概念是很有必要的。你甚至需要重溫下PHP...
摘要:它是良好應用設(shè)計的大原則,包含單一責任原則開放封閉原則里氏替換原則接口分離原則依賴倒置原則讓我們通過代碼示例來深究下這五個原則。實探單一責任原則代表一個類有且僅有一個改變的原因,換言之,一個類的職責范疇是嚴謹明確的。 聲明:本文并非博主原創(chuàng),而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當然也不是原汁原味的翻譯,能保證90%的原...
摘要:前言本章我們要講解的是五大原則語言實現(xiàn)的第篇,依賴倒置原則。當應用依賴倒置原則的時候,關(guān)系就反過來了。在當靜態(tài)類型語言的上下文里討論依賴倒置原則的時候,耦合的概念包括語義和物理兩種。依賴倒置原則和依賴注入都是關(guān)注依賴,并且都是用于反轉(zhuǎn)。 前言 本章我們要講解的是S.O.L.I.D五大原則JavaScript語言實現(xiàn)的第5篇,依賴倒置原則LSP(The Dependency Invers...
摘要:控制反轉(zhuǎn)容器控制反轉(zhuǎn)使依賴注入變得更加便捷。有瑕疵控制反轉(zhuǎn)容器是實現(xiàn)的控制翻轉(zhuǎn)容器的一種替代方案。容器的獨立使用即使沒有使用框架,我們?nèi)匀豢梢栽陧椖恐惺褂冒惭b組件來使用的控制反轉(zhuǎn)容器。在沒有給定任何信息的情況下,容器是無法實例化相關(guān)依賴的。 聲明:本文并非博主原創(chuàng),而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當然也不是原汁原味...
摘要:實際上,本原則要求接口必須是粒度明確的。當你的代碼不符合接口分離原則時,那也肯定違背了單一責任原則。接口分離原則本原則是指在實現(xiàn)類中對于接口中的方法并不強制去實現(xiàn)使用不到的方法。 聲明:本文并非博主原創(chuàng),而是來自對《Laravel 4 From Apprentice to Artisan》閱讀的翻譯和理解,當然也不是原汁原味的翻譯,能保證90%的原汁性,另外因為是理解翻譯,肯定會有錯誤...
閱讀 1068·2023-04-26 02:02
閱讀 2410·2021-09-26 10:11
閱讀 3562·2019-08-30 13:10
閱讀 3751·2019-08-29 17:12
閱讀 727·2019-08-29 14:20
閱讀 2195·2019-08-28 18:19
閱讀 2241·2019-08-26 13:52
閱讀 964·2019-08-26 13:43