Tieni presente la metrica di stabilità di Martin e cosa intende per "stabilità":
Instability = Ce / (Ca+Ce)
o
Instability = Outgoing / (Incoming+Outgoing)
Cioè, un pacchetto è considerato completamente instabile se tutte le sue dipendenze sono in uscita: usa altre cose, ma niente lo usa. In tal caso, ha senso solo che quella cosa sia concreta. Sarà anche il tipo di codice più semplice da modificare poiché non lo usa nient'altro e quindi nient'altro può rompere se quel codice viene modificato.
Nel frattempo, quando si ha lo scenario opposto di "stabilità" completa con un pacchetto utilizzato da una o più cose ma non utilizza nulla da solo, come un pacchetto centrale utilizzato dal software, è quando Martin dice questo la cosa dovrebbe essere astratta. Ciò è anche rafforzato dalla parte DIP di SOLI (D), il principio di inversione delle dipendenze, che afferma fondamentalmente che le dipendenze dovrebbero fluire uniformemente verso le astrazioni sia per il codice di livello basso sia per quello di alto livello.
Cioè, le dipendenze dovrebbero fluire uniformemente verso la "stabilità", e più precisamente, le dipendenze dovrebbero fluire verso pacchetti con più dipendenze in entrata rispetto alle dipendenze in uscita e, inoltre, le dipendenze dovrebbero fluire verso le astrazioni. L'essenza della logica dietro a ciò è che le astrazioni forniscono respiro per sostituire un sottotipo con un altro, offrendo quel grado di flessibilità per le parti concrete che implementano l'interfaccia per cambiare senza rompere le dipendenze in arrivo a tale interfaccia astratta.
Are there any significant disadvantages to depending upon
abstractions?
Beh, in realtà non sono d'accordo con Martin qui per il mio dominio, e qui ho bisogno di introdurre una nuova definizione di "stabilità" come in "mancano motivi per cambiare". In questo caso, direi che le dipendenze dovrebbero fluire verso la stabilità, ma le interfacce astratte non aiutano se le interfacce astratte sono instabili (con la mia definizione di "instabile", come incline a cambiare ripetutamente, non di Martin). Se gli sviluppatori non riescono a ottenere le astrazioni corrette e i clienti cambiano idea in modi che rendono i tentativi astratti di modellare il software incompleto o inefficace, allora non beneficiamo più della maggiore flessibilità delle interfacce astratte per proteggere il sistema da cambiamenti di dipendenza a cascata . Nel mio caso personale ho trovato i motori ECS, come quelli trovati nei giochi AAA, tra i motori più stabili a cui abbia mai lavorato e il più flessibile contro le mutevoli esigenze di progettazione e, in un ECS, il flusso delle dipendenze verso la più concreta : verso i dati grezzi, ma tali dati sono altamente stabili (come in ", improbabile che abbia sempre bisogno di essere modificati"). Ho spesso trovato la probabilità che qualcosa che richiede modifiche future sia una metrica più utile del rapporto tra efferenti e accoppiamenti totali nel guidare le decisioni SE.
Quindi modificherei un po 'il DIP e dico semplicemente "le dipendenze dovrebbero fluire verso componenti che hanno la più bassa probabilità di richiedere ulteriori cambiamenti", indipendentemente dal fatto che tali componenti siano interfacce astratte o dati grezzi. Tutto ciò che conta per me è la probabilità che possano richiedere modifiche dirette alla progettazione. Le astrazioni sono utili solo in questo contesto di stabilità se qualcosa, essendo astratto, riduce tale probabilità.
Per molti contesti che potrebbero essere il caso di ingegneri e clienti decenti che anticipano le esigenze del software in anticipo e progettano astrazioni stabili (come in, immutabili), mentre quelle astrazioni offrono loro tutto il respiro che hanno bisogno di scambiare cemento implementazioni. Ma in alcuni domini, le astrazioni potrebbero essere instabili e inclini ad essere inadeguate, mentre i dati richiesti dal motore potrebbero essere molto più facili da anticipare e rendere stabili in anticipo. Quindi, in questi casi, può effettivamente essere più vantaggioso dal punto di vista della manutenibilità (la facilità di cambiare ed estendere il sistema) affinché le dipendenze scorrano verso i dati piuttosto che le astrazioni. In un ECS, le parti più instabili (come nelle parti più frequentemente modificate) sono in genere le funzionalità che risiedono nei sistemi ( PhysicsSystem
, ad esempio), mentre le parti più stabili (come è meno probabile che vengano modificate) sono le componenti che solo sono costituiti da dati non elaborati ( MotionComponent
, ad esempio) utilizzati da tutti i sistemi.