Che cosa significa in realtà "le astrazioni non dipendono dai dettagli" significa?

6

La maggior parte dei lettori conoscerà il famoso principio di inversione di dipendenza di Bob Martin, che afferma:

  1. I moduli di alto livello non dovrebbero dipendere da moduli di basso livello. Entrambi dovrebbero dipendere dalle astrazioni

  2. Le astrazioni non dovrebbero dipendere dai dettagli. I dettagli dovrebbero dipendere dalle astrazioni

Credo di capire tutto molto bene, tranne che per la prima frase della seconda riga: "Le astrazioni non dovrebbero dipendere dai dettagli". Cosa significa esattamente? Quale sarebbe un semplice esempio di un'astrazione che dipende da un dettaglio?

    
posta Craig Schwarze 04.04.2011 - 07:39
fonte

2 risposte

12

Quello che sta dicendo qui è che dovresti evitare uno scenario in cui una classe base prende una dipendenza per soddisfare la necessità di un discendente. Diamo un'occhiata al caso di un interruttore e al suo discendente TimedSwitch. TimedSwitch è un interruttore che si ripristina automaticamente dopo un certo periodo di tempo. Abbiamo già la classe TimedObject, quindi sarebbe logico che TimedSwitch ne derivasse ... tuttavia TimedSwitch deriva già da Switch. Quindi, al fine di soddisfare le esigenze di TimedSwitch, Switch erediterà da TimedObject anche se non ha bisogno di quella funzionalità stessa.

Lo Switch (astrazione) dipende dai dettagli di TimedSwitch. Per correggere questa violazione del DIP, abbiamo TimedSwitch implementare ITimedObject e delegare a una classe TimedObject contenuta (preferisci la composizione sull'ereditarietà).

Un altro esempio più generico è l'approccio a più livelli. Gli strati di livello superiore sono astrazioni e nella maggior parte dei casi dipendono dai dettagli. DIP dice che invece gli strati inferiori dovrebbero conformarsi a un'interfaccia da cui entrambi dipendono. Pertanto, la dipendenza viene invertita dal livello superiore a seconda del livello inferiore in entrambi i livelli, a seconda dell'interfaccia.

    
risposta data 04.04.2011 - 09:35
fonte
2

Il modulo controller usa l'astrazione ControllableThing (interfaccia) per controllare un modulo Thing.

Una cattiva progettazione avrebbe l'interfaccia ControllableThing che esponeva il numero di luci a LED nella società FizzBuzz. In origine il progetto era stato scritto. setLed1 (stato boolen) setLed2 (stato boolen) setLed3 (stato boolen) setLed4 (stato boolen)

quel genere di cose ...

Quindi ora, entrambi i moduli si romperanno quando andremo a controllare un modulo di coniglio intelligente Nazbatag.

Il principio di DI sta proprio nel far sì che il grafico delle dipendenze del sistema abbia percorsi molto brevi dai moduli alle interfacce.

Quando le astrazioni sono fatte bene i sistemi non si romperanno la prossima settimana.

Il giudizio dovrebbe essere usato, perché la tentazione di creare interfacce generiche porta cose che assomigliano a SOAP e al modello di dispositivo Unix. Un sistema meta può essere d'aiuto se stai architettando sistemi di sistemi. C'è una forza progettuale che spinge verso linguaggi dinamici e rilegature in tempo di chiamata. Non è necessario o utile darci dentro tutto il tempo.

    
risposta data 04.04.2011 - 08:03
fonte

Leggi altre domande sui tag