国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

文字

如果你曾經(jīng)了解過依賴注入,那么你可能見過 “控制反轉(zhuǎn)”(Inversion of Control) 或者 “依賴反轉(zhuǎn)準(zhǔn)則”(Dependency Inversion Principle)這種說法。這些是依賴注入能解決的更復(fù)雜的問題。

控制反轉(zhuǎn)

顧名思義,一個(gè)系統(tǒng)通過組織控制和對(duì)象的完全分離來實(shí)現(xiàn)”控制反轉(zhuǎn)”。對(duì)于依賴注入,這就意味著通過在系統(tǒng)的其他地方控制和實(shí)例化依賴對(duì)象,從而實(shí)現(xiàn)了解耦。

一些 PHP 框架很早以前就已經(jīng)實(shí)現(xiàn)控制反轉(zhuǎn)了,但是問題是,應(yīng)該反轉(zhuǎn)哪部分以及到什么程度?比如, MVC 框架通常會(huì)提供超類或者基本的控制器類以便其他控制器可以通過繼承來獲得相應(yīng)的依賴。這就是控制反轉(zhuǎn)的例子,但是這種方法是直接移除了依賴而不是減輕了依賴。

依賴注入允許我們通過按需注入的方式更加優(yōu)雅地解決這個(gè)問題,完全不需要任何耦合。

依賴反轉(zhuǎn)準(zhǔn)則

依賴反轉(zhuǎn)準(zhǔn)則是面向?qū)ο笤O(shè)計(jì)準(zhǔn)則 S.O.L.I.D 中的 “D” ,倡導(dǎo) “依賴于抽象而不是具體”。簡(jiǎn)單來說就是依賴應(yīng)該是接口/約定或者抽象類,而不是具體的實(shí)現(xiàn)。我們能很容易重構(gòu)前面的例子,使之遵循這個(gè)準(zhǔn)則

<?php 
namespace Database; 
class Database {     
protected $adapter;     
public function __construct(AdapterInterface $adapter){         
$this->adapter = $adapter;     
} 
} 
interface AdapterInterface {
} 
class MysqlAdapter implements AdapterInterface {
}

現(xiàn)在 Database 類依賴于接口,相比依賴于具體實(shí)現(xiàn)有更多的優(yōu)勢(shì)。

假設(shè)你工作的團(tuán)隊(duì)中,一位同事負(fù)責(zé)設(shè)計(jì)適配器。在第一個(gè)例子中,我們需要等待適配器設(shè)計(jì)完之后才能單元測(cè)試?,F(xiàn)在由于依賴是一個(gè)接口/約定,我們能輕松地模擬接口測(cè)試,因?yàn)槲覀冎劳聲?huì)基于約定實(shí)現(xiàn)那個(gè)適配器

這種方法的一個(gè)更大的好處是代碼擴(kuò)展性變得更高。如果一年之后我們決定要遷移到一種不同的數(shù)據(jù)庫(kù),我們只需要寫一個(gè)實(shí)現(xiàn)相應(yīng)接口的適配器并且注入進(jìn)去,由于適配器遵循接口的約定,我們不需要額外的重構(gòu)。


上一篇: 下一篇: