Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-04-2006, 10:39   #1
cionci
Senior Member
 
L'Avatar di cionci
 
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
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 11:17   #2
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
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
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 12:06   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Bonfo
1) Ci vuole ovviamente l'interfaccia Droppabel
Sì, ora fek preferirebbe un'interfaccia, sinceramente io preferirei una classe base
Quote:
Originariamente inviato da Bonfo
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
Dipende un po' da come organizzaimo la cosa...
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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 12:18   #4
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Quote:
Originariamente inviato da cionci
Sì, ora fek preferirebbe un'interfaccia, sinceramente io preferirei una classe base
Perchè non tutte e due...interfaccia e classse astratta che implementa tale interfaccia

Quote:
Originariamente inviato da cionci
Il listener dovrebbe essere GridController...
Nella mia testa era il contrario
GridControler genera l'evento e il CrushGemListener si registra all'evento
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 12:27   #5
cionci
Senior Member
 
L'Avatar di cionci
 
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();
   }
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 12:59   #6
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
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
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 13:23   #7
fek
Senior Member
 
L'Avatar di fek
 
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
fek è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 13:48   #8
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Quote:
Originariamente inviato da fek
Cose tipo per l'Amore dell'Ingegneria del Software mi suonano gia' male: diciamo per l'amore di semplicita' e fate le cose semplici


Comunque era ironico
__________________
Software engineer
Bonfo's Blog

Ultima modifica di Bonfo : 03-04-2006 alle 13:50.
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 14:54   #9
cionci
Senior Member
 
L'Avatar di cionci
 
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); 
   }
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 17:19   #10
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Cionci a me la tua soluzione piace molto
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 17:32   #11
fek
Senior Member
 
L'Avatar di fek
 
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).
fek è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 17:35   #12
cionci
Senior Member
 
L'Avatar di cionci
 
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))
In pratica appena avviene un evento viene eseguito l'handler...allora tanto vale chiamare questo, no ????
Codice:
if(!gemsPairsCanMoveDown)
     for(registeredListener)
        handler.onDroppableHalted(droppable);
Potremmo desincronizzarlo ????? Avrebbe senso ??? Sarebbe utile Semplificherebbe ?

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 ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 17:35   #13
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da fek
Piace anche a me. A occhio non c'e' un'indirezione di troppo? (non ci giuro affatto, probabilmente ho perso qualcosa io).
Vedi sopra...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 18:08   #14
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da cionci
Che ne dite ?
La seconda versione tutta la vita, perche' toglie un'indirezione. Al momento non vedo motivo per desincronizzare, ci interessa solo portare fuori da Grid il codice di gestione dell'evento.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 18:16   #15
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Quote:
Originariamente inviato da cionci
Che ne dite ?
Scusate...ma notifyEvent() è senza parametro.
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
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 18:21   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Bonfo
vengono invocati tutti i handler.onDroppableHalted(droppable);....
No, ne viene invocato solo uno...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 21:06   #17
cionci
Senior Member
 
L'Avatar di cionci
 
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 ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2006, 23:52   #18
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
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?
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2006, 02:23   #19
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
é quello che volevo fare con i listener, ovveo gli observer
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 04-04-2006, 07:17   #20
thebol
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.
thebol è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Un graffio è sufficiente a far de...
Airbus realizzerà altri 229 satel...
Arianespace lancerà altri satelli...
Eutelsat ha annunciato di aver affidato ...
PLD Space ha annunciato il nuovo razzo s...
CMF Clip Pro, tanta autonomia e design u...
Tre leggende del rally sbarcano in Asset...
iPhone 18 Pro Max, il chip A20 Pro mostr...
Samsung porterà il Privacy Displa...
WINDTRE BUSINESS trasforma la rete mobil...
Anthropic ammette un quarto caso di acce...
Mazda CX-6e, il primo test drive: quando...
La serie HONOR Magic 9 arriva a fine set...
Anker MagGo Power Bank 2 Pro arriva in I...
iRobot rilancia con Roomba Duo, il proto...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 07:23.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v