Sto facendo l'analisi per un software che avevo in mente da molto tempo. Il suo scopo è trasformare il suono in un'immagine, applicare trasformazioni grafiche su di esso e trasformarlo in suono per ascoltare il risultato. Ho intenzione di scriverlo in C ++ e voglio renderlo il più modulare possibile. Essendo relativamente inesperto nel design modulare, il mio approccio al problema potrebbe essere ingenuo.
L'app sarebbe un assembly di diversi Modules
che hanno DataInputs
e DataOutputs
che potrebbero essere connessi l'un l'altro. Fondamentalmente, quando un modulo ha alcuni dati da inviare, può dire a uno dei suoi output di inviare un DataBlock
a tutti gli input a cui è connesso, e questi input memorizzano il blocco di dati fino a quando il loro modulo non gli dice di leggere per ulteriore elaborazione. Questo produce il seguente diagramma di classe (estratto):
Lapartedicuinonsonoveramentesicuroèqualetipodovrebberoprendereidatiinterni(DataBlock::data
).Finoadorahoinseritovoid*
cometipoperchémiavrebbepermessodiriportarlostaticamenteinqualsiasicosaiovolessichefossesenzatroppiproblemi,mapermolteragionichenonhointenzionedienumerarequi,questoèovviamentenonèunasoluzioneconcuivoglioandare.UnasoluzionechemièvenutainmenteèdicreareuntipoBaseData
astrattodacuierediterebbequalsiasitipodidaticoncreto,inquestomodo:
Pensochequestasarebbeunasoluzioneokay,masonopreoccupatodiusarel'ereditarietà"solo" per far sì che i tipi di dati concreti abbiano qualcosa in comune mentre rappresentano cose completamente diverse. Con questa soluzione, i moduli dovrebbero gestire i blocchi di dati in modo diverso in base al loro tipo (dato dal campo DataBlock::dataType
), che a mio avviso va bene se eseguito correttamente.
Che valore ha questo design? Sono diretto nella giusta direzione o subirò il dolore di mille dei caduti a causa di qualche difetto che ho trascurato? Quali sono le potenziali alternative e / o modelli di design ben noti a tale scopo?