我目前正在考慮很多關(guān)于依賴注入的問(wèn)題,它有利有弊。一般而言,似乎一致認(rèn)為在大多數(shù)情況下依賴注入是正確的選擇。我看到了它的用處以及它如何使代碼更具可讀性。因此,我試圖用盡可能多的依賴注入來(lái)創(chuàng)建我的類,將關(guān)注點(diǎn)分成多個(gè)對(duì)象。在我 70% 的日常工作中,這很好。它有效,我看到了好處。然而,剩下的 30% 讓我有些掙扎。我對(duì)依賴注入本身的概念沒(méi)有問(wèn)題,但事實(shí)上我認(rèn)為 PHP 確實(shí)有一些“特殊屬性”,這讓我懷疑依賴注入是正確的選擇。主要觀點(diǎn)似乎是使用 DI 而不是服務(wù)定位器的優(yōu)點(diǎn),假設(shè)您有“編譯時(shí)錯(cuò)誤”而不是“運(yùn)行時(shí)錯(cuò)誤”。我明白,對(duì)于 Java 或 C 之類的語(yǔ)言,但 PHP 中沒(méi)有“編譯時(shí)錯(cuò)誤”這樣的東西不會(huì)自動(dòng)導(dǎo)致“運(yùn)行時(shí)錯(cuò)誤”。至少我沒(méi)有遇到過(guò)。在啟動(dòng)一次的程序中,將它們的源加載到內(nèi)存中并在它們被執(zhí)行時(shí)一直保持在那里,我明白你為什么要使用 DI。這是有道理的,您不必(通常)擔(dān)心應(yīng)用程序需要多長(zhǎng)時(shí)間才能達(dá)到運(yùn)行狀態(tài),并且您應(yīng)該(通常)有足夠的內(nèi)存來(lái)保存所有代碼。所以加載所有依賴項(xiàng)并將它們保存在內(nèi)存中似乎沒(méi)問(wèn)題。但是,PHP 腳本在 Apache、NGINX 或其他上下文中使用時(shí),每次用戶訪問(wèn)時(shí)都會(huì)啟動(dòng)。除此之外,我們希望我們的應(yīng)用程序運(yùn)行得盡可能快,用盡可能少的資源來(lái)充分利用服務(wù)器硬件。問(wèn)題是,如果我每次都加載整個(gè)庫(kù),即使我只訪問(wèn)了一小部分代碼,這似乎也很浪費(fèi)......(我在下面有一個(gè)例子來(lái)說(shuō)明我的意思)如上所述,我嘗試盡可能多地使用 DI。但是剩下的 30% 我仍然使用服務(wù)定位器模式來(lái)處理,因?yàn)槲?a.) 只需要在特定條件下的依賴項(xiàng)或 b.) 我訪問(wèn)一個(gè)或多或少可以用全局函數(shù)替代的服務(wù)/助手類。(見(jiàn)下例)在這方面,我閱讀了很多關(guān)于 a.) 助手類是邪惡的 b.) 當(dāng)您在類中只使用一次依賴項(xiàng)時(shí),您應(yīng)該將其拆分為一個(gè)單獨(dú)的類(老實(shí)說(shuō),這是我不知道的一點(diǎn)完全明白,因?yàn)楫?dāng)您使用 DI 時(shí),您無(wú)論如何都必須創(chuàng)建該類,那么為什么要將它與一般類分開(kāi)?)。我創(chuàng)建了一些虛擬代碼來(lái)展示我認(rèn)為(在撰寫本文時(shí))服務(wù)定位器(在 PHP 中)比 DI 更明智的 30%。
1 回答

收到一只叮咚
TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊
沒(méi)有模式總是答案;當(dāng)這些不能被推遲時(shí),做出明智的、務(wù)實(shí)的架構(gòu)決策很重要。
您說(shuō)得對(duì),在 PHP 的情況下,由于必須在每個(gè)請(qǐng)求上實(shí)例化整個(gè)對(duì)象圖,DI 可能會(huì)導(dǎo)致性能損失。
然而,依賴注入顯然與性能無(wú)關(guān)。它是一種實(shí)現(xiàn)控制反轉(zhuǎn)的方法,最終走向模塊化設(shè)計(jì)、關(guān)注點(diǎn)分離、可重用性和可測(cè)試性。這些好處大大超過(guò)了“編譯時(shí)”錯(cuò)誤捕獲能力。
在軟件項(xiàng)目的早期階段,預(yù)測(cè)它是否足夠簡(jiǎn)單(你的 30%)以放棄所有這些好處并采用互連設(shè)計(jì)而不是模塊化設(shè)計(jì)是非常困難和冒險(xiǎn)的。部件緊密耦合,只是名稱或性能。
- 1 回答
- 0 關(guān)注
- 118 瀏覽
添加回答
舉報(bào)
0/150
提交
取消