Abbiamo un insieme di classi che derivano da un set comune di interfacce tali cheme codifica in un angolo
IFoo-> BasicFoo, ReverseFoo, ForwardFoo
IBar -> UpBar, DownBar, SidewaysBar
IYelp -> Yip, Yap, Yup
in cui il costruttore per gli sguardi del Foo come Foo(IBar, IYelp)
Questi elementi sono utilizzati in tutto il progetto.
Esiste un'altra classe che ha un metodo la cui firma è public double CalcSomething(IFoo, IAnotherClass)
che viene applicata a un certo punto a ogni Foo. Abbiamo ricevuto una richiesta dall'alto che una particolare composizione di un oggetto, ad esempio uno BasicFoo(UpBar,Yip)
, utilizza un algoritmo diverso da quello trovato in CalcSomething
.
Il mio primo istinto era di cambiare l'interfaccia di IFoo in modo da spostare la logica al livello di classe Foo, cambiare il costruttore in Foo(IBar, IYelp, IStrategy)
e poi inserire gli oggetti di Foo in questa logica. Sfortunatamente ci è stato anche detto che la progettazione dell'architettura stabilisce che non ci sono dipendenze tra IFoo
, le sue implementazioni e IAnotherClass
. Sono irremovibili su questo.
Ok, certo, allora ho pensato di usare un modello di visitatore ma ... come? L'intero punto di fare la composizione era in modo che nessun'altra classe potesse vedere i dettagli di implementazione. Riflessione per guardare dentro gli oggetti, rompendo totalmente l'incapsulamento? Oh diavolo no.
Quindi sono venuto qui perché sono in perdita. Qualcuno ha qualche suggerimento su come possiamo trattare un caso speciale di una delle composizioni senza modificare la composizione o interrompere l'incapsulamento? Deve esserci una soluzione semplice che sto guardando troppo.
Modifica:
Inizio offensivo rimosso. Modificato "gestito appositamente" in un significato più descrittivo.
Non fallisce mai - quando una domanda inizia cercando di giustificare la mancata pubblicazione del codice, il tentativo risultante di evitare di postare il codice rende quasi impossibile capire l'intero mess. – delfuego
rimosso la parte offendente – wheaties
Puoi chiarire cosa intendi con "trattato in modo speciale"? –