|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Refactoring delle gemme e controllo ad eventi degli effetti della caduta
Principalmente questo refactoring si dovrà occupare di:
- creare una gerarchia di classi che includerà tutte quelle che possiamo definire Droppable (Stone, Gem, Flashing Gem, Chest, BigGem). Secondo me a questo punto ci dovremmo fermare e verificare che tutto funzioni e tutti i test passino... Il refactoring da effettuare successivamente sarà: - creare un'interfaccia DroppableController, da cui deriveranno tutti i Controller delle rispettive classi della gerarchia sopra - implementare un meccanismo in ogni classe della gerararchia che allochi e restituisca il controller che si dovrà occupare di gestire gli eventi da applicare ai Droppable - implementare gli eventi ed un gestore di eventi (che potrebbe essere il controller) Ad esempio questa dovrebbe essere la gestione dell'evento "una gemme si è fermata" : DropapbleController controller = droppable.getController(); controller.onHalt(grid); - la gestione dell'evento "tutte le gemme sono ferme" provocherà i crush, che lavoreranno in maniera diversificata a seconda del Droppable Questa è la mia proposta...a voi |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Faccio 2 puntualizzazioni per vedere se ho capito
1) Ci vuole ovviamente l'interfaccia Droppabel 2) La gestione degli eventi comporta anche la creazione di 2 interfaccie: -quella di chi genera gli eventi -quella di chi li ascolta, il listener |
|
|
|
|
|
#3 | ||
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Quote:
Se esisterà una sola classe evento e ci sarà un tipo a discriminare l'evento generato, basta uno switch (soluzione che scala male)... Se invece facciamo una classe evento per ogni evento da gestire allora bisogna definire un'interfaccia per il listener, mentre per chi genera gli eventi non ci sarà bisogno di interfaccia... Vediamo un po' come gestirla... I generatori di eventi potrebbero essere due: Grid e GridController... Questi sono sicuri... Il listener dovrebbe essere GridController... Ditemi voi come pensereste di organizzare la cosa... PS: ho pensato che, dopo, ad eventi sarebbe possibile gestire qualsiasi cosa che fa GridController...come la gestione dei vari timestamp...l'inserimento di una nuova gemma... Ditemi voi... |
||
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Quote:
Quote:
GridControler genera l'evento e il CrushGemListener si registra all'evento |
||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
mmmhhh...quindi te faresti un listener per ogni evento ? Non ci avevo pensato sinceramente...
Io invece farei così, supponendo di definire una classe per ogni evento: Codice:
class DroppableHaltedEvent
{
public processEvent(Listener listener)
{
listener.onDroppableHalted();
}
}
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Quindi tu faresti generare a GridController degli eventi che poi GrdiContyroller deve gestire....
![]() Mi sembra un po' masochistico A parte gli scherzi, penso che l'idea principale che deve guidare il refactoring di GridController è prorio quella di dividere le responsabilità. Quello che secondo me dobbiamno fare è eliminare quell'update in GridController e trasformarlo in una semplice generazione di eventi. Ora per amore di Ingegneria del Software dovrebbe essere possibile che all'evento "gemsPair ferma" possano corrispondere più azioni, ovvero più listener. Quindi in conclusione io farei: - N listener in base alle responsabilità, ovvero a che cosa deve fare. Io vedo bene come listener i GemAction...alla fine sono quelli i compiti da svolgere. - M eventi che notificano i momenti chiave del gioco in realtà ciò che penso io è un pattern observer, dove gli observable sono "eventi", ovvero accadimenti del gioco Codice:
------------------------------------------------------------------
GridController.registerEventGemsPairStop(CrushGemListener);
------------------------------------------------------------------
if(!gemsPairsCanMoveDown)
for(registeredListener)
notifyEvent()
------------------------------------------------------------------
public void notifyEvent()
{
processEvent()
}
Così a GridController la facciamo dimagrire in fretta
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
La proposta mi sembra buona, preferisco ovviamente l'interfaccia e poi, eventualmente, una classe astratta base (proprio se necesaria). L'importante e' suddividere il refactoring in piccoli passi verificabili e ben testabili. Non voglio un lungo refactoring che ha bisogno di essere concluso prima che il tutto torni a funzionare. E poi, voglio che le cose si semplifichino: non fatevi prendere la mano dal refactoring aggiungendo piu' flessibilita' di quella strettamente necessaria. Cose tipo per l'Amore dell'Ingegneria del Software mi suonano gia' male: diciamo per l'amore di semplicita' e fate le cose semplici
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Quote:
![]() Comunque era ironico
Ultima modifica di Bonfo : 03-04-2006 alle 14:50. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ripeto...io non farei un listener per ogni azione da svolgere...
Io invece a questo punto farei un solo listener che contenga i vari metodi da richiamare... Codice:
class DroppableHaltedEvent implements GridEvent
{
Droppable droppable;
public DroppableHaltendEvent(Droppable droppable)
{
this.droppable = droppable;
}
public processEvent(GridEventHandler handler)
{
handler.onDroppableHalted(droppable);
}
}
class GridEventHandler
{
....
public notifyEvent(GridEvent event)
{
event.processEvent(this);
}
public onDroppableHalted(Droppable droppable)
{
DropapbleController controller = droppable.getController();
controller.onHalt(grid);
}
}
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Cionci a me la tua soluzione piace molto
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Piace anche a me. A occhio non c'e' un'indirezione di troppo? (non ci giuro affatto, probabilmente ho perso qualcosa io).
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Però c'è una cosa che non mi sconfiffera...questo affare resta sicrono
Il mio dubbio è questo: Codice:
if(!gemsPairsCanMoveDown)
for(registeredListener)
notifyEvent(new DroppableHaltedEvent (droppable))
Codice:
if(!gemsPairsCanMoveDown)
for(registeredListener)
handler.onDroppableHalted(droppable);
Intendo praticamente mettere in coda gli eventi... Dentro update di GridController avverrà l'update di Grid (che metterà in coda alcuni eventi)...verrà eseguito il resto del codice di Gridcontroller (che metterà in coda altri eventi)....a questo punto potrebbe essere chiamata gridEventHandler.processEventList() che non farà alltro che eseguire glie venti dal più vecchio al più recente... Che ne dite ? |
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Quote:
Io la metteri perchè all'interno di questo metodo, anche privato, vengono invocati tutti i handler.onDroppableHalted(droppable);.... ....però se si usa un solo handler, ovvero listener, va bene uguale |
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ma quando ci lavoriamo su questo refactoring ?
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Propongo un'altra cosa:
all'interno di GridController quando una GemsPair viene droppata viene eseguito qualcosa, viene atteso un tot di tempo, di nuovo viene eseguito qualcosa etc... Non sarebbe bello un observer pattern con tot observers? |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
é quello che volevo fare con i listener, ovveo gli observer
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
|
io butto li un idea...
introdurre una specie di pattern state in gridController(uno per quando ci sono le gemme in movimento, uno per quando si fa cadere le gemme che possono cadere, uno per le crush, uno per l'update delle stone, etc), che contengano un metodo update(che faccia il lavoro per quello stato), e che restituiscano lo stato successivo del gridController. In modo da simulare una specie di macchina a stati. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:02.



















