1. 程式人生 > >讀後感:分析依賴注入、服務容器的產生

讀後感:分析依賴注入、服務容器的產生

名詞:
依賴注入:依賴Dependency 注入Injection 簡稱DI
控制反轉:反轉Inversion of Control 簡稱IoC
容器:Container
在 Laravel 5 中,IoC 容器改名為服務容器,IoC 容器和服務容器指代同一個東西。

原文地址:Laravel 服務容器例項教程 —— 深入理解控制反轉(IoC)和依賴注入(DI)https://laravelacademy.org/post/769.html

該篇講述瞭如何更高效更合理製造一批超級機器人 superman

以下為個人的理解,儘可能以最簡潔的文字寫下來,由於是初學,有認知錯誤請諒解。

假設我們對生產機器人毫無經驗

起初現有以下三種技能,每種技能都有不同配置,和手機一樣不同的cpu核數記憶體硬碟大小
蠻力 class:Force{ $force力量值 }
飛行 class:Flight{ $speed速度 $holdtime持續飛行時間 }
射擊 class:Shot { $atk傷害值 $range射擊距離 $limit同時多少發 }

最初模式

在這裡插入圖片描述
一個機器人就生產出來了,如果修改技能個數,修改配置,需修改superman類

工廠的誕生

建立一個專門例項技能模組的工廠類,superman只需給工廠需要生產什麼技能,什麼配置的報表,委託工廠類來例項化技能類。
我們只需要給工廠需要的報表

$arr = [ 
Force =>[101],
Flight =>[ 20m/s,1.5h ]
]
class superman 
{
	protected $modules; //技能
	pub func __construct($arr)
	{
		foreach($arr as $modulename=>$param)
		{
			/**Force=>[ 101 ]*/
			$module =(new factory)->makeModule ($modulename,$param);
			$this->modules[] = $module;
		}	
	}
}
class factory{
	makeModule(){
		//為了不讓與技能無關的類被例項化,須預先記錄可用的技能類
		switch
		case 'Force'
			return new Force(..)
		case 'Flight'
			return new Flight
		...
	}
}

改革一
在這裡插入圖片描述
第一代生產線生產效率大大提高。

解除依賴 -

1,superman類對工廠類的依賴(superman的實現取決於工廠的具體實現)。
2,工廠類對技能類的依賴( 技能種類的增加;例項化方式改變;例項化的複雜性增加),工廠要對每個技能類瞭如指掌,每次修改實在是頭疼的事情。

我們需要改變生產模式,尋求降低或者解除耦合度。
解除工廠對技能類實現的依賴 生產指令碼的誕生
首先我不需瞭解每個技能類如何例項化,由技能類提供自身的例項指令碼,打包成一鍵安裝的.exe,我只要滑鼠輕輕一點,所有安裝自動完成。所以不管元件是中國或者外國哪家公司提供的,可以隨時替換更高科技的元件。我們的工廠不負責科技的研發,具體的生產線,只提供各個元件的排程。

'Force.exe'=>function(){ 指令碼 }

在這裡插入圖片描述
解除超人類與工廠的依賴
由超人類呼叫工廠,變成外部呼叫
在這裡插入圖片描述

契約的誕生
矛盾:返回的技能例項能不能正常使用呢?
解決:提供契約

interface moduleInterface{
//介面規範
}
class Force implements moduleInterface{
//實現介面
}

在這裡插入圖片描述

超級工廠- 容器

矛盾:實際我們的事業是維護世界和平,不只是做個機器人生產商,還要宇宙飛船,空間站,火箭。。一整套體系。
解決:和機器人模組一樣,機器人也由外部提供,不管是中國還是外國的哪家公司生產的。
在這裡插入圖片描述
到這裡,我們由只生產機器人,變成可以完成登月計劃的整體框架。
機器人、火箭、衛星、宇宙飛船類似laravel的路由、檢視、模型元件,而機器人的晶片force.exe\flight.exe\shot.exe類似單個元件的服務。
這些元件及元件的服務,由容器排程。

所有元件和服務在容器啟動時都已經提前註冊到容器中。由於依賴注入去了耦合;由於契約,元件可以替換服務。

我們在應用中只需要一行程式碼
$app->make(’ superman’,[‘force’,‘flight’]);

end;