2012-07-04 33 views
6

sto leggendo Dependency Injection in .NET da Mark Seemann e non posso per la vita di me ottenere la mia testa avvolta intorno a questo:DI Control-Freak anti-modello: Avendo difficoltà a capire

Anche se la nuova parola chiave è un odore di codice quando si tratta DIPENDENZE VOLATILE , non è necessario preoccuparsi di utilizzarlo per STABILE DIPENDENZE. La nuova parola chiave non è improvvisamente "illegale" in generale, ma si consiglia di non utilizzarla per ottenere istanze di VOLATILE DIPENDENZE.

Forse è perché non riesco ancora a mettere la mia testa nel contesto ambientale come un'iniezione invece di una variabile globale, ma non sto ottenendo ciò che dice l'autore.

Mi piacerebbe davvero capire DI da cima a fondo ma in questo momento sono bloccato e questo è solo un terzo del libro ... L'anti-pattern Control-Freak sembra essere ogni singolo programmatore che sia mai vissuto ...

Qualcuno ha qualche intuizione?

+1

Vedere http://jamesshore.com/Blog/Dependency-Injection-Demystified.html. Ci sono così tanti articoli eccessivamente complessi su DI in giro, anche se non c'è davvero molto da fare. Ho trovato l'articolo abbastanza illuminante :-). – helpermethod

risposta

7

La volatilità (per me) è una misura della probabilità che una classe dovrà essere modificata.

Idealmente si progettano le classi per essere aperte all'estensione ma chiuse alla modifica (Open Closed Principle). Questo non è sempre possibile. Le classi che si chiudono per cambiare sono meno volatili rispetto alle altre.

NDepend (uno strumento di metriche di analisi statica netta) ha una metrica chiamata Instability che nella mia mente è anche possibile. Essi definiscono questo come:

instabilità (I): Il rapporto di accoppiamento efferente (Ce) all'accoppiamento totale. I = Ce/(Ce + Ca). Questa metrica è un indicatore della capacità di ripresa dell'assieme di cambiare. L'intervallo per questa metrica è da 0 a 1, con I = 0 che indica un assieme completamente stabile e I = 1 che indica un assieme completamente instabile.

Non si vuole classi stabili basandosi su quelli meno stabile.

Per quanto riguarda la decisione di iniettare o meno, sembra più un problema di ruolo di classe. Da DDD (Domain Driven Design) le Classi sono solitamente Entità (hanno identità), Servizi (orchestrano le cose) o Valori (sono immutabili e confrontabili, come RED o 100ml).

Inserireste servizi, chiamereste nuovi valori. Le entità di solito provengono da un repository (che si inietta), ma internamente il repository chiamerebbe nuovo su di esse. Questo aiuta?

1

Di solito il contenitore DI risolve tutte le dipendenze dall'implementazione concreta e gestisce la vita per voi. Ma DI Control-Freak fa opposto: crea l'oggetto concreto usando la parola chiave new, li inietta e gestisce solo la durata della vita. Quindi, nessun altro ha la possibilità di configurare e gestire le dipendenze al di fuori dal tuo codice. E quindi, riutilizzalo o testalo fornendo altre implementazioni o falsi.

Ecco la citazione dal libro di @ mark-Seemann, che risponde alla tua domanda:

ho chiamato Control Freak per descrivere una classe che non sarà controllo relinquish delle sue dipendenze.

Questo accade ogni volta che creiamo una nuova istanza di un tipo utilizzando il nuovo parola chiave-. Quando lo facciamo, dichiariamo esplicitamente che controlleremo la durata di l'istanza e che nessun altro avrà la possibilità di intercettare quell'oggetto particolare.

1

Non ho sentito prima questi termini, ma recependo ciò che so sull'iniezione di dipendenza, li definirei come segue.

Una dipendenza stabile è quella la cui implementazione concreta non varierà, in classe o configurazione, nel tempo o in situazioni diverse.

Una dipendenza volatile è quella la cui implementazione concreta può variare, in classe o configurazione, nel tempo o in situazioni diverse.

Se si può perdonare un esempio in Java, una dipendenza stabile sarebbe StringBuilder. Se stai scrivendo un metodo per creare una stringa, non è necessario che sia iniettato uno StringBuilder, puoi semplicemente crearlo. Idem per ArrayList, HashMap, ecc. Oltre le classi di libreria standard, se si stesse scrivendo un'applicazione bancaria, probabilmente non si inietterebbe uno RunningTotaliser, perché si tratta di un oggetto che aggiunge solo numeri per voi.

Esempi di dipendenze volatili nella libreria standard sono più difficili da elaborare. Un esempio classico potrebbe essere un DataSource - che è un oggetto che incapsula i dettagli di connessione per un database, e quelli che dovrebbero quasi certamente non essere forniti dal codice che sta effettivamente facendo le connessioni.

Problemi correlati