前言
我已經忘了是在哪裡看到這個有趣的解釋,也許是大家的好朋友 StackOverflow 上?
他用了一個生動的例子來講解什麼是 DI 。
父子吃飯
假設有一位爸爸,他有一個可愛的六歲孩子。
有一天他們一起吃早餐的時候,他兒子說什麼都不肯好好吃飯。除非他喝到柳橙汁。
但柳橙汁放在冰箱的深處,小朋友去拿的話可能會亂拿裡面其他的東西,或者打翻其他湯湯水水的東西。
於是他老爸就說
叫他兒子乖乖坐好,老爸就自己去拿了柳橙汁,給他兒子。
於是這又是美好的一天。
所以? 什麼是 DI ?
你可以把這個兒子想像成是某個 Class 它依賴於另一個 Class 否則它就不能工作(他就不吃飯)。
以往我們會在這個 Class 裡 Create 這些物件(柳橙汁)。然後就開開心心地繼續下去(開開心心地吃飯)。
如果我們把爸爸這個角色想成 DI 的角色(任何能幫助你的 Library 或自己做都可以)。
你就會發現,DI 在做的事情就是叫兒子(任何的 Class) 乖乖坐好,你告訴我你要什麼,我把你拿(幫你 create)。
那為什麼要 DI ?
你也許會想,小朋友自己拿也可以啊?為什麼要麻煩爸爸?
那我們來假設另外一個情況
一如往常,小朋友自己去拿了柳橙汁,也開開心心的吃起飯來。結果柳橙汁過期了。
小孩一陣爆哭,也不好好說話。爸爸無從得知到底是哪裡出了問題?(Bug 到底出在哪裡啊?)
如果是爸爸拿的話,爸爸就可以先去檢查是不是柳橙汁出問題了(Mock 物件),如果這樣還是出問題,那就可以繼續找其他的問題來源。
結語
這大概就是 DI 的簡單概念