Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso
Basato su piattaforma Qualcomm Snapdragon X Plus a 8 core, il nuovo Microsoft Surface Pro 12 è un notebook 2 in 1 molto compatto che punta sulla facilità di trasporto, sulla flessibilità d'uso nelle differenti configurazioni, sul funzionamento senza ventola e sull'ampia autonomia lontano dalla presa di corrente
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet!
Il REDMAGIC Astra Gaming Tablet rappresenta una rivoluzione nel gaming portatile, combinando un display OLED da 9,06 pollici a 165Hz con il potente Snapdragon 8 Elite e un innovativo sistema di raffreddamento Liquid Metal 2.0 in un form factor compatto da 370 grammi. Si posiziona come il tablet gaming più completo della categoria, offrendo un'esperienza di gioco senza compromessi in mobilità.
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2
Dopo un mese di utilizzo intensivo e l'analisi di oltre 50 scatti, l'articolo offre una panoramica approfondita di Nintendo Switch 2. Vengono esaminate le caratteristiche che la definiscono, con un focus sulle nuove funzionalità e un riepilogo dettagliato delle specifiche tecniche che ne determinano le prestazioni
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 03-02-2008, 20:21   #1
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Programma "Refactor This!" [Da leggere]

La code base sta pian piano migliorando, soprattutto Droppable, a seguito di un po' di colpi di refactoring. Ma durante il refactoring giornaliero ho avuto molti problemi sia con BigGem sia con vari test.

Visto che affidarsi al vostro bon cuore non sta sortendo effetti troppo visibile, la soluzione e' il programma "Refactor This!"



Ho seminato nel codice questo commento:

// TODO: REFACTOR THIS

Il commento indica un metodo che va rifattorizzato semplicemente perche' non si capisce che cosa voglia fare, e' oscuro, o troppo lungo, o non utile. Insomma, va rifattorizzato e ripulito in un metodo piu' chiaro.

Le regole di commit cambiano dunque cosi':

- ad ogni commit dev'essere associata la rimozione di un TODO "Refactor This"
- nella descrizione del commit indicare il file e la riga del TODO eliminato
- scrivere in questo topic il codice prima e dopo il refactoring

Il non seguire questa regola portera' al revert del commit. E' una soluzione temporanea un po' draconiana, ma e' chiaro che serve solo per riportare velocemente la code base ad uno stato piu' usabile, di modo da facilitare i successivi task e renderli piu' divertenti per tutti. Al momento lavorare sulla code base e' un lavoraccio ed e' molto complesso.

Se sono necessarie eventuali deroghe alla regola, magari per un commit veloce, o una serie di commit (per i quali basta un solo TODO eliminato), contattatemi pure in MSN. Senza deroga vale la regola: "Un commit, un TODO eliminato".

Periodicamente faro' un giro della code base per indicare i metodi da rifattorizzare. Sentitevi liberi di aggiungere il TODO ad un metodo che reputate troppo complesso o non chiaro.

Ultima modifica di fek : 06-02-2008 alle 14:53.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2008, 22:03   #2
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Regole generali per il refactoring:
- Quando un metodo da privato diventa pubblico bisogna aggiunger il test!!


P.S.: se volete che aggiunga qualcos'altro, ditemelo
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2008, 22:20   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
bella come idea
mi metto a caccia.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2008, 22:35   #4
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12093
oh porca

meno male che per ora non ho tempo di committare (dopo aver finito di lavorare alle 20 e 30 finalmente mi sto prendendo un pò di riposo )

P.S: il mio amico giustamente aggiunge: "non direi proprio"... dato che fino ad ora ho bestemmiato per settargli l'ADSL cercando di recuperare la password del router che aveva perso
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 03-02-2008, 23:05   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
it.diamonds.grid.action.CrushByFlashAction.java:53

codice attuale:
Codice:
    private Droppable getGemToDelete(Droppable falshingGem)
    {
        // TODO: REFACTOR THIS

        Droppable gemToDelete = null;

        Region cell = falshingGem.getRegion();

        if(cell.getTopRow() < getGrid().getNumberOfRows() - 1)
        {
            gemToDelete = getGem(cell.getTopRow() + 1, cell.getLeftColumn());
        }

        if(cell.getLeftColumn() >= 1 && gemToDelete == null)
        {
            gemToDelete = getGem(cell.getTopRow(), cell.getLeftColumn() - 1);
        }

        if(cell.getLeftColumn() < getGrid().getNumberOfColumns() - 1
            && gemToDelete == null)
        {
            gemToDelete = getGem(cell.getTopRow(), cell.getLeftColumn() + 1);
        }

        if(cell.getTopRow() > 1 && gemToDelete == null)
        {
            gemToDelete = getGem(cell.getTopRow() - 1, cell.getLeftColumn());
        }

        return gemToDelete;
    }
questo è quello che ottengo ad una prima revisione, ma non ho concluso granché: è ancora troppo pieno di if per i miei gusti -.-
Codice:
    private Droppable getGemToDelete(Droppable falshingGem)
    {
        // TODO: REFACTOR THIS

        Region region = falshingGem.getRegion();
        Cell cell = new Cell(region.getTopRow(), region.getLeftColumn());

        Droppable gemToDelete = searchGemToDelete(cell);

        if(gemToDelete == null)
        {
            gemToDelete = searchLeft(cell);

            if(gemToDelete == null)
            {
                gemToDelete = searchRight(cell);

                if(gemToDelete == null)
                {
                    gemToDelete = searchUp(cell);
                }
            }
        }
        return gemToDelete;
    }


    private Droppable searchGemToDelete(Cell cell)
    {
        if((cell.getRow() < getGrid().getNumberOfRows() - 1))
        {
            return getGem(cell.getLower());
        }
        return null;
    }


    private Droppable searchLeft(Cell cell)
    {
        if(cell.getColumn() >= 1)
        {
            return getGem(cell.getLeft());
        }
        return null;
    }


    private Droppable searchRight(Cell cell)
    {
        if(cell.getColumn() < getGrid().getNumberOfColumns() - 1)
        {
            return getGem(cell.getRight());
        }
        return null;
    }


    private Droppable searchUp(Cell cell)
    {
        if(cell.getRow() > 1)
        {
            return getGem(cell.getUpper());
        }
        return null;
    }


    private Droppable getGem(Cell cell)
    {
        Droppable gem = getGrid().getDroppableAt(cell);
        if(gem == null)
        {
            return null;
        }

        if(gem.getFallingObject() != null && gem.getFallingObject().isFalling())
        {
            return null;
        }

        if(gem.getGridObject().getType().isStone())
        {
            return null;
        }

        return gem;
    }
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 00:18   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
mi ci sono scervellato, meglio di così non riesco a fare: non riesco ad eliminare quegli if (PER ORA). committo così com'è.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 01:07   #7
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
minchia, guardate che roba

it.diamonds.tests.droppable.gems.TestBigGemInGrid:457
Codice:
    public void testBigGemMoveDownABit()
    {
        // TODO: REFACTOR THIS

        Droppable gem = createGem(EMERALD);
        grid.insertDroppable(gem, 12, 3);
        gem.getFallingObject().drop();
        grid.updateDroppable(gem);

        Droppable gem1 = createGem(EMERALD);
        grid.insertDroppable(gem1, 12, 4);
        gem1.getFallingObject().drop();
        grid.updateDroppable(gem1);

        Droppable gem2 = createGem(EMERALD);
        grid.insertDroppable(gem2, 11, 3);
        gem2.getFallingObject().drop();
        grid.updateDroppable(gem2);

        Droppable gem3 = createGem(EMERALD);
        grid.insertDroppable(gem3, 11, 4);
        gem3.getFallingObject().drop();
        grid.updateDroppable(gem3);

        float gemY = gem2.getAnimatedObject().getSprite().getPosition().getY();

        grid.updateBigGems();
        Droppable bigGem = grid.getDroppableAt(new Cell(12, 3));

        bigGem.getMovingDownObject().moveDown(grid);

        assertEquals("top must be increased", gemY
            + ((float)grid.getActualGravity() / 2),
            bigGem.getAnimatedObject().getSprite().getPosition().getY(), 0.001f);
    }
Codice:
    public void testBigGemMoveDownABit()
    {
        insert2x2BlockOfGems(EMERALD, 11, 3);
        Droppable topGem = grid.getDroppableAt(new Cell(11, 3));

        grid.updateBigGems();
        Droppable bigGem = grid.getDroppableAt(new Cell(12, 3));

        bigGem.getMovingDownObject().moveDown(grid);

        float top = topGem.getAnimatedObject().getSprite().getPosition().getY();

        assertEquals("top must be increased", top
            + ((float)grid.getActualGravity() / 2),
            bigGem.getAnimatedObject().getSprite().getPosition().getY(), 0.001f);
    }

Ultima modifica di 71104 : 04-02-2008 alle 01:11.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 03:17   #8
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
71104, sei stato tu a mettere static le rows e le columns in Grid??

A me va benissimo, ma ciò vuol dire che tutte le grid hanno lo stesso numero di colonne e righe, e anche questo mi va benissimo, ma anche che sono inizializzate a 0 se non specificato diversamente:

Codice:
    private static int rows;

    private static int columns;

    ...

    public Grid(Environment environment, Point origin)
    {
        ....

        rows = environment.getConfig().getInteger("rows");
        columns = environment.getConfig().getInteger("columns");

        ....
    }
Tu non so se lo sai, ma hai appena aggiunto un bug alla code-base.
Se non viene mai costruita una grid, rows e columns sono entrambi a 0.

Ma poi mi speighi il vantaggio di averli statici?!?

Io no sono lo spezzatore di dita ufficiale, ma poi finisce che chiedo una delega .
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 04:16   #9
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Mi è venuta in mente una cosa carina...
Vediamo quanti test scoppiano se nel config cambio il valore di columns o di rows ?!?

No provo perchè potrei svenire.
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 05:47   #10
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Bisogna prendere una decisione per Grid.

Tutti i metodi, secondo me, devono essere omogenei; di conseguenza:
- tutti ricevono come parametro Cell;
- tutti ricevono come parametro row e column;

Piccola grande differenza: Cell lancia una eccezione se viene creata con parametri negativi.

Per isValidCell vuol dire che non c'è bisogno di controllare i valori negativi, ma che può lanciare eccezzionida un momento all'altro.

Io voto per la coppia row e column. ( tanto i metodi isValidColumn e isValidCell ci sono già).

Aspetto decisioni.

EDIT2: Ehm... già che c'ero le ho cambiate tutte, i posto in cui si usavano vermanete le celle erano 2...
in tutto il resto della code base si faceva sempre new. Secondo me ora le cose sono più pulite


EDTI: c'è una sovrapposizione tra il metodo inserDroppable di Grid e la classe InsertDroppableAction. Che si fa?
Io ucciderei la action.
__________________
Software engineer
Bonfo's Blog

Ultima modifica di Bonfo : 04-02-2008 alle 07:57.
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 08:20   #11
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Minchia Bonfo avevamo appena iniziato a cambiare tutto in Cell e hai ri-revertato i cambiamenti fatti

L'idea e` usare Cell ovunque.
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 08:37   #12
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Quote:
Originariamente inviato da Bonfo Guarda i messaggi
Bisogna prendere una decisione per Grid.

Tutti i metodi, secondo me, devono essere omogenei; di conseguenza:
- tutti ricevono come parametro Cell;
- tutti ricevono come parametro row e column;
Si lavora ovunque solo in termini di Cell e non di column/row.

Quote:
EDIT2: Ehm... già che c'ero le ho cambiate tutte, i posto in cui si usavano vermanete le celle erano 2...
in tutto il resto della code base si faceva sempre new. Secondo me ora le cose sono più pulite
Puoi fare il revert per favore? Vogliamo cambiare tutto a Cell.
Quale TODO hai rifattorizzato per questo commit? La regola vale per tutti.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 08:52   #13
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Voglio aggiungere un'altra cosa: non si entra in produzione fino a che non spariscono i Refactor This dalla code base. Questo ci da' anche una buona metrica per capire a che punto stiamo.

Abbiamo 16 Refactor This al momento.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 09:10   #14
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Per rilassare un attimo la regola, che effettivamente e' molto draconiana, non serve che risolviate del tutto un TODO per fare il commit, basta che ci abbiate lavorato in maniera consistente e abbiate migliorato quel pezzo di codice. Poi sta a voi decidere se il codice e' in buono stato e il TODO si puo' eliminare.
Ricordate di indicare nel commit la riga di codice dove era presente il TODO.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 09:14   #15
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Quindi se uno deve ancora rifattorizzare un pezzo di codice (sto ancora lavorando ad animation) prima fa commit dei todo da fare e poi comincia ad eliminarli? Nel mio caso bisogna ancora spostare un po' di test da TestGemAnimation a TestAnimatedSprite piu` semplificarli piu` testare roba non testata...
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 09:22   #16
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Si', e' chiaro che se stai facendo una serie di commit come me in questo momento, basta un solo TODO.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 10:43   #17
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
Quote:
Originariamente inviato da Bonfo Guarda i messaggi
71104, sei stato tu a mettere static le rows e le columns in Grid??
si, l'avevo fatto mentre cercavo soluzioni per il primo TODO anche se poi quella soluzione l'avevo revertata (dimenticandomi di revertare quel fatto dei campi static). per quanto riguarda il bug, l'importante è che quei due metodi non vengano mai chiamati quando nessuna griglia è stata ancora creata, semplice
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 19:08   #18
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
Prima:
Codice:
    protected void applyOn(Droppable gem)
    {
        Region cell = gem.getRegion();

        int row = cell.getTopRow();
        int column = cell.getLeftColumn();

        if(isGemNotValidForBigGem(gem))
        {
            return;
        }

        if(isGemNeighbourValidForBigGem(gem, -1, 0)
            && isGemNeighbourValidForBigGem(gem, 0, 1)
            && isGemNeighbourValidForBigGem(gem, -1, 1))
        {
            // TODO: Fran - REFACTOR THIS
            BigGem bigGem = new BigGem(
                row - 1,
                column,
                gem.getGridObject().getColor(),
                engine,
                getGrid().getDroppableAt(row - 1, column).getAnimatedSprite().getSprite().getPosition());

            bigGem.addGem(gem);
            bigGem.addGem(getGrid().getDroppableAt(row - 1, column));
            bigGem.addGem(getGrid().getDroppableAt(row, column + 1));
            bigGem.addGem(getGrid().getDroppableAt(row - 1, column + 1));

            for(Droppable droppable : bigGem.getIncludedGems())
            {
                getGrid().removeDroppable(droppable);
            }

            droppables.add(bigGem);
        }
    }

Ora:

Codice:
    protected void applyOn(Droppable gem)
    {
     
        if(isGemNotValidForBigGem(gem))
        {
            return;
        }

        if(isGemNeighbourValidForBigGem(gem, -1, 0)
            && isGemNeighbourValidForBigGem(gem, 0, 1)
            && isGemNeighbourValidForBigGem(gem, -1, 1))
        {
            BigGem bigGem = createBigGemWithGemsNear(gem);
            
            removeGemsUsedForBigGem(bigGem);

            droppables.add(bigGem);
        }
    }

    private BigGem createBigGemWithGemsNear(Droppable gem) 
    {
        int row = gem.getRegion().getTopRow();
        int column = gem.getRegion().getLeftColumn();
        DroppableColor bigGemColor = gem.getGridObject().getColor();
        Point spritePosition = getGrid().getDroppableAt(row - 1, column).getAnimatedSprite().getSprite().getPosition();
        
        BigGem bigGem = new BigGem(row - 1, column, bigGemColor, engine, spritePosition);
        
        bigGem.addGem(gem);
        bigGem.addGem(getGrid().getDroppableAt(row - 1, column));
        bigGem.addGem(getGrid().getDroppableAt(row, column + 1));
        bigGem.addGem(getGrid().getDroppableAt(row - 1, column + 1));
        
        return bigGem;
    }
    
    private void removeGemsUsedForBigGem(BigGem bigGem) 
    {
        for(Droppable droppable : bigGem.getIncludedGems())
        {
            getGrid().removeDroppable(droppable);
        }       
    }
Okkei?

(Non sono molto esperto di refactoring )
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 19:14   #19
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
Quote:
Originariamente inviato da AnonimoVeneziano Guarda i messaggi
Okkei?

(Non sono molto esperto di refactoring )
basta che la build sia ancora verde; tanto non dovevi aggiungere nessun test perché i metodi che hai aggiunto sono tutti privati se non erro. se è tutto verde committa.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 04-02-2008, 19:15   #20
AnonimoVeneziano
Senior Member
 
L'Avatar di AnonimoVeneziano
 
Iscritto dal: Aug 2001
Città: San Francisco, CA, USA
Messaggi: 13826
Quote:
Originariamente inviato da 71104 Guarda i messaggi
basta che la build sia ancora verde; tanto non dovevi aggiungere nessun test perché i metodi che hai aggiunto sono tutti privati se non erro. se è tutto verde committa.
Oookkei
__________________
GPU Compiler Engineer
AnonimoVeneziano è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Microsoft Surface Pro 12 è il 2 in 1 più compatto e silenzioso Microsoft Surface Pro 12 è il 2 in 1 pi&u...
Recensione REDMAGIC Astra Gaming Tablet: che spettacolo di tablet! Recensione REDMAGIC Astra Gaming Tablet: che spe...
Dopo un mese, e 50 foto, cosa abbiamo capito della nuova Nintendo Switch 2 Dopo un mese, e 50 foto, cosa abbiamo capito del...
Gigabyte Aero X16 Copilot+ PC: tanta potenza non solo per l'IA Gigabyte Aero X16 Copilot+ PC: tanta potenza non...
vivo X200 FE: il top di gamma si è fatto tascabile? vivo X200 FE: il top di gamma si è fatto ...
2 minuti: il tempo per scorrere le 25 of...
Mini LED TCL: confronto tra le migliori ...
Robot aspirapolvere: questi sono i più a...
Portatile tuttofare Lenovo Core i5/16GB ...
Scende a 99€ il tablet 11" 2,4K con...
Amiga: quali erano i 10 giochi più belli
Driver più sicuri: Microsoft alza...
Ego Power+ ha la giusta accoppiata per l...
Scompiglio nei listini Amazon: prezzi im...
Sotto i 105€ il robot Lefant che lava, a...
Mini proiettori smart in offerta: uno co...
Smartwatch Amazfit in offerta: Balance o...
Windows XP ritorna: ecco come usarlo sub...
Arrow Lake in saldo: Intel taglia i prez...
LG C4 da 55'' a 899€ è il top per...
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: 02:21.


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