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