Ho diverse classi con un grafico di dipendenza ragionevolmente complesso (ma aciclico). Tutte le dipendenze sono nella forma: class X
istanza contiene un attributo di class Y
. Tutti questi attributi vengono impostati durante l'inizializzazione e non vengono mai più modificati.
Ogni costruttore di classi ha solo un paio di parametri e ogni oggetto conosce i parametri corretti da passare ai costruttori degli oggetti che contiene. class Outer
si trova nella parte superiore della gerarchia delle dipendenze, cioè nessuna classe dipende da essa.
Attualmente, il livello dell'interfaccia utente crea solo un'istanza Outer
; i parametri per il costruttore Outer
derivano dall'input dell'utente. Ovviamente, Outer
nel processo di inizializzazione, crea gli oggetti di cui ha bisogno, che a loro volta creano gli oggetti di cui hanno bisogno, e così via.
Il nuovo sviluppo è che un utente che conosce il grafico delle dipendenze potrebbe desiderare di raggiungerlo in profondità, e impostare i valori di alcuni degli argomenti passati ai costruttori delle classi interne (essenzialmente sovrascrivendo i valori usati al momento). Come dovrei cambiare il design per supportare questo?
Potrei mantenere l'approccio corrente in cui tutte le classi interne sono create dalle classi che ne hanno bisogno. In questo caso, le informazioni su "sostituzioni dell'utente" devono essere passate al costruttore della classe Outer
in una struttura user_overrides
complessa. Forse user_overrides
potrebbe essere la rappresentazione logica completa del grafico delle dipendenze, con le sostituzioni associate ai bordi appropriati. Outer
class passerebbe user_overrides
a ogni oggetto che crea, e farebbero lo stesso. Ogni oggetto, prima di inizializzare oggetti di livello inferiore, troverà la sua posizione in quel grafico e controllerà se l'utente ha richiesto un override a uno qualsiasi degli argomenti del costruttore.
In alternativa, potrei riscrivere tutti i costruttori degli oggetti per prendere come parametri gli oggetti completi di cui hanno bisogno. Pertanto, la creazione di tutti gli oggetti interni verrebbe spostata all'esterno dell'intera gerarchia, in un nuovo livello controller che si trova tra Outer
e livello UI. Il livello del controller attraverserebbe essenzialmente il grafico delle dipendenze dal basso, creando tutti gli oggetti man mano che procede. Il livello controller dovrebbe chiedere agli oggetti di livello superiore i valori dei parametri per gli oggetti di livello inferiore ogni volta che il parametro pertinente non viene fornito dall'utente.
Nessun approccio sembra terribilmente semplice. C'è qualche altro approccio? Questo problema si è presentato abbastanza in passato per avere uno schema di cui posso leggere? Sto usando Python, ma non penso che importi molto a livello di design.