前言

我已經忘了是在哪裡看到這個有趣的解釋,也許是大家的好朋友 StackOverflow 上?

他用了一個生動的例子來講解什麼是 DI 。

父子吃飯

假設有一位爸爸,他有一個可愛的六歲孩子。

有一天他們一起吃早餐的時候,他兒子說什麼都不肯好好吃飯。除非他喝到柳橙汁。

但柳橙汁放在冰箱的深處,小朋友去拿的話可能會亂拿裡面其他的東西,或者打翻其他湯湯水水的東西。

於是他老爸就說

修但幾勒(來源:網路素材)

叫他兒子乖乖坐好,老爸就自己去拿了柳橙汁,給他兒子。

於是這又是美好的一天。

所以? 什麼是 DI ?

你可以把這個兒子想像成是某個 Class 它依賴於另一個 Class 否則它就不能工作(他就不吃飯)。

以往我們會在這個 Class 裡 Create 這些物件(柳橙汁)。然後就開開心心地繼續下去(開開心心地吃飯)。

如果我們把爸爸這個角色想成 DI 的角色(任何能幫助你的 Library 或自己做都可以)。

你就會發現,DI 在做的事情就是叫兒子(任何的 Class) 乖乖坐好,你告訴我你要什麼,我把你拿(幫你 create)。

那為什麼要 DI ?

你也許會想,小朋友自己拿也可以啊?為什麼要麻煩爸爸?

那我們來假設另外一個情況

一如往常,小朋友自己去拿了柳橙汁,也開開心心的吃起飯來。結果柳橙汁過期了。

小孩一陣爆哭,也不好好說話。爸爸無從得知到底是哪裡出了問題?(Bug 到底出在哪裡啊?)

如果是爸爸拿的話,爸爸就可以先去檢查是不是柳橙汁出問題了(Mock 物件),如果這樣還是出問題,那就可以繼續找其他的問題來源。

結語

這大概就是 DI 的簡單概念