Principio di inversione di dipendenza: come definire "politica di alto livello" e "dettaglio di basso livello" per le altre persone?


13

Sto cercando di spiegare il principio di inversione di dipendenza ai miei colleghi (principalmente junior). Come possiamo definire quale sia la "politica di alto livello" e quale sia il "dettaglio di basso livello" in un software? Ad esempio, se il nostro software automatizza il flusso di lavoro di diverse applicazioni aziendali, perché diciamo che l'automazione del flusso di lavoro è la politica di alto livello e che le applicazioni aziendali sono i dettagli?

Risposte:


11

Nota: questo è stato completamente riscritto dal mio esempio precedente

Pensa alle prese di corrente. In ogni nazione, la politica di alto livello è che le prese di corrente siano sempre le stesse. Non importa da dove provenga l'elettricità (carbone, gas, nucleare), le prese sul muro dovrebbero sempre emettere la stessa quantità di energia, attraverso lo stesso set di connettori.

Ora puoi collegare qualsiasi dispositivo a quella presa, perché tutti hanno un'interfaccia comune, la "spina". La politica di alto livello non deve mai dettare alcuna parte di tali dettagli di implementazione. Basta collegare qualcosa e funziona.

Ora se hai un dispositivo che non desidera l'alimentazione CA - forse funziona su un circuito a 7 V CC - puoi comunque utilizzare questa politica di alto livello, hai solo bisogno di un qualche tipo di adattatore tra l'alimentatore e il dispositivo. E poiché tutti hanno la stessa politica di alto livello, il produttore può integrarla nell'implementazione, senza alcuna modifica della politica di alto livello. La persona che collega l'implementazione alla politica (tu, collegando il tuo laptop) non ha davvero bisogno di capire neanche.

Inoltre, se il produttore desidera vendere lo stesso dispositivo in un altro paese, è sufficiente sviluppare un adattatore diverso. Quindi la stessa implementazione può funzionare con più policy mentre la stessa policy può eseguire più implementazioni.

Questo è un esempio perfetto di inversione di dipendenza.

Ma ecco la parte interessante: torna a quello che ho detto per la prima volta. "Non importa da dove prendi l'elettricità." Anche questo è un dettaglio di implementazione. La politica di alto livello è che tutte le prese di corrente hanno la stessa forma ed emettono lo stesso tipo di alimentazione. I dettagli dell'implementazione di basso livello sono sia la provenienza dell'elettricità sia il suo funzionamento.

In termini di programmazione, ciò significa che la politica di alto livello è l'interfaccia (dove una lingua la supporta. Un'altra forma di DI è la digitazione anatra.) Che fornisce un'API e l'applicazione consuma, ei dettagli dell'implementazione di basso livello sono entrambi applicazione che lo consuma e l'API stessa, nessuna delle quali deve capirsi.

Gli adattatori possono essere utilizzati per adattare la stessa implementazione a politiche diverse.


+1 Crikey. Non sapevo che avrei potuto imparare così tanto da una semplice presa di corrente :)
dreza,

7

L'approccio classico nel riutilizzo del software è quello di costruire componenti che non dipendono da nient'altro (che è ciò che li rende di basso livello) e quindi costruire componenti di livello superiore che dipendono da componenti di livello inferiore. "alto livello" e "basso livello" sono determinati in modo specifico dalla direzione della dipendenza, che non è inerente alla funzione del componente, ma spesso solo una decisione architettonica.

Pertanto, quando le singole applicazioni aziendali vengono create senza alcuna dipendenza dall'automazione del flusso di lavoro, ma il controller del flusso di lavoro ha dipendenze dirette con l'applicazione aziendale, allora dovrebbe essere chiaro che l'automazione del flusso di lavoro è una "politica di alto livello" e l'applicazione aziendale è un componente "basso livello". Si noti che questa struttura non è obbligatoria: se il componente di automazione del flusso di lavoro è un framework generale, che non è neanche accoppiato alle applicazioni aziendali specifiche, ma può essere configurato per servire applicazioni diverse, allora hai già iniziato ad applicare il DIP. In questa situazione, la separazione "alto livello" / "basso livello" potrebbe non avere più senso tra queste due cose.

Pertanto, il nome "inversione di dipendenza" è in qualche modo fuorviante, poiché le dipendenze non vengono "inverse", ma completamente rimosse (o per essere più precisi: cambiate da essere dipendenze di compilazione in dipendenze di runtime).


1
Non proprio. L'inversione avviene perché i livelli inferiori dipendono dall'interfaccia. Applicando il principio di segregazione dell'interfaccia (I in SOLID), quell'interfaccia "appartiene" al client. Quindi il livello inferiore assume metaforicamente una dipendenza dal client.
Michael Brown,

2
@MikeBrown: questo è un possibile punto di vista. Preferisco il punto di vista in cui l'interfaccia non appartiene né a A né a B, ma all'infrastruttura o all'ambiente di A e B.
Doc Brown,

1

Uso una semplice immagine per spiegare DIP. La visione classica dello sviluppo del software è come un processo di costruzione con ogni strato sopra gli strati inferiori che lo supportano. L'uso del principio di inversione di dipendenza è più simile alla costruzione di un cellulare.Mobile sospeso

Piuttosto che i livelli superiori che si trovano sui livelli inferiori, i livelli superiori nell'interfaccia mobile con i livelli inferiori tramite la stringa che li collega. In un certo senso, i livelli inferiori dipendono da quell'interfaccia per il supporto (senza la stringa che cadono). Questo è DIP in breve.


+1 per il bel confronto. In questa immagine, potresti vedere il mio punto: tutti i livelli dipendono dalle interfacce, ma non dai livelli inferiori su quelli superiori o viceversa.
Doc Brown,

Vedo quello che stai dicendo, l'interfaccia non appartiene né al livello superiore né a quello inferiore.
Michael Brown,

1
Non ha chiesto come spiegare DIP, ha chiesto come spiegare quali parti dell'applicazione sono politiche di alto livello e quali sono implementazioni di basso livello. La tua analogia non deve estendersi molto per farlo. Devi solo essere in grado di cambiare le decorazioni senza cambiare la stringa (perché se non puoi allora la politica mobile di alto livello ha troppi dettagli sull'implementazione della decorazione).
pdr,

1
(e, in effetti, puoi costruire un cellulare completamente nuovo con materiali diversi e appendere le stesse decorazioni - che è il punto di Doc Brown)
pdr
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.