Un incarico nella mia classe di ingegneria del software è progettare un'applicazione che può riprodurre forme diverse in un particolare gioco. Il gioco in questione è Mancala, alcuni di questi giochi sono chiamati Wari o Kalah. Questi giochi differiscono in alcuni aspetti, ma per la mia domanda è importante sapere che i giochi potrebbero differire in quanto segue:
- Il modo in cui viene gestito il risultato di una mossa
- Il modo in cui viene determinata la fine del gioco
- Il modo in cui viene determinato il vincitore
La prima cosa che mi è venuta in mente di progettare questo è stato usare il modello di strategia, ho una variazione negli algoritmi (le regole reali del gioco). Il design potrebbe assomigliare a questo:
PoihopensatoamestessochenelgiocodiMancalaeWariilmodoincuivienedeterminatoilvincitoreèesattamentelostessoeilcodicesarebbeduplicato.Nonpensochequestosiaperdefinizioneunaviolazionedellaregola"una regola, un posto" o il principio di ESSERE VIVENTE visto che un cambiamento nelle regole di Mancala non significa automaticamente che anche la regola debba essere cambiata in Wari. Tuttavia dal feedback che ho ricevuto dal mio professore ho avuto l'impressione di trovare un design diverso.
Poi ho pensato a questo:
Ognigioco(Mancala,Wari,Kalah,...)avrebbesolounattributodeltipodiinterfacciadiogniregola,cioèWinnerDeterminer
esec'èunaversionediMancala2.0cheèlastessadiMancala1.0eccettopercomeililvincitoreèdeterminatopuòusaresololeversionidiMancala.
Pensochel'implementazionediquesteregolecomemodellostrategicosiacertamentevalida.Mailveroproblemaarrivaquandovoglioprogettarloulteriormente.
Nellaletturadelmodellodimetododelmodellohoimmediatamentepensatochepotesseessereapplicatoaquestoproblema.Leazionichevengonoeseguitequandounutenteeffettuaunamossasonosemprelestesseenellostessoordine,cioè:
- depositalepietreneibuchi(questoèlostessopertuttiigiochi,quindisarebbeimplementatonelmetodostesso)
- determinailrisultatodellospostamento
- determinaseilgiocoèfinitoacausadellospostamentoprecedente
- seilgiocoèfinito,determinachihavinto
Questiultimitrepassaggisonotuttinelmodellodistrategiadescrittosopra.Stoavendounsaccodiproblemiacombinarequestidue.Unapossibilesoluzionechehotrovatosarebbequelladiabbandonareilmodellodistrategiaefarequantosegue:
Non vedo davvero la differenza di design tra il modello di strategia e questo? Ma sono sicuro di aver bisogno di usare un metodo di template (anche se ero altrettanto sicuro di dover usare un modello di strategia).
Inoltre non riesco a determinare chi sarebbe responsabile della creazione dell'oggetto TurnTemplate
, mentre con lo schema di strategia sento di avere famiglie di oggetti (le tre regole) che avrei potuto facilmente creare usando un pattern factory astratto. Avrei quindi un MancalaRuleFactory
, WariRuleFactory
, ecc. E creerebbero le istanze corrette delle regole e mi restituirebbero un oggetto RuleSet
.
Diciamo che uso la strategia + modello di fabbrica astratto e ho un oggetto RuleSet
che ha algoritmi per le tre regole in esso. L'unico modo in cui ritengo di poter ancora utilizzare lo schema del metodo template con questo è passare questo oggetto RuleSet
al mio TurnTemplate
. Il "problema" che emerge è che non avrei mai avuto bisogno delle mie implementazioni concrete di TurnTemplate
, queste classi sarebbero diventate obsolete. Nei miei metodi protetti in TurnTemplate
potrei semplicemente chiamare ruleSet.determineWinner()
. Di conseguenza, la classe TurnTemplate
non sarebbe più astratta ma dovrebbe diventare concreta, è quindi ancora un modello di metodo del modello?
Per riassumere, sto pensando nel modo giusto o mi manca qualcosa di facile? Se sono sulla strada giusta, come faccio a combinare un modello di strategia e un modello di metodo del modello?