Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura)
Abbiamo provato per dieci giorni la Hyundai IONIQ 5 N, con 650 CV, 770 Nm e uno 0-100 km/h in 3,4 secondi. Il suo punto forte è N e-Shift, che simula un cambio a otto rapporti con suoni da motore termico e perfino un bang supersonico
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale
La prima tappa italiana della Road to CES porta a Milano i vertici della Consumer Technology Association, con una nuova griglia di lettura dei trend tecnologici e una posizione netta su dazi e regolamentazione dell'IA
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP
Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP
OPPO ha appena lanciato sul mercato la nuova serie Find X10, che ha come smartphone premium il Find X10 Pro Max, uno smartphone completo, che fa del comparto fotografico il suo vero punto di forza. Ma sono tante le novità, tra cui l'AI che adesso diventa agentica. Ma andiamo a vedere nel dettaglio questo nuovo smartphone.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-11-2005, 22: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 01-12-2005, 00: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, 13: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, 21: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, 21: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, 21: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, 22: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, 22: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 22:49.
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 00: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, 01: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, 10: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, 13: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, 13: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, 13: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, 13: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, 13: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, 13: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, 13: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 13:47.
Jocchan è offline   Rispondi citando il messaggio o parte di esso
Old 02-12-2005, 15: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, 16: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


Hyundai IONIQ 5 N, l'elettrica che finge di essere termica (e ci riesce da paura) Hyundai IONIQ 5 N, l'elettrica che finge di esse...
CES Unveiled Milan, l'IA diventa tecnologia fondativa e il commercio torna centrale CES Unveiled Milan, l'IA diventa tecnologia fond...
 Recensione OPPO Find X10 Pro Max: un top di gamma completo con tre fotocamere da 200MP Recensione OPPO Find X10 Pro Max: un top di gam...
WoW Forever provato: il MMORPG che la community chiedeva da anni è arrivato WoW Forever provato: il MMORPG che la community ...
TCL P80 Ultra: con un display AMOLED opaco è una gioia per gli occhi e per le dita TCL P80 Ultra: con un display AMOLED opaco &egra...
Apple porta l'IA su iWork: debutta l'Int...
Codec AV2: YouTube fissa al 2027 il pass...
Modder sbloccano i Tensor Core delle GeF...
AI, per la maggior parte delle aziende U...
Dopo le GPU, NVIDIA punta sugli abboname...
Samsung Galaxy e Android 17: la lista uf...
SanDisk Extreme da 256GB a 59€ su Amazon...
Made for iPhone Duo: ecco come riconosce...
GPU vietate in Cina: NVIDIA B300 compare...
NVIDIA RTX Remix 1.6 porta il DLSS 5 Neu...
OpenAI addestra i modelli di frontiera s...
Zen 6 contro Zen 5 a parità di fr...
L'IA vuole sempre più chip, ma c'...
NordVPN anticipa il Black Friday: sconti...
HPE Spaceborne Computer-4: calcolo ad al...
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: 08:46.


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