Sto lavorando a un'applicazione che crea musica da sola. Sto cercando feedback per il mio design OO finora. Questa domanda si concentrerà su una parte del programma.
L'applicazione produce% oggettiTune
, che sono i prodotti musicali finali. Tune
è una classe astratta con un metodo astratto play
. Ha due sottoclassi: SimpleTune
e StructuredTune
.
SimpleTune
possiede un Melody
e un Progression
(sequenza di accordi). L'implementazione di play
riproduce contemporaneamente questi due oggetti. StructuredTune
possiede due istanze Tune
. È proprio play
che riproduce i due Tune
s uno dopo l'altro secondo uno schema (attualmente solo ABAB
).
Melody
è una classe astratta con un metodo play
astratto. Ha due sottoclassi: SimpleMelody
e StructuredMelody
.
SimpleMelody
è composto da una serie di note. Invocare play
su di esso suona queste note una dopo l'altra. StructuredMelody
è composto da una matrice di oggetti Melody
. Invocare play
su di esso riproduce questi Melody
ies uno dopo l'altro.
Penso che stai iniziando a vedere lo schema. Progression
è anche una classe astratta con un metodo play
e due sottoclassi: SimpleProgression
e StructuredProgression
, ciascuno composto in modo diverso e riprodotto in modo diverso.
SimpleProgression
possiede una matrice di accordi e play
s in sequenza. StructuredProgression
possiede un array di Progression
s e l'implementazione play
li riproduce in sequenza.
OgniclassehaunacorrispondenteclasseGenerator
.Tune
,Melody
eProgression
sonoabbinatiallecorrispondenticlassiTuneGenerator
,MelodyGenerator
eProgressionGenerator
,ciascunaconunmetodogenerate
astratto.AdesempioMelodyGenerator
definisceunmetodoMelodygenerate
astratto.
Ciascunodeigeneratorihaduesottoclassi,Simple
eStructured
.Quindi,adesempio,MelodyGenerator
haunasottoclasseSimpleMelodyGenerator
,conun'implementazionedigenerate
cherestituisceunSimpleMelody
.
(Èimportantenotarecheimetodigenerate
incapsulanoalgoritmicomplessi,chesonopiùdiunsemplicemetodofactory.AdesempioSimpleProgressionGenerator.generate()
implementaunalgoritmopercomporreunaseriedioggettiChord
,chesonousatiperistanziareilrestituitoSimpleProgression
).
OgnigeneratoreStructured
utilizzainternamenteunaltrogeneratore.ÈungeneratoreSimple
comepredefinito,maincasispecialipuòessereungeneratoreStructured
.
Parti di questo design hanno lo scopo di consentire all'utente finale attraverso la GUI di scegliere quale tipo di musica deve essere creato. Ad esempio, l'utente può scegliere tra "melodia" ( SimpleTuneGenerator
) e "full tune" ( StructuredTuneGenerator
). Altre parti del sistema non sono soggette al controllo diretto dell'utente.
La mia domanda riguardo a questo design è piuttosto specifica:
Quando guardo il mio disegno, sembra l'equivalente progettuale della 'duplicazione del codice': 'duplicazione della classe' o 'design-duplicazione' . Puoi vedere chiaramente a cosa mi riferisco se osservi il diagramma sopra.
La mia domanda è divisa in due:
- La mia intuizione è corretta? Questa duplicazione o modello ricorrente nel design è una brutta cosa?
- Se lo è, come posso progettarlo in modo diverso e più efficiente?