Perché il modello di iniezione di dipendenza non era incluso nella banda di quattro?


37

Perché il modello di iniezione di dipendenza non era incluso nella banda di quattro ? GOF ha pre-datato i test automatici diffusi? L'iniezione di dipendenza è ora considerata un modello di base?


18
.. perché "Iniezione di dipendenza" non
Dipan Mehta,


14
Tutto ciò che viene ripetuto forma un modello di ripetizione. Tutti gli elementi di design (che non sono idee uniche e folli) sono "modelli".
S. Lott,

3
Queste risposte lunghe sono probabilmente fuorvianti, poiché in qualche modo convalidano la domanda. Mentre, come detto, l'iniezione di dipendenza non è un modello progettuale. È un "meccanismo" per la creazione di istanze di oggetti, in genere gestito dal framework.
Nazar Merza,

1
L'iniezione di dipendenza è un modello . Si oppone al modello di Service Locator. Leggi Fowler che ha coniato il termine. Non ho assolutamente idea di quante così tante persone abbiano votato su queste sciocchezze.
James,

Risposte:


101

Ero redattore della rivista Software Development quando uscì il libro Gang of Four e posso dire con totale fiducia che il test unitario non era una pratica diffusa nel 1994, quando Design Patterns fu originariamente pubblicato.

Nel 1994, C ++ era il linguaggio orientato agli oggetti più comunemente usato e la maggior parte delle persone che lo programmavano provenivano da un background C. Una delle cose del "pensare negli oggetti" che le persone semplicemente non avevano è l'idea di centinaia o migliaia di punti di accesso al tuo programma. Hai pensato al main(). Se hai lavorato su un grande progetto, potresti avere un (solitamente abbastanza elaborato) makefile per creare un programma basato su moduli. Ma "unit test"? Avvio di un processo, creazione del contesto di memoria necessario, esecuzione e riduzione in base al metodo ? È stato molto radicale.

Java ha reso più ovvia la programmazione con più punti di accesso. All'epoca del boom originale della Dot-Com, i test unitari erano una tecnica ben nota, ma era proprio la JUnit (circa 2001?) Che le fece prendere fuoco e diventare una pratica universale.

Sebbene la strategia e il concetto generale di programmazione di un'interfaccia facessero parte del GoF e dello zeitgeist della metà degli anni '90, l'idea dell'iniezione è arrivata abbastanza tardi al partito (circa '03 -'05?). Onestamente, i miei capelli grigi sono ancora abbastanza dubbiosi su quell'aspetto di DI ("Esci dal mio prato, dannatamente file di configurazione!").


17
Mi dispiace di avere solo un voto positivo per dare una risposta così approfondita.

@Larry OBrien: la ricerca di registrazioni basate su convention semplifica enormemente il codice di configurazione ed elimina praticamente la configurazione xml in contenitori di ioc.
Quentin-starin,

4
Vorrei aggiungere che l'iniezione di dipendenza al suo interno non si basa affatto sui file di configurazione. Puoi fare tutto a mano, il che lo rende molto facile da usare ed è ancora un approccio molto flessibile.
marco-fiset,

31

Lo chiamavano Strategia .

La loro strategia sembra avere tutte le caratteristiche dell'iniezione di dipendenza senza il nome dal suono complesso.


16
-1. Scusate! Il modello di strategia non ha nulla a che fare con l'iniezione di dipendenza.
Dipan Mehta,


14
@Dipan: prima di sottovalutare questo, è meglio pensare alla risposta cinque minuti.
Doc Brown,

6
è vero che l'iniezione di dipendenza può essere considerata molto simile al modello di strategia, ma quando le persone dicono iniezione di dipendenza di solito significano Inversion of Control, che penso sia molto più distinto dalla strategia (specialmente contenitore IoC).
MattDavey,

8
DI è più un modello creazionale. Crea e inietta strategie. Dire che è una strategia è solo metà della verità. DI è più un modello di microkernel! Non posso credere che le persone abbiano votato a questo. La strategia è più simile a un tratto di buona DI, non una necessità.
Falcon,

0

Penso che l'iniezione delle dipendenze sia più rilevante quando si separa l'implementazione nei livelli. Un'altra area in cui pensiamo all'iniezione di dipendenza è il test unitario. E il tuo suggerimento prima della data sembra essere corretto. Se la banda dovesse raccogliere e separare i modelli nel 2012, sicuramente ci sarà l'iniezione di dipendenza.

La strategia potrebbe emergere nelle discussioni, ma la strategia non parla dell'iniezione di dipendenza. Ma quando si utilizza il modello di strategia in un singolo progetto o DLL (tutte le classi e le interfacce rimangono in un unico progetto) sembra che stiamo facendo l'iniezione di dipendenza. In realtà non lo siamo.

Ora, se le classi e le interfacce menzionate nel modello di strategia sono separate in diversi progetti o livelli, dovremo usare tecniche di iniezione di dipendenza. Potremmo usare i file di configurazione di unity (tuttavia non è possibile modificare il runtime). Ma il modello di strategia non dice come iniettare una dipendenza.

Se esiste un modello simile a quello dell'iniezione di dipendenza, si tratta del modello Metodo di fabbrica astratto. Questo modello potrebbe essere utilizzato all'interno di un modello di strategia per iniettare dipendenza.


2
Questo non risponde alla domanda. Si prega di leggere la domanda originale invece di rispondere ad altre risposte :)
Andres F.

-4

la strategia di risposta è corretta al 100%. Ho votato ma posso commentare.

"La strategia consente all'algoritmo di variare indipendentemente dai client che lo utilizzano. [1] La strategia è uno dei modelli inclusi nell'influente libro Design Patterns di Gamma et al. Che ha reso popolare il concetto di utilizzare i modelli per descrivere la progettazione del software."

Un modello di progettazione non dipende dal suo utilizzo. L'iniezione delle dipendenze viene implementata utilizzando il modello di strategia. Se chiamassimo ogni modello in base al caso d'uso dovremmo rinominare molti schemi.

Il modello di repository non è un nuovo modello, è il modello di modello.

"Nel metodo modello di questo modello di progettazione, una o più fasi dell'algoritmo possono essere sovrascritte da sottoclassi per consentire comportamenti diversi garantendo al contempo che l'algoritmo generale sia ancora seguito."

Spesso i motivi sono più motivi combinati e denominati come il modello MVC.

Il GOF non aveva interfacce con le classi Pure Abstract utilizzate e sfruttò anche la capacità del C ++ di ereditare da più di una classe.


1
Lo scopo di un modello è assolutamente importante nel distinguere. Tra i modelli GoF, Adapter e Proxy sono buoni esempi: hanno la stessa forma, ma scopi diversi. Non sarei anche d'accordo con la tua affermazione che DI è implementato usando la strategia; La strategia è più specifica nel suo scopo e nel modo in cui viene utilizzato l'oggetto configurato, quindi è più ragionevole dire che la strategia è implementata con DI.
Jules
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.