Questo potrebbe essere un problema di X Y, ma qui c'è la mia situazione.
Ho una base di codice QT5 C ++ il cui compito è quello di consentire la configurazione di una "catena di processi". Una "catena di processi" qui significa una lista di elementi collegati che eseguono in ordine sequenziale, prendendo un singolo input e restituendo un singolo output al successivo "elemento di processo" nella catena. Alla fine della catena, questi dati vengono salvati.
Ogni elemento del processo è configurabile, e mentre ciascuno lavora sugli stessi dati ed emette lo stesso tipo di dati, ognuno fa qualcosa di completamente diverso sotto. Prendono parametri di configurazione molto diversi, ma condividono la stessa interfaccia. Ognuno ha un costruttore diverso, uno può prendere un singolo float, un altro una matrice, ecc ... nel suo costruttore.
Ci sono dozzine di tipi di elementi del processo che crescono ad ogni iterazione del software. Ogni tipo di elemento del processo deve essere serializzato (attualmente tramite JSON) e ha bisogno che la sua configurazione sia configurata attraverso una GUI, a cui ogni parametro da configurare potrebbe non avere lo stesso tipo di widget GUI (ad esempio, potrebbe essere necessaria solo una modifica riga, un'altra potrebbe aver bisogno di pulsanti di opzione, un altro di una casella di selezione, ma tutti configurano lo stesso elemento di processo).
Il mio problema è che attualmente lo realizzo in modo molto accoppiato. La classe dell'elemento del processo deve conoscere e definire il proprio formato JSON, come costruirsi da json e essenzialmente deve aggiungersi a una mappa globale non ordinata di classname - > costruttori e classname - > formati json.
Al momento non ho un modo per aggiungere la possibilità di specificare il tipo di GUI, questo è quello che mi ha portato a credere che il metodo attuale sia insostenibile.
I miei problemi con il mio approccio attuale sono i seguenti:
- Unisco il modo in cui la serializzazione funziona con la classe stessa.
- Accetto implicitamente il display (attualmente tutti i tipi di gui sono uguali, ma ora i requisiti sono cambiati e richiedono alcuni tipi di gui per essere diversi).
Voglio accoppiare questa funzionalità, ma non sono soddisfatto di altre possibili soluzioni. La creazione di una "classe di serializzazione" per ogni elemento del processo sembra odore di codice, e questo dovrebbe essere duplicato per la visualizzazione. Vorrei anche evitare di fare un lavoro che dovrebbe essere replicato per ogni classe. Attualmente ho una macro per automatizzare l'aggiunta statica di mapping di nomi di classe alle mappe di classi globali.
Ecco una parte di ciò che il gui ha bisogno di chiarimenti:
Qualistrategiepossoimpiegareperrisolvereilproblemadiaccoppiamentodiprogettazionechestoavendo?Indefinitiva,esisteunmodoperseparareefficacementelaserializzazioneelavisualizzazionedagli"oggetti codice" (elementi del processo) nella mia circostanza?