Nel seguente scenario:
Una factory restituisce un oggetto di una classe logica:
ILogicClass object = factory.GetByRequirements(reqs);
Quindi voglio invocare un metodo e ottenere dei risultati che sono nella stessa forma per tutte le classi logiche concrete:
output = object.GetResults(...)
e quindi usa il risultato.
Immagina che le implementazioni concrete abbiano bisogno di diverse opzioni per produrre il risultato:
GetResult(integer, integer) for one logic class
GetResult(integer, string) for another logic class implementation
Le opzioni per skinare questo particolare gatto che posso inventare sono:
GetResult(integer, integer, integer, string)
Che sta passando TUTTI gli argomenti al metodo in modo che ogni implementazione concreta possa utilizzare i dati richiesti e ignorare il resto
Pro: strongmente tipizzato
Contro: Ogni volta che aggiungi un nuovo parametro, questo deve essere implementato su TUTTE le implementazioni di ILogicClass e la maggior parte non lo userà, il che è uno spreco e non elegante.
Un'altra opzione è:
GetResult(Options opts)
Pro: strong tipizzazione, non è necessario ridefinire l'interfaccia e modificare i tipi di calcestruzzo ogni volta che è necessario qualcosa di nuovo
Contro: L'allocazione di un oggetto extra e la maggior parte del suo contenuto saranno irrilevanti per altre implementazioni.
Una terza opzione sarebbe:
GetResult(dynamic)
Pro: puoi passare quello che vuoi senza creare oggetti aggiuntivi o passare dati irrilevanti
Contro: errore incline alle eccezioni di runtime
Apprezzo che non ci siano altre soluzioni a questo problema, ma esiste un altro modello che non ho considerato o un approccio migliore a questo problema?