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.