Sto creando un sistema di punteggio per una competizione che è alquanto oscura, ma assomiglia alle Olimpiadi in termini di struttura ad alto livello. Pertanto, farò la mia domanda in termini di una versione astratta e fittizia delle Olimpiadi, poiché tutti possono identificarsi in qualche modo.
Assumi la seguente gerarchia di classi e rollup dei punteggi:
- La classe evento ha uno o più sport (ad esempio, le Olimpiadi del 2012 hanno Decathlon, IndividualMedley, ecc.) e uno o più eventi (un EventScore per squadra per evento calcolato sommando gli SportScores del team per un particolare evento)
- Le classi sportive hanno uno o più elementi (ad esempio, Decathlon ha Shotput, Javelin, ecc.) e uno o più SportScores (un punteggio per squadra per sport calcolato sommando gli ElementScores del team per uno sport particolare)
- La classe elemento ha uno o più round (ad esempio, Shotput ha Throw1, Throw2, ecc.) e uno o più ElementScores (un ElementScore per Team per Element calcolato sommando i RoundScores del team per un elemento particolare)
L'algoritmo del punteggio (chiamiamolo metodo CalculateRoundScore ()) di un RoundScore particolare dipende dall'elemento a cui appartiene il round. Esempi:
- Elemento Shotput: CalculateRoundScore (double ThrowDuration, double ThrowDistance, double GruntVolume) {algoritmo; }
- Elemento Javelin: CalculateRoundScore (double ThrowDuration, double ThrowDistance, double GruntVolume) {algoritmo (diverso dall'algoritmo Shotput anche se i parametri sono gli stessi, che sembrerebbe eliminare il sovraccarico come un'opzione praticabile); }
- 100MeterDash element: CalculateRoundScore (double Time, bool FalseStart) {algoritmo; }
Sebbene io stia cercando una guida generale all'architettura, ecco alcune delle mie domande specifiche:
- Come faccio ad associare diversi metodi di CalculateRoundScore a diversi elementi?
- Devo usare interfacce, ereditarietà, sovraccarico o qualche altro approccio?
- In quale classe (i) dovrebbero essere posizionati i vari metodi di CalculateRoundScore?
Concettualmente, posso immaginare che ogni elemento sia un'interfaccia ICalculateRoundScore. Tuttavia, ciò ha senso solo se creo una classe diversa per ciascun elemento diverso, il che non sembra giusto. Sembra che io abbia bisogno di una sorta di ricerca in cui la classe Round scelga il suo particolare metodo CalculateRoundScore a seconda dell'elemento a cui appartiene, ma non sono sicuro quale sarebbe il modo corretto orientato agli oggetti per farlo.