La mia impressione è che i progetti che utilizzano un framework DI come Spring o Guice tendono a perdere il loro orientamento agli oggetti e degenerano in un progetto puramente procedurale:
-
DI non solo centralizza la domanda su quale implementazione di un oggetto usare ma gestisce anche il ciclo di vita di questi oggetti. Molti schemi di progettazione OO , tuttavia, si basano sulla capacità della logica aziendale di collegare oggetti. Non saprei, ad esempio, come implementare un modello di strategia in primavera perché la decisione quale delle strategie concrete da utilizzare è determinata staticamente dalla configurazione dell'applicazione anziché da un pezzo di codice. Lo stesso vale per decoratore, composito, osservatore, ...
-
Il motivo sopra riportato porta a un design in cui funzionalità e dati sono separati. Poiché non si desidera che il contenitore DI decida quando vengono creati i dati, è stato diviso qualsiasi codice dai dati in modo che solo questa parte fosse gestita dal contenitore DI. Ciò è contrario all'idea di OO in cui codice e dati dovrebbero risiedere insieme in un'unica unità. Questo interrompe l'incapsulamento dei dati perché tutti i campi dei "bean" di dati sono esposti da getter e setter pubblici.
-
Non puoi più utilizzare il polimorfismo perché il codice non è più collegato ai suoi dati e le "funzioni virtuali" non possono funzionare. Questo porta a quelle istanze di cascate che tutti sappiamo che non dovremmo usare. Inoltre, perdiamo tutti quei progetti che si basano sul polimorfismo.
-
Il contenitore DI inserisce i bean gestiti solo negli oggetti che sono anche gestiti da esso. Pertanto, non puoi combinare bean gestiti e oggetti normali perché non possono esserci "vuoti non gestiti" nella catena di riferimento dei bean gestiti. Quindi, una volta iniziato con DI, è necessario mettere tutti gli altri codici sotto il controllo del contenitore DI e non è più possibile utilizzare gli oggetti normali. Suppongo che questo sia il motivo per cui la separazione di codice e dati viene eseguita in modo rigoroso nei progetti DI.
Vedo che ci sono dei motivi per cui usare DI ma è davvero importante rinunciare così tanto? Le persone non si preoccupano di OO? Oltre a questo articolo , Non riesco a trovare alcuna discussione su questo argomento.
O sono solo io che non capisco come farlo correttamente? Qualche idea su come affrontare i quattro punti sopra?
Appendice 1: Spiegazione del modello di strategia
Mi riferisco all'esempio qui . Supponiamo che esista una versione DI in cui tutte le implementazioni di Strategy
e Context
vengono iniettate a StrategyExample
. Quindi StrategyExample
non decide più quale Strategy
iniettare in Context
, ma la configurazione avrebbe già deciso quale implementazione iniettare in Context
. Quindi sì, DI applica pesantemente il modello di strategia. Ma lo fa sempre in modo statico.