2009-11-10 17 views
18

Negli ultimi due giorni, ho letto molto sull'iniezione/inversione dipendenza del controllo/inversione della dipendenza. I penso a che, ora la mia comprensione del concetto è molto meglio. Ma ancora non ottengo quanto segue da wikipedia:Le astrazioni non dovrebbero dipendere dai dettagli. I dettagli dovrebbero dipendere dalle astrazioni?

A. I moduli di livello superiore non devono dipendere da moduli di basso livello. Entrambi dovrebbero dipendere dalle astrazioni. B. Le astrazioni non dovrebbero dipendere dai dettagli. I dettagli dovrebbero dipendere dalle astrazioni.

comprendo la parte moduli di alto livello non dovrebbe dipendere moduli di basso livello. Ma sono confuso riguardo alle astrazioni e ai dettagli. Qualcuno, per favore, li semplifichi per me. Grazie.

risposta

28

Significa che se i dettagli cambiano, non dovrebbero influire sull'astrazione. L'astrazione è il modo in cui i client visualizzano un oggetto. Esattamente ciò che accade all'interno dell'oggetto non è importante. Prendiamo una macchina per esempio, i pedali e il volante e la leva del cambio sono astrazioni di ciò che accade all'interno del motore. Non dipendono dai dettagli perché se qualcuno cambia il mio vecchio motore per uno nuovo, dovrei comunque essere in grado di guidare la macchina senza sapere che il motore è cambiato.

I dettagli, d'altra parte, devono essere conformi a ciò che dice l'astrazione. Non vorrei implementare un motore che improvvisamente causi il raddoppio della velocità della macchina. Posso ri-implementare i freni in qualsiasi modo voglio finchè esternamente si comportano allo stesso modo.

+2

Mi piace che l'OP abbia avuto problemi nel comprendere questo concetto - una risposta succinta e chiara grazie. –

1

Esempio di astrazione e dettagli: un flusso fornisce un'interfaccia per leggere un token. Questa è un'astrazione.

Un'implementazione dello stream del flusso è destinata a implementare l'interfaccia definita dall'astrazione: è per questo che dipende da esso. Se fornisce un'interfaccia diversa (una per leggere 100 caratteri alla volta) non può pretendere di implementare la stessa astrazione.

1

Pensa al lavoro che devi chiamare e quanto lontano è da dove stai codificando. C'è uno spettro lì; la tua posizione su di esso rappresenta la quantità di lavoro che devi fare per richiamare quella funzionalità.

Le astrazioni spostano quella posizione più vicino al codice che si sta scrivendo. Ad esempio, se devi chiamare un servizio web, puoi 1) scrivere il codice chiamante direttamente dove devi usarlo, oppure 2) mettere questi dettagli dietro un'astrazione (come un'interfaccia).

In questo caso, il numero 1 ti avvicina al servizio web sullo spettro, mentre il n. 2 ti avvicina al tuo lavoro. Si può dire che l'astrazione sia una misura di quanto lontano devi allungare la tua mente per comprendere il lavoro che hai bisogno di fare.

Ciò significa che ogni pezzo di lavoro può essere estratto in modo che sia "più vicino" al codice che lo utilizza. Avendo entrambi i lati di un'operazione dipendono dalle astrazioni, entrambi diventano più facili da capire, e nessuna delle due parti deve conoscere la differenza tra loro - questo è il lavoro dell'astrazione.

Wow, era astratto.

3

Un caso interessante in cui un'astrazione dipende dai dettagli è quando si definisce un'interfaccia che eredita da IDisposable.Date un'occhiata al seguente astrazione:

public interface ICustomerRepository : IDisposable 
{ 
    Customer GetById(Guid id); 
    Customer[] GetAll(); 
} 

Nota: IDisposable è un'interfaccia specifica per NET, ma si può facilmente immaginare la vostra interfaccia che contiene un metodo Dispose stesso anziché ereditare da tale interfaccia.

Potrebbe sembrare conveniente per il ICustomerRepository da implementare IDisposable. In questo modo ogni chiamante può disporre del repository e in questo modo l'implementazione può disporre della connessione o dell'unità di lavoro che utilizza internamente.

L'interfaccia tuttavia è ora scritta con una certa implementazione in mente, poiché non è affatto ovvio che tutte le implementazioni ICustomerRepository debbano pulire tutte le risorse. L'interfaccia quindi perde i dettagli di implementazione e quindi viola il principio di inversione delle dipendenze.

Problemi correlati