La "D" in SOLID sta per inversione di dipendenza. Ad esempio, se una classe Blacksmith
dipende da Hammer
, dovrei creare esternamente il mio Hammer
e passarlo a Blacksmith
, piuttosto che avere Blacksmith
creare il proprio Hammer
. Questo mi rende più facile dare il mio Blacksmith
a DeluxeMagicHammer
senza dover modificare il suo comportamento.
Questo ha senso quando le mie dipendenze sono definite e istanziate nel codice. Ma cosa succede se le mie dipendenze sono definite nei dati, ad esempio in uno schema JSON o XML? Vorrei passare war-cart-blueprints.xml
al mio Blacksmith
e farle leggere e utilizzare tali informazioni per creare il 4% diWheel
s, il 2% diAxle
s, un% diCabin
, ecc. E metterle insieme in un %codice%. Sembra che ora sto creando un accoppiamento stretto tra WarCart
e questi vari componenti.
Per soddisfare SOLID, devo separare queste dipendenze in qualche modo? Avrei bisogno di un Blacksmith
, WheelFactory
e AxleFactory
, ognuno dei quali guarda lo stesso CabinFactory
per costruire i componenti di cui sono responsabili, e poi li passa a war-cart-blueprints.xml
per l'assemblaggio? Cosa succede se ci sono alcune dipendenze tra Blacksmith
e WheelFactory
, tali che avrebbero bisogno di comunicare per portare a termine le loro rispettive attività? Ad esempio, AxleFactory
potrebbe avere un diametro del foro centrale, ma i blueprints specificano solo quel diametro nelle specifiche Wheels
. Oppure, le dimensioni di Axle
sono determinate da un calcolo complesso basato sulla lunghezza di Cabin
s e il numero di Axle
s.
Sembra che sarebbe molto più semplice lasciare Wheel
creare e assemblare i componenti lei stessa, specialmente se è l'unica che li userà mai.