Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless
MSI FORGE GK600 TKL WIRELESS: switch lineari hot-swap, tripla connettività, display LCD e 5 strati di fonoassorbimento. Ottima in gaming, a 79,99 euro
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici
DJI porta un importante aggiornamento alla sua linea di gimbal camera tascabili con Osmo Pocket 4: sensore CMOS da 1 pollice rinnovato, gamma dinamica a 14 stop, profilo colore D-Log a 10 bit, slow motion a 4K/240fps e 107 GB di archiviazione integrata. Un prodotto pensato per i creator avanzati, ma che convince anche per l'uso quotidiano
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori
Il primo headset open-back della linea INZONE arriva a 200 euro con driver derivati dalle cuffie da studio MDR-MV1 e un peso record di soli 199 grammi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-11-2005, 21:54   #1
fek
Senior Member
 
L'Avatar di fek
 
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;        
    }
Mi piace molto, c'e' questo metodo handleEvent() della classe keyData che racchiude il codice comune ai due branch per i tasti left e right. L'ultimo passo e' eliminare handleRight e usare handleEvent perche' sono sostanzialmente identici.

Lo faccio:

Codice:
        if(KeyCode.vk_Left == event.key())
        {
            return leftKey.handleEvent(event);
        }
        else 
        if(KeyCode.vk_Right == event.key())
        {
            return rightKey.handleEvent(event);
        }
Test fallito. La gemma non si muove a destra. C'e' un problema. Neppure vi devo dire che se non fosse fallito quel test avrei dato per scontato che tutto stava andando bene perche' quel refactoring nella mia testa e' naturale.

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;        
    }
Ed ho risolto il problema dell'offset in maniera un po' sporca cosi':

Codice:
        public int handleEvent(KeyEvent event)
        {
            processEvent(event);
            if(isPressed())
            {
                return columnOffset;
            }
            
            return 0;
        }
Chi si vuole occupare di separare i due comportamenti e rifattorizzare ulteriormente questo codice? Siamo molto vicini ad una soluzione molto elegante, in cui aggiungere altri tasti non ci richieda una modifica a handleKeyEvent().
fek è offline   Rispondi citando il messaggio o parte di esso
Old 30-11-2005, 23:42   #2
71104
Bannato
 
L'Avatar di 71104
 
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.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 01-12-2005, 12:55   #3
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da 71104
be', non vorrei sembrare troppo "famelico" ^^'
Tu SEI famelico.

Interessante questo thread, è bene che lo segua.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 01-12-2005, 20:26   #4
71104
Bannato
 
L'Avatar di 71104
 
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'...
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 01-12-2005, 20:43   #5
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
anche io sto guardando
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 01-12-2005, 20:57   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
io invece non più perché mi sono state richieste degli aggiornamenti nel parser :|
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 01-12-2005, 21:04   #7
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Ok... Io sto imparando il codice dato che sono appena arrivato... mumble mumble
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 01-12-2005, 21:42   #8
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
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);
        }
    }
A questo punto potremmo utilizzare una HashTable per associare KeyCode->KeyData

handleKeyEvent diventerebbe una cosa tipo:

Codice:
public void handleKeyEvent(KeyEvent event)
{
    KeyData keyData = hashTable.get(event.key());
    keyData.execute();
}
Sicuramente è da migliorare assai e ci sarebbero altre mille ottimizzazioni... Voglio solo vedere se il concetto può piacervi

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.
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 01-12-2005, 23:52   #9
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
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
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 00:06   #10
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
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;        
    }
Si deduce da questo:

"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...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 09:43   #11
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Ufo13
Ok... Io sto imparando il codice dato che sono appena arrivato... mumble mumble
Come lo trovi in termini di leggibilita'?

Quote:
Originariamente inviato da Ufo13
Sicuramente è da migliorare assai e ci sarebbero altre mille ottimizzazioni... Voglio solo vedere se il concetto può piacervi
Un Command Pattern da manualetto

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.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 12:02   #12
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da fek
Come lo trovi in termini di leggibilita'?



Un Command Pattern da manualetto

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.
Io passerei subito al Command tanto ci tocchera di sicuro farlo in futuro. Altri due o tre "comandi" e sforiamo il controllo sulla complessita e noi non lo vogliamo.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 12:03   #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
Scusate, ma quali sono gli altri comandi che dobbiamo gestire in grid ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 12:06   #14
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Quote:
Originariamente inviato da fek
Come lo trovi in termini di leggibilita'?
Hmmm abbastanza chiaro anche se a mio avviso si potrebbe rendere piu` chiara la separazione dei ruoli tra i vari metodi e classi (parlo di Grid e KeyEvent)

Quote:
Un Command Pattern da manualetto

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.
Stasera appena arrivo a casa faccio il commit del mio refactoring e do un'ochiata al Command Pattern sul libro che mi avevi consigliato (Design Patterns mi pare... dovrebbe esserci li` ).
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 12:18   #15
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da cionci
Scusate, ma quali sono gli altri comandi che dobbiamo gestire in grid ?
Jocchan?

Quote:
Originariamente inviato da VICIUS
Io passerei subito al Command tanto ci tocchera di sicuro farlo in futuro. Altri due o tre "comandi" e sforiamo il controllo sulla complessita e noi non lo vogliamo.

ciao
Io invece aspetterei perche' non voglio fare ragionamenti tipo "tanto ci tocchera' di sicuro farlo in futuro". You Ain't Gonna Need it.

Secondo me dobbiamo fare questo refactoring quando il controllo sulla complessita' sforera'.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 12:25   #16
DanieleC88
Senior Member
 
L'Avatar di DanieleC88
 
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
Quote:
Originariamente inviato da cionci
Scusate, ma quali sono gli altri comandi che dobbiamo gestire in grid ?
Forse per ora non ce ne sono. Se in futuro venissero inserite anche combinazioni di tasti? Oppure tasti per mettere in pausa, togliere il sonoro, mostrare un menù... non saprei.
__________________

C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai!
DanieleC88 è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 12:39   #17
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da cionci
Scusate, ma quali sono gli altri comandi che dobbiamo gestire in grid ?
Jocchan all'inizio del progetto parlava della possibilità di fare uso della dinamite e lanciare massi nel campo avversario a comando. Queste sarebbero altre due cose da gestire in grid. Penso. Poi si era persino parlato di giocare in due sullo stesso campo contro il pc.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 12:45   #18
Jocchan
Senior Member
 
L'Avatar di Jocchan
 
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.
Jocchan è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 14:25   #19
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Non vedo l'ora di poter fare commit
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 15:06   #20
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 Jocchan
- Due tasti (su e Space) per ruotare le coppie di gemme nei due sensi
Sì, ma solo questi vanno in Grid...comunque se sono previsti questi altri due tasti credo che tu possa anche fare il commit... Aspettiamo una conferma da fek...
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Tastiera gaming MSI GK600 TKL: switch hot-swap, display LCD e tre modalità wireless Tastiera gaming MSI GK600 TKL: switch hot-swap, ...
DJI Osmo Pocket 4: la gimbal camera tascabile cresce e ha nuovi controlli fisici DJI Osmo Pocket 4: la gimbal camera tascabile cr...
Sony INZONE H6 Air: il primo headset open-back di Sony per giocatori Sony INZONE H6 Air: il primo headset open-back d...
Nutanix cambia pelle: dall’iperconvergenza alla piattaforma full stack per cloud ibrido e IA Nutanix cambia pelle: dall’iperconvergenza alla ...
Recensione Xiaomi Pad 8 Pro: potenza bruta e HyperOS 3 per sfidare la fascia alta Recensione Xiaomi Pad 8 Pro: potenza bruta e Hyp...
iPhone 18 Pro: il componente che garanti...
DeepL alza il livello: con Voice-to-Voic...
Apple sta utilizzando sempre più ...
Il MacBook Neo vende tanto? Microsoft le...
AST SpaceMobile BlueBird 7: Blue Origin ...
È il momento migliore per comprar...
Svendita MacBook Pro: c'è il mode...
Oggi questa TV TCL QLED da 43 pollici co...
Il caricatore multiplo da 200W che va be...
Top 7 Amazon, il meglio del meglio di qu...
Spento lo strumento LECP della sonda spa...
Voyager Technologies ha siglato un accor...
GoPro annuncia la linea MISSION 1 con tr...
Alcune varianti dei futuri Samsung Galax...
Il ridimensionamento di OnePlus in Europ...
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: 05:36.


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