Recentemente ho letto del Dependency-Inversion Principal in Robert.C. l'eccellente libro di Martin Agile Principals, Patterns and Practices in C#. Tuttavia, c'è un aspetto di questo principio che sento di non comprendere appieno.In che modo il Dipendente-Inversion Principal (DIP) riduce la necessità di apportare modifiche ai moduli dipendenti quando cambiano le loro dipendenze?
Robert spiega che quando i moduli di alto livello dipendono da moduli di livello inferiore, le modifiche nei moduli di livello inferiore possono far cambiare anche i moduli di livello superiore. Egli dimostra con il seguente esempio:
public class Button
{
private Lamp lamp;
public void Poll(){
if(/*some condition*/)
Lamp.TurnOn();
}
}
A proposito di questo codice di Robert dice "La classe Button dipende direttamente dalla classe Lamp Questa dipendenza implica che Button sarà influenzato da cambiamenti della lampada".
come la vedo io ci sono due possibili tipi di cambiamento che potremmo fare per la classe della lampada:
1) si può decidere di modificare l'implementazione interna della classe ma senza intaccare l'interfaccia pubblica.
2) Potremmo decidere di cambiare l'interfaccia pubblica per dire passare un parametro al metodo TurnOn.
Quello che non capisco è che nel primo caso perché le nostre modifiche comportano un cambiamento nella classe Button? L'interfaccia pubblica a Lamp non è cambiata, quindi perché Button dovrebbe cambiare?
Nel secondo caso posso vedere che questo ci richiederebbe di cambiare Button. Ma in questo caso come dipenderebbe da un'astrazione questo? Sicuramente, se ho un valido motivo per cambiare l'interfaccia con la lampada, cambierei anche l'interfaccia nell'astrazione dalla quale dipendono la lampada e il pulsante. In questo caso, quindi, devo cambiare Button in ogni caso in quanto l'astrazione da cui dipende è cambiata.
Mi rendo conto che esistono altri vantaggi per DIP come la riutilizzabilità dei moduli di livello superiore, la proprietà delle interfacce da parte dei moduli di livello superiore e la possibilità di scegliere le implementazioni delle dipendenze in fase di esecuzione, tuttavia sto cercando la necessità che i moduli dipendenti cambino quando l'interfaccia ad un modulo di livello inferiore cambia e/o perché i cambiamenti interni in un modulo dipendente possono causare cambiamenti nei moduli di livello superiore.
Grazie Daniel. Vedo che cambiare il costruttore di un servizio concreto è un esempio in cui, a seconda dell'interfaccia, si isola la classe dipendente dal cambiamento (supponendo che non faccia la costruzione), tuttavia sento ancora che mi manca qualcosa. Robert parla della dipendenza transitoria nel suo articolo: se A-> B e B-> C allora un cambiamento nella classe C può forzare il cambiamento nella classe B _e nella classe A_. Ancora non capisco come possa essere così. Anche se abbiamo apportato una modifica all'interfaccia pubblica di C, perché questo influirebbe su A? – John
se la classe c ottiene una nuova dipendenza e quella dipendenza non è disponibile in classe b, ma è disponibile in a, quindi a potrebbe essere necessario fornire tale dipendenza a b così b può fornirla a c – Daniel