PDA

View Full Version : [TASK 8.2.3] Pair Programming: Fek vs Jappilas (The Yooung Padawan)


fek
11-01-2006, 20:49
Questo e' il task:

8.2.3:
Modificare bagofgem in modo che il punteggio delle gemme che fanno parte di un gruppo sia moltiplicato per un Bonus. Il valore del bonus deve essere modificabile da GameConfig.xml

Prima la lista di test:

- Aggiunta di una gem con bonus
- Rimozione di una gem con bonus
- Calcolo del punteggio totale, passando il bonus attraverso il costruttore

fek
11-01-2006, 21:04
Ed ecco il primo test:


package it.diamonds.tests;

import it.diamonds.gems.BagOfGems;
import it.diamonds.gems.Gem;
import junit.framework.TestCase;

public class TestBagOfGems extends TestCase
{

public void testAddGemWithBonus()
{
BagOfGems bag = new BagOfGems();

bag.addGemWithBonus(Gem.diamond(0));
assertAreEqual(1, bag.getNumberOfGemsWithBonus());
}

}


Il codice minimo che lo faccia passare :)

jappilas
11-01-2006, 21:54
aggiunti due metodi in BagOfGems.java:
public void addGemWithBonus(Gem gem)
{
// TODO Auto-generated method stub
}


public int getNumberOfGemsWithBonus()
{
return 1;
}
implementazioni minime, rispettando il comandamento "make it simple, stupid" :D

green bar :)

fek
11-01-2006, 22:32
Ci aggiorniamo a domani sera.

jappilas
11-01-2006, 22:33
spero di aver ammansito la formica errante per allora... :stordita: :D

( per chi si stesse chiedendo di che parlo, Ant che fa un po' i capricci per come è configurato il mio environment... )

jappilas
12-01-2006, 20:07
Update: la Formica ( :D ) è stata ammansita e il build process è successful anche sulla mia macchina, grazie alle direttive di Francesco (colgo l' occasione per ringraziarlo sinceramente della pazienza e del tempo che mi dedica ultimamente) :)

i prossimi test e relativi fix nel flusso di sviluppo TDD, arriveranno presto :D

fek
14-01-2006, 13:52
Ecco il prossimo test:


public void testAddTwoGemsWithBonus()
{
BagOfGems bag = new BagOfGems();

bag.addGemWithBonus(Gem.diamond(0));
bag.addGemWithBonus(Gem.diamond(0));

assertEquals(2, bag.getNumberOfGemsWithBonus());
}

jappilas
14-01-2006, 15:11
dichiarata
private int gemsWithBonus;

e modificate le funzioni precedentemente aggiunte:
public void addGemWithBonus(Gem gem)
{
gemsWithBonus ++ ;
}


public int getNumberOfGemsWithBonus()
{
int tempValue = gemsWithBonus;
gemsWithBonus =0;
return tempValue;
}
per la seconda, so che potrebbe esistere codice più semplice, ma ho fatto prima a digitare questo che non a cancellarlo e pensare in modo diverso... :D


green bar :)

fek
14-01-2006, 15:16
Per prima cosa: Keep It Simple Sweety.

Questo codice fa passare tutti i test:


public int getNumberOfGemsWithBonus()
{
return gemsWithBonus;
}


Poi ho fatto un po' di refactoring dei test perche' c'erano delle duplicazioni, ed ho aggiunto un nuovo test per testare l'aggiunta di gemme di tipo diverso:


public class TestBagOfGems extends TestCase
{
BagOfGems bag;

public void setUp()
{
bag = new BagOfGems();
}


public void testAddGemWithBonus()
{
bag.addGemWithBonus(createDiamond());

assertEquals(1, bag.getNumberOfGemsWithBonus());
}


public void testAddTwoGemsWithBonus()
{
bag.addGemWithBonus(createDiamond());
bag.addGemWithBonus(createDiamond());

assertEquals(2, bag.getNumberOfGemsWithBonus());
}


public void testAddTwoDifferentGemsWithBonus()
{
bag.addGemWithBonus(createDiamond());
bag.addGemWithBonus(createRuby());

assertEquals(1, bag.getNumberOfGemsWithBonus(GemType.DIAMOND));
assertEquals(1, bag.getNumberOfGemsWithBonus(GemType.RUBY));
}


private Gem createRuby()
{
return Gem.create(GemType.RUBY, 0);
}


private Gem createDiamond()
{
return Gem.diamond(0);
}

}



Test in grassetto. A te :)

jappilas
14-01-2006, 15:33
la prima versione del test aggiunto è soddisfatta da codice molto minimale :D
( ammetto di essermela cavata con poco :fiufiu: )
public Object getNumberOfGemsWithBonus(GemType gem)
{
return 1;
}

fek
14-01-2006, 15:41
Ottimo :)


public void testAddManyDifferentGemsWithBonus()
{
bag.addGemWithBonus(createDiamond());
bag.addGemWithBonus(createDiamond());
bag.addGemWithBonus(createRuby());
bag.addGemWithBonus(createRuby());
bag.addGemWithBonus(createSapphire());

assertEquals(2, bag.getNumberOfGemsWithBonus(GemType.DIAMOND));
assertEquals(2, bag.getNumberOfGemsWithBonus(GemType.RUBY));
assertEquals(1, bag.getNumberOfGemsWithBonus(GemType.SAPPHIRE));

}


Sta volta non te la cavi con poco :)

jappilas
14-01-2006, 17:10
Sta volta non te la cavi con poco :)
hai ragione, per colpa della mia scarsa pratica con la code base ho impiegato un'infinità a rivedere la barra verde :(
aggiunta una seconda hashmap e relativa inizializzazione nel costruttore
private HashMap<GemType, Integer> numberOfGemsWithBonus;
numberOfGemsWithBonus = new HashMap<GemType, Integer>();
numberOfGemsWithBonus.put(EMERALD, 0);
numberOfGemsWithBonus.put(RUBY, 0);
numberOfGemsWithBonus.put(SAPPHIRE, 0);
numberOfGemsWithBonus.put(TOPAZ, 0);
numberOfGemsWithBonus.put(DIAMOND, 0);

modificate addGemWithBonus e getNumberOfGemsWithBonus
public void addGemWithBonus(Gem gem)
{
++gemsWithBonus;
numberOfGemsWithBonus.put(gem.getType(),
numberOfGemsWithBonus.get(gem.getType()) + 1);
}
public Object getNumberOfGemsWithBonus(GemType gem)
{
return numberOfGemsWithBonus.get(gem);
}
recuperare il contenuto della hashmap nella seconda, è quello che mi ha preso più tempo :fagiano:
con queste modifiche, all green

fek
14-01-2006, 18:09
Ed ecco il prossimo test, per la rimozione delle gemme.


public void testRemoveGemWithBonus()
{
Gem ruby = createRuby();

bag.addGemWithBonus(createDiamond());
bag.addGemWithBonus(ruby);
bag.removeGem(ruby);

assertEquals(1, bag.getNumberOfGemsWithBonus(GemType.DIAMOND));
assertEquals(0, bag.getNumberOfGemsWithBonus(GemType.RUBY));
assertEquals(1, bag.getNumberOfGemsWithBonus());
}

jappilas
14-01-2006, 19:29
aggiunto metodo removeGemWithBonus alla classe BagOfGems:
public void removeGemWithBonus(Gem gem)
{
--gemsWithBonus;
numberOfGemsWithBonus.put(gem.getType(), numberOfGemsWithBonus.get(gem.getType()) - 1);

}
green bar, build successful

fek
14-01-2006, 19:37
Ed ecco l'ultimo test:



public void setUp()
{
bag = new BagOfGems(BONUS_PERCENTAGE);
}

public void testScoreWithBonus()
{
bag.addGemWithBonus(createDiamond());
bag.addGemWithBonus(createRuby());
bag.addGem(createDiamond());

assertEquals(
GemType.DIAMOND.score() +
GemType.RUBY.score() * BONUS_PERCENTAGE / 100 +
GemType.DIAMOND.score() * BONUS_PERCENTAGE / 100,
bag.computeTotalScore());
}

jappilas
14-01-2006, 21:11
modificata la computeTotalScore
public int computeTotalScore()
{
int totalScore = 0;

for(GemType gemType : numberOfGems.keySet())
{
totalScore += computeScore(gemType);
}
for(GemType gemType : numberOfGemsWithBonus.keySet())
{
totalScore += computeScoreWithBonus(gemType);
}
return totalScore;
}
aggiunta computeScoreWithBonus, necessaria perchè adesso ho due strutture dati su cui iterare
private int computeScoreWithBonus(GemType gemType)
{
return numberOfGemsWithBonus.get(gemType) * gemType.score()
* gemScorePercentageBonus / 100;
}
il checkstyle di Ant non gradiva la replicazione di parte del codice dei costruttori quindi ho racchiuso la parte in comune in una terza funzione
public BagOfGems()
{
mainBagConstructor();
gemScorePercentageBonus = 100;

}

public BagOfGems(int bonusPercent)
{
mainBagConstructor();
gemScorePercentageBonus = bonusPercent;
}

private void mainBagConstructor()
{
numberOfGems = new HashMap<GemType, Integer>();
numberOfGems.put(EMERALD, 0);
numberOfGems.put(RUBY, 0);
numberOfGems.put(SAPPHIRE, 0);
numberOfGems.put(TOPAZ, 0);
numberOfGems.put(DIAMOND, 0);

numberOfGemsWithBonus = new HashMap<GemType, Integer>();
numberOfGemsWithBonus.put(EMERALD, 0);
numberOfGemsWithBonus.put(RUBY, 0);
numberOfGemsWithBonus.put(SAPPHIRE, 0);
numberOfGemsWithBonus.put(TOPAZ, 0);
numberOfGemsWithBonus.put(DIAMOND, 0);

gemsWithBonus = 0;
};
green bar e build successful (pare)

fek
14-01-2006, 21:12
Ed ecco il codice di BagOfGems dopo un po' di refactoring:


package it.diamonds.gems;



import java.util.HashMap;
import static it.diamonds.gems.GemType.*;


public class BagOfGems
{
private HashMap<GemType, Integer> numberOfGems;
private HashMap<GemType, Integer> numberOfGemsWithBonus;

final private int bonusPercentage;

public BagOfGems(int bonusPercentage)
{
this.bonusPercentage = bonusPercentage;

numberOfGems = new HashMap<GemType, Integer>();
numberOfGems.put(EMERALD, 0);
numberOfGems.put(RUBY, 0);
numberOfGems.put(SAPPHIRE, 0);
numberOfGems.put(TOPAZ, 0);
numberOfGems.put(DIAMOND, 0);

numberOfGemsWithBonus = new HashMap<GemType, Integer>();
numberOfGemsWithBonus.put(EMERALD, 0);
numberOfGemsWithBonus.put(RUBY, 0);
numberOfGemsWithBonus.put(SAPPHIRE, 0);
numberOfGemsWithBonus.put(TOPAZ, 0);
numberOfGemsWithBonus.put(DIAMOND, 0);
};


private int computeScore(GemType gemType)
{
return numberOfGems.get(gemType) * gemType.score();
}


private int computeScoreWithBonus(GemType gemType)
{
return numberOfGemsWithBonus.get(gemType) * gemType.score() * bonusPercentage / 100;
}


public int computeTotalScore()
{
int totalScore = 0;

for(GemType gemType : numberOfGems.keySet())
{
totalScore += computeScore(gemType);
}

for(GemType gemType : numberOfGemsWithBonus.keySet())
{
totalScore += computeScoreWithBonus(gemType);
}

return totalScore;
}


public int getNumberOfGemsWithoutBonus()
{
int totalNumber = 0;

for(int value : numberOfGems.values())
{
totalNumber += value;
}

return totalNumber;
}


public int getNumberOfGemsWithBonus()
{
int totalNumber = 0;

for(int value : numberOfGemsWithBonus.values())
{
totalNumber += value;
}

return totalNumber;
}


public void addGem(Gem gem)
{
numberOfGems.put(gem.getType(), numberOfGems.get(gem.getType()) + 1);
}


public void removeGem(Gem gem)
{
numberOfGems.put(gem.getType(), numberOfGems.get(gem.getType()) - 1);
}


public void addGemWithBonus(Gem gem)
{
numberOfGemsWithBonus.put(gem.getType(), numberOfGemsWithBonus.get(gem.getType()) + 1);
}



public int getNumberOfGemsWithBonus(GemType gem)
{
return numberOfGemsWithBonus.get(gem);
}


public void removeGemWithBonus(Gem gem)
{
numberOfGemsWithBonus.put(gem.getType(), numberOfGemsWithBonus.get(gem.getType()) - 1);
}
}

jappilas
14-01-2006, 23:00
aggiunta una riga
bagOfGems = new BagOfGems(config.getInteger("BonusPercentage"));
nel costruttore della classe Grid;

aggiunta la property BonusPercentage in GameConfig.xml;

task da considerare concluso ? :)