Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto
Xiaomi ha portato sul mercato internazionale la nuova serie Redmi Note, che rappresenta spesso una delle migliori scelte per chi non vuole spendere molto. Il modello 15 Pro+ punta tutto su una batteria capiente e su un ampio display luminoso, sacrificando qualcosa in termini di potenza bruta e velocità di ricarica
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 25-10-2005, 20:11   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
[CICLO3] Test Driven Development Task 3.2.3 (71104 vs fek THE ARMAGEDDON)

fek, quando vuoi sono pronto
direi che cominciare a prendere il codice dei test che avevo fatto, eventualmente anche il codice della classe, e semplificarlo; oppure se vuoi ricominciamo dall'inizio, come vuoi. intanto questo era il codice dei test:
Codice:
public class TestPlayerGrid extends TestCase
{
    private Config config;
    
    private Bounds bounds;
    
    private int rows;
    private int cols;
    private PlayerGrid pg;
    
    
    public void setUp()
    {
        config = Config.createForTesting();
        bounds = new Bounds(40, 40, 256, 448, config);
        pg = new PlayerGrid(config, bounds);
        rows = pg.getRows();
        cols = pg.getColumns();
    }
    
    
    public void testDimensions()
    {
        assertEquals(pg.getRows(), rows);
        assertEquals(pg.getColumns(), cols);
        assertEquals(rows, config.getIntProperty("rows"));
        assertEquals(cols, config.getIntProperty("columns"));
        
        try
        {
            pg.getAt(0, 0);
            pg.getAt(rows - 1, 0);
            pg.getAt(0, cols - 1);
            pg.getAt(rows - 1, cols - 1);
        }
        catch(IllegalArgumentException e)
        {
            fail("legal arguments rejected");
        }
    }
    
    
    private void retrievalTest(boolean empty)
    {
        for (int y = 0; y < rows; y++)
        {
            for (int x = 0; x < cols; x++)
            {
                if (empty)
                {
                    assertNull(pg.getAt(y, x));
                }
                else
                {
                    assertNotNull(pg.getAt(y, x));
                }
            }
        }
    }
    
    private void insertionTest()
    {
        for (int y = 0; y < rows; y++)
        {
            for (int x = 0; x < cols; x++)
            {
                assertTrue(pg.addGem(y, x, "diamond"));
                assertFalse(pg.addGem(y, x, "diamond"));
            }
        }
    }
    
    private void removalTest()
    {
        for (int y = 0; y < rows; y++)
        {
            for (int x = 0; x < cols; x++)
            {
                assertTrue(pg.removeGem(y, x));
                assertFalse(pg.removeGem(y, x));
            }
        }
    }
    
    
    public void testCells()
    {
        retrievalTest(true);
        insertionTest();
        retrievalTest(false);
        removalTest();
    }
    
    
    public void testAssignBounds()
    {
        pg.addGem(0, 0, "diamond");
        assertSame(pg.getAt(0, 0).getBounds(), bounds);
        pg.removeGem(0, 0);
    }
    
    
    public void testDraw()
    {
        MockEngine engine = new MockEngine();
        
        for (int y = 0; y < rows; y++)
        {
            for (int x = 0; x < cols; x++)
            {
                pg.addGem(y, x, "diamond");
            }
        }
        
        pg.draw(engine);
        assertEquals(engine.getNumberOfQuadsDrawn(), rows * cols);
        
        for (int y = 0; y < rows; y++)
        {
            for (int x = 0; x < cols; x++)
            {
                pg.removeGem(y, x);
            }
        }
    }
}

Ultima modifica di 71104 : 25-10-2005 alle 20:14.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 20:18   #2
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Come sempre non fate commit sul Server perche' la build sara' precaria mentre scriviamo il task. Spengo la build machine.

Questo e' il task:
3.2.3 Creare una matrice di sprite MxN allineate al background e disegnare i diamanti contenuti

Inziamo da zero.

Il primo test te lo do' io, ma prima la cena
Torno fra mezz'ora.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 20:43   #3
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Primo test. Dobbiamo creare una matrice NxM. Appena creata una matrice e'... vuota.

Ecco il test:

Codice:
    public void testIsEmpty()
    {
        Grid grid = new Grid(14, 8);
                
        assertTrue(grid.isEmpty());
    }
71104, a te. Ricorda: l'implementazione piu' semplice possibile e strettamente solo il codice che serve per passare il test. Non una riga di codice in piu'.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 20:50   #4
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
pronti; è il minimo indispensabile imho:
Codice:
public class Grid
{
    private int rows;
    private int columns;
    
    private Gem grid[][];
    
    public Grid(int rows, int columns)
    {
        this.rows = rows;
        this.columns = columns;
        grid = new Gem[rows][columns];
    }
    
    public boolean isEmpty()
    {
        boolean result = true;
        for (int y = 0; result && (y < rows); y++)
        {
            for (int x = 0; result && (x < columns); x++)
            {
                if (null != grid[y][x])
                {
                    result = false;
                }
            }
        }
        return result;
    }
}
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 20:59   #5
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Non e' neppure vicino a essere il minimo indispensabile!!

Ho chiesto il minimo indispensabile per far passare il test e non una riga di codice in piu'. In quel codice ne vedo almeno venti di troppo.

Codice:
public class Grid
{
    public Grid(int rows, int columns)
    {
    }
    
    public boolean isEmpty()
    {
        return true;
    }
}
Questo e' il codice piu' semplice possibile che fa passare il test.

Ora vediamo se inserendo un diamante la griglia e' ancora vuota:

Codice:
    public void testIsNotEmpty()
    {
        Grid grid = new Grid(14, 8);
        
        grid.insertDiamond(0, 0);
        assertFalse("Grid is still empty after an insert", grid.isEmpty());
    }
Il codice piu' semplice possibile!
Si', ancora piu' semplice di quello che stai pensando ora. Molto piu' semplice.

Ricorda i passi:
- fai compilare prima il test
- guarda che fallisce con l'implementazione corrente
- fai la minima aggiunta che fa passare il test
- guarda il test che passa
- refactoring ed elimina il codice duplicato (ad esempio nei test)
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 21:07   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
LOL, ok, allora ecco secondo me il codice MINIMALE per far passare il secondo test a dispetto di tutto quello che potrebbero intuitivamente significare i nomi assegnati alla classe e ai suoi metodi
Codice:
public class Grid
{
    private boolean empty = true;
    
    public Grid(int rows, int columns)
    {
    }
    
    public void insertDiamond(int row, int column)
    {
        empty = false;
    }
    
    public boolean isEmpty()
    {
        return empty;
    }
}
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 21:14   #7
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Perfetto!
Ora andiamo avanti e testiamo l'inserimento.
Scrivi tu il test questa volta, inserisci un diamante e testi che ci sia un diamante nella posizione inserita.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 21:19   #8
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da fek
Perfetto!
Ora andiamo avanti e testiamo l'inserimento.
Scrivi tu il test questa volta, inserisci un diamante e testi che ci sia un diamante nella posizione inserita.
ok, allora suppongo che l'inserzione alla posizione (0, 0) si potrebbe testare così:
Codice:
    public void testInsertion()
    {
        Grid grid = new Grid(14, 8);
        
        grid.insertDiamond(0, 0);
        assertNotNull("insertion failed", grid.getAt(0, 0));
    }
volendo si potrebbe perfezionare mettendoci i cicli for ed effettuando l'inserzione in tutte le caselle.

piccola nota: penso sia giunto il momento di rendere grid un campo private della classe e gi aggiungere il metodo setUp
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 21:23   #9
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Ottimo test!
Volendo fare i pignolissimi, avrei preferito un metodo del chiamato isDiamondAt() che ritorni un boolean, per il principio di passare sempre le informazioni strettamente necessarie. A questo livello ci serve solo l'informazione se un diamante e' presente o meno ad una data posizione, non ci serve sapere quale diamante.

Quote:
volendo si potrebbe perfezionare mettendoci i cicli for ed effettuando l'inserzione in tutte le caselle.
E provaci se hai il coraggio

Quote:
piccola nota: penso sia giunto il momento di rendere grid un campo private della classe e gi aggiungere il metodo setUp
Ottima idea. Fai pure. Elimina la duplicazione. Modifica il test per restituire solo un boolean. Poi scrivi il codice per farlo compilare e farlo fallire e infine il codice per far passare il test. Mi raccomando solo il codice piu' semplice possibile per far passare il test.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 21:37   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
oplà! direi che bisogna fare così:
Codice:
public class TestGrid extends TestCase
{
    private Grid grid;
    
    public void setUp()
    {
        grid = new Grid(14, 8);
    }
    
    public void testIsEmpty()
    {
        assertTrue("Grid is not empty", grid.isEmpty());
    }
    
    public void testIsNotEmpty()
    {
        grid.insertDiamond(0, 0);
        assertFalse("Grid is still empty after an insert", grid.isEmpty());
    }
    
    public void testInsertion()
    {
        grid.insertDiamond(0, 0);
        assertTrue("insertion failed", grid.isDiamondAt(0, 0));
    }
}
eliminata la duplicazione di codice (che sarebbe diventata una quadruplicazione ^^); il test prima falliva, e per non farlo fallire ho trasformato Grid come segue:
Codice:
public class Grid
{
    private boolean empty = true;
    
    private boolean grid[][];
    
    public Grid(int rows, int columns)
    {
        grid = new boolean[rows][columns];
    }
    
    public void insertDiamond(int row, int column)
    {
        empty = false;
        grid[row][column] = true;
    }
    
    public boolean isEmpty()
    {
        return empty;
    }
    
    public boolean isDiamondAt(int row, int column)
    {
        return grid[row][column];
    }
}
in tal modo però c'è un'altra piccola duplicazione: il campo empty duplica l'informazione del fatto che la griglia è completamente vuota oppure no, perché la stessa informazione si può ottenere ciclando su tutta la matrice, solo che se inserisco troppo codice in una volta sola il TDD si offende
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 21:43   #11
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Infatti si e' offeso, quella non e' il codice minimale che fa passare il test

Ma e' questo:

Codice:
public class Grid
{
    private boolean empty = true;
   
    public Grid(int rows, int columns)
    {
    }
    
    public void insertDiamond(int row, int column)
    {
        empty = false;
    }
    
    public boolean isEmpty()
    {
        return empty;
    }
    
    public boolean isDiamondAt(int row, int column)
    {
        return true;
    }
}
Ora, continuiamo l'implementazione cambiando il test in questo:

Codice:
    public void testInsertion()
    {
        assertFalse("no diamond at (0,0)", grid.isDiamondAt(0, 0));
        grid.insertDiamond(0, 0);
        assertTrue("insertion failed", grid.isDiamondAt(0, 0));
    }
Che ovviamente ora fallisce. Ma ci avvicina ancora di un passetto alla fine del task.
Scrivi il test che lo fa passare. La versione piu' semplice possibile!

Ultima modifica di fek : 25-10-2005 alle 21:46.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 21:54   #12
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
vabbè, ragazzi sarò onesto, questa modifica me l'ha suggerita fek
comunque eccola:
Codice:
    public boolean isDiamondAt(int row, int column)
    {
        return !empty;
    }
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 22:05   #13
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Bene. Siamo un passettino piu' vicini alla fine.
Ora andiamo avanti per triangolazione. Ti scrivo io il prossimo test:

Codice:
    public void testTwoInsertions()
    {
        grid.insertDiamond(0, 0);
        assertFalse("there's a diamond at (0,1) before insertion", grid.isDiamondAt(0, 1));
        grid.insertDiamond(0, 1);
        assertTrue("insertion failed at (0,1) ", grid.isDiamondAt(0, 1));
    }
Ora la matrice non te la toglie nessuno
Ma non scrivere una riga di codice in piu'.

Ultima modifica di fek : 25-10-2005 alle 22:11.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 22:13   #14
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ok ci sono; guarda non ho neanche messo i campi privati rows e columns
Codice:
public class Grid
{
    private boolean empty = true;
    
    private boolean grid[][];
    
    public Grid(int rows, int columns)
    {
        grid = new boolean[rows][columns];
    }
    
    public void insertDiamond(int row, int column)
    {
        empty = false;
        grid[row][column] = true;
    }
    
    public boolean isEmpty()
    {
        return empty;
    }
    
    public boolean isDiamondAt(int row, int column)
    {
        return grid[row][column];
    }
}
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 22:16   #15
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Bene! Ora c'e' sempre una piccola duplicazione fra empty e la griglia, ma per ora possiamo sopravvivere. Magari la togliamo piu' in la'.
Una piccola cosa mi turba: che succede se inserisco un diamante in una posizione in cui c'e' gia'?
Vorrei che si scatenasse una bella eccezione, scrivi il test relativo.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 22:21   #16
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da fek
Bene! Ora c'e' sempre una piccola duplicazione fra empty e la griglia, ma per ora possiamo sopravvivere. Magari la togliamo piu' in la'.
Una piccola cosa mi turba: che succede se inserisco un diamante in una posizione in cui c'e' gia'?
Vorrei che si scatenasse una bella eccezione, scrivi il test relativo.
be', nella precedente implementazione (quella di cui ho riportato i test nel primo post) il metodo di inserzione ritornava false, e analogamente si comportava il metodo di rimozione, ma il Coach sei tu
Codice:
    public void testRedundantInsertion()
    {
        try {
            grid.insertDiamond(0, 0);
            grid.insertDiamond(0, 0);
        }
        catch (IllegalArgumentException e)
        {
            return;
        }
        fail("Double insertion at same position should not be allowed");
    }

Ultima modifica di 71104 : 25-10-2005 alle 22:24.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 22:24   #17
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Buon test che fallisce. Implementazione ora.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 22:27   #18
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ok questo era semplice
Codice:
    public void insertDiamond(int row, int column)
    {
        if (grid[row][column])
        {
            throw new IllegalArgumentException();
        }
        
        empty = false;
        grid[row][column] = true;
    }
ora?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 22:29   #19
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
edit: ho scritto una scemenza.

Ora mi serve un test che mi dica che nella posizione in cui inserisco un diamante ci sia effettivamente un oggetto di tipo Gem che poi disegneremo.

Scrivi il test relativo.

Ultima modifica di fek : 25-10-2005 alle 22:35.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 25-10-2005, 22:37   #20
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
direi di procedere così:
Codice:
    public void testRetrieval()
    {
        grid.insertDiamond(0, 0);
        Gem gem = grid.getGemAt(0, 0);
        assertNotNull("Gem retrieval failed", gem);
    }
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
La nave elettrica più grande mai ...
Spusu lancia il Wi-Fi Calling: come funz...
Questo robot impara a muovere le labbra ...
iPhone 17 annienta la concorrenza in Cin...
La nuova Xiaomi SU7 batte un record: 4.2...
È possibile copiare i qubit: dei ...
BYD alza ulteriormente l'asticella: batt...
Il nuovo razzo spaziale riutilizzabile c...
L'ex leader di Assassin's Creed porta Ub...
Il razzo spaziale NASA SLS e la capsula ...
Samsung Galaxy S26 Ultra: quattro colora...
AWS investe 1,2 miliardi in Italia. Coin...
La navicella cinese Shenzhou-20 con il f...
I piani Business ed Education di Google ...
Ceres-2 e Lunga Marcia 3B: la Cina falli...
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: 00:24.


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