|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Refactoring e l'importanza del codice di qualita'
Sto rifattorizzando handleKeyEvent() di Grid e procede tutto in maniera abbastanza spedita.
Refactoring dopo refactoring, tutto rigorosamente usando gli strumenti di Eclipse arrivo a questo: Codice:
public int handleKeyEvent(KeyEvent event)
{
if(KeyCode.vk_Down == event.key())
{
return handleDownKey(event);
}
else
if(KeyCode.vk_Left == event.key())
{
return leftKey.handleEvent(event);
}
else
if(KeyCode.vk_Right == event.key())
{
return rightKey.handleRight(this, event);
}
return 0;
}
Lo faccio: Codice:
if(KeyCode.vk_Left == event.key())
{
return leftKey.handleEvent(event);
}
else
if(KeyCode.vk_Right == event.key())
{
return rightKey.handleEvent(event);
}
Dov'e' il problema? Un buon dieci minuti rifacendo il refactoring passettino per passettino (io non voglio usare il debugger) e scopro che per una distrazione non mi ero accorto che i due branch ritornano due valori diversi (1 e -1). Ma che cosa rappresentano quei due numeri? Non lo so, dal codice del metodo non e' chiaro. Ma e' davvero una distrazione mia? Si', sicuramente lo e', ma e' anche vero che il codice non mi ha aiutato, non chiarisce subito il significato di quei due numeri. Allora sono andato a vedere la chiamata a handleKeyEvent() e scopro che quel numero e' usato per incrementare o decrementare la colonna corrente. Ora, dov'e' il problema? Il problema e' che il metodo handleKeyEvent sta svolgendo due compiti: 1) Sta gestendo gli eventi di pressione dei tasti. 2) Sta calcolando di quanto la gemma si debba spostare a seguito della pressione di un tasto. Questo metodo ha due responsabilita' e quando un'entita ha due responsabilita' c'e' un (piccolo o grande) problema. Nel nostro caso e' piuttosto piccolo, ma io chiarirei meglio le intenzioni che il codice vuole esprimere e separerei questi due compiti. Ecco dove sono arrivato col refactoring: Codice:
public int handleKeyEvent(KeyEvent event)
{
if(KeyCode.vk_Down == event.key())
{
return handleDownKey(event);
}
else
if(KeyCode.vk_Left == event.key())
{
return leftKey.handleEvent(event);
}
else
if(KeyCode.vk_Right == event.key())
{
return rightKey.handleEvent(event);
}
return 0;
}
Codice:
public int handleEvent(KeyEvent event)
{
processEvent(event);
if(isPressed())
{
return columnOffset;
}
return 0;
}
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
mumble mumble, il post era molto interessante; tra l'altro aggiungerei anche una cosa: questo è uno dei motivi percui non bisogna scrivere valori costanti nel codice, perché altrimenti non si capisce il loro significato; be' poi in realtà in questo caso sostituire i due valori con delle costanti non sarebbe stato affatto elegante, la soluzione migliore è come dici tu di fare in modo che ciascun metodo abbia il suo compito specifico.
be', non vorrei sembrare troppo "famelico" ^^' ma se non si propone nessun altro io sono disponibile domani sera EDIT: molto sul tardi però, è meglio se lo fa qualcun altro. |
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
![]() Interessante questo thread, è bene che lo segua.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#4 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
e va bene, qui sono l'unico che ha fame, cavolo eccheccavolo, mi mangio pure questo
allordunque, mumble, vediamo un po'... |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
anche io sto guardando
|
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
io invece non più perché mi sono state richieste degli aggiornamenti nel parser :|
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Ok... Io sto imparando il codice dato che sono appena arrivato... mumble mumble
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Hmmm mi viene in mente una soluzione per astrazione...
la classe KeyData potrebbe diventare abstract... Resterebbe invariata apparte il costruttore che diventerebbe KeyData() e verrebbe rimosso il campo columnOffset... aggiungerei pure un metodo: abstract void executeKey(); per ogni tasto che vogliamo gestire estendiamo la classe KeyData es: Codice:
private class LeftKey extends KeyData
{
public void executeKey()
{
Gem gem = getGemUnderControl();
removeGemFromGrid(gem);
gem.setCellColumn(gem.getCellColumn() + 1);
addGemToGrid(gem);
getGemUnderControl().move(-1 * xStep, 0);
}
}
handleKeyEvent diventerebbe una cosa tipo: Codice:
public void handleKeyEvent(KeyEvent event)
{
KeyData keyData = hashTable.get(event.key());
keyData.execute();
}
Un possibile miglioramento sarebbe evitare di mettere il codice dello spostamento della gemma dentro execute() e spostarlo dentro un metodo privato che sposti la gemma orizzontalmente di un dato "int offset" Ultima modifica di Ufo13 : 01-12-2005 alle 21:49. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Non so se fare il commit stasera o meno (con ant nessun problema ma c'è un po' di roba da sistemare)...
Nell'indecisione aspetto domani... Domani mattino/pome ci lavoro in facoltà e domani sera dovrei essere pronto per il commit |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Credo che una parte improtante del refactoring da fare (oltre a quello che hai fatto te) fosse questa:
Codice:
public int handleKeyEvent(KeyEvent event)
{
if(KeyCode.vk_Down == event.key())
{
return handleDownKey(event);
}
else
if(KeyCode.vk_Left == event.key())
{
return leftKey.handleEvent(event);
}
else
if(KeyCode.vk_Right == event.key())
{
return rightKey.handleEvent(event);
}
return 0;
}
"Siamo molto vicini ad una soluzione molto elegante, in cui aggiungere altri tasti non ci richieda una modifica a handleKeyEvent()." Io una soluzione ce l'ho in mente ed una parte della soluzione è proprio quella di derivare la gestione dei vari tasti da una classe astratta... |
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
Sono indeciso se muoverci subito verso un command pattern perche' abbiamo solo tre comandi. Sicuramente in futuro ci servira', ma vorrei pagare la flessibilita' del command pattern quando ne abbiamo realmente bisogno. Il tuo refactoring e' comunque la strada da seguire in futuro.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Scusate, ma quali sono gli altri comandi che dobbiamo gestire in grid ?
|
|
|
|
|
|
#14 | ||
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Quote:
Quote:
|
||
|
|
|
|
|
#15 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
Secondo me dobbiamo fare questo refactoring quando il controllo sulla complessita' sforera'.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Quote:
ciao |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Silent Hill
Messaggi: 1471
|
- Due tasti (su e Space) per ruotare le coppie di gemme nei due sensi
- 5 tasti funzione (F1... F5) per attivare gli insulti sonori - 3 tasti funzione (F6... F8) per muoversi nella soundtrack - Un tasto (Ctrl) per attivare la dinamite nella modalità Advanced - Un tasto (Shift) per usare le Desperation Moves nella modalità Advanced - Un tasto (Esc) per mettere in pausa (nello story mode) e/o muoversi tra i menu - Un tasto (Invio) per confermare nei menu e skippare i dialoghi Eh sì, direi che ne useremo parecchi
__________________
DIAMOND CRUSH - Aut viam inveniam, aut faciam. Ultima modifica di Jocchan : 02-12-2005 alle 12:47. |
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Non vedo l'ora di poter fare commit
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:36.




















