I miei colleghi e io stiamo lottando con un problema di progettazione. Proverò a spiegare la situazione:
Abbiamo un numero di componenti diversi (chiamiamoli plugin), che prendono un input, fare qualcosa con esso e restituire un output. Ogni plugin richiede a input diversi (e diversi tipi di) e restituisce un altro numero (e diversi tipi di) uscite. Alcuni degli input e output si sovrappongono, il che significa che un output può essere calcolato da diversi plugin e uno l'input può essere richiesto da diversi plugin. Oltre a questo, ne abbiamo alcuni "meta-plugins" che combinano input o output simili di diversi plugin.
E abbiamo una classe che ha il compito di chiamare un plugin, chiamiamolo un gestore, ma non lo sa quale, solo che è un plugin. Sfortunatamente, gli input e gli output hanno quasi nulla a che fare con l'altro, e non può davvero essere trattato polimorfico.
Ciò che stiamo facendo in questo momento, è mettere l'in-e output in modo eterogeneo mappe, con chiave enum. Il gestore chiama PluginBase :: Evaluate (inputmap, outputmap) sull'oggetto plugin derivato e l'oggetto va a lavorare. Ma ora i plugin devono scorrere sulla mappa, vedere quale input e output può davvero lavorare con. Inoltre, ci sono molti casting coinvolti, come potresti immagina adesso.
Idealmente, i plugin avrebbero ciascuno un'interfaccia sana per il lavoro, ad es.
double PluginA::GetHam(double x);
std::string PluginB::GetSpam(int x, int y);
ma il gestore non sarebbe in grado di lavorare con loro.
Ho creato un esempio compilabile di quello che stiamo facendo in questo momento, ma attenzione, è esattamente orribile come pensi è.
Modifica: Forse questo è un modo migliore per pensarci: il gestore ha vari dati, i tuoi dati di input. Diciamo che vuoi un comportamento che, se richiesta eOutput :: HAM, ti dà tre volte eInput :: TWO. Implementa un plugin Thrice e dagli le necessarie mappe di input e output. Puoi cambiare il modo in cui ottieni da TWO (o qualsiasi altra combinazione di eInput) a HAM implementando il tuo plugin, ma non hai i dati di input per arrivare a HAM senza il gestore.