|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
BigGem, per gli amici BugGem!
Allora mi stavo mettendo a testare mergeUp e mergeRight (http://www.hwupgrade.it/forum/showpo...postcount=124), quando sono esploso
E' normale che il costruttore di BigGem sia totalmente sgangerato e probabilmente poco testato?!? Cosa se ne fa bigGem di essere costrutita con una size 1x1 (anzi bisognerebbe costruirla solo con size 2x2) e poi cosa se ne fa di sapere da quali gemme e' stata creata, e poi che se ne fa dell position della sprite( ultimo parametro Point) a costruzione, che tanto dipenda da row e column passatigli come primi parametri ?? Inoltre BigGem e' un Droppable, e quindi la sua row e column non devo essere gestite a creazione, ma ad inserimento come per le altre droppable. E poi e' normale che siano pochissimi i testCase che usano questo costruttore?? Vuol dire che tutte le volte che abbiamo problemi con BigGem andiamo a a: -creare la griglia, - inserire le gemme -fare updateBigGem Insomma.... abbiamo fatto un po' i porcellini Altro che calcio rotante volante, qui ci vuole la sacra tecnica del colpo della capocciata di travertino di Hokuto |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Se si puo` cambiare BugGem eliminando le gemme contenute in essa ben venga! Le prime implementazioni le richiedevano ma forse ora...
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Dove stiamo andando??
Allora, come avete capito, secondo me il costruttore di BigGem è "sbagliato".
Quello giusto, per me, è: Codice:
public BigGem(DroppableColor color, AbstractEngine engine); Il poizionamento della sprite e della BigGem vengono gestiti all'inserimento in grid, come succede per le altre droppable. Inoltre non è dall'esterno che si aggiungono le gemma alla bigGem e che si cancellano quele assorbite da grid, ma se ne occupa la BigGem, che sa benissimo come fare queste cose. Anche perchè a prima vista la differenza tra extend e mergeUp/Right non è così chiara. Ora, per sapere come procedere, devo capire bene dove si vuole andare con il DroppabaleDescriptor (che non è testato Se l'obiettivo è di avere un Droppabale generico che si comporta in modo diverso in base al descriptor, una specie di "behaviour injection" ( me lo sono inventato adesso, chissa se esiste A questo punto mi viene da dire che deve quasi divenatare uno Startegy... in modo tale che quando si dice alla griglia TurnStoneInToGem o qualsiaisi altro "stato", ogni droppable si comporterà in modo diverso in base al descriptor. Ciò facendo però stiamo semplicemente portando fuori dal concetto di droppable la gerechia di Gem, Stone, Flash e quant'altro, che finirà inesorabilemnte in DroppableDescriptor. E' questo quello che vogliamo? ![]() In questo caso mi ritornerebbe utile farmi generare la AnimatedSprite direttamente dal descriptor. Esempio: Codice:
public BigGem(DroppableColor color, AbstractEngine engine)
{
super(new DroppableDescription(AbstractDroppableType.BIG_GEM, color), engine);
}
protected AbstractDroppable(DroppableDescription droppableDescription, AbstractEngine engine)
{
this.type = droppableDescription.getType();
this.color = droppableDescription.getColor();
setAnimatedSprite(droppableDescription.createSprite(engine));
}
public AnimatedSprite createSprite(AbstractEngine engine) {
return type.createAnimatedSprite(engine, color);
}
public AnimatedSprite createAnimatedSprite(AbstractEngine engine, DroppableColor color) {
TiledSprite sprite = new TiledSprite(color.createTiledImage(engine), 2, 2);
return new AnimatedSprite(sprite, AnimationDescription.createNullAnimation());
}
P.S.: anche AnimationDescriptor non è testato.... P.P.S.: ehm.... è colpa del coach se mancano i test nei Descriptor. O non ho capito niente io ( ), oppure vediamo se si spezza le ditine anche da solo Oh, scherzo.... non mi far bannare Ultima modifica di Bonfo : 06-02-2008 alle 08:18. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Quote:
In teoria la "potenza di testing" rimane la stessa (a meno di non aggiungere funzionalita`). L'unico problema e` che i test sono indiretti e quindi difficili da identificare. Quando ho estratto AnimatedSprite da AbstractSingleDroppable la classe non aveva test. Alcuni li ho dovuti scrivere a manina ma altri li ho semplicemente trovati rovistando in altri file. Comunque quelle due classi hanno bisogno dei loro test case :P |
|
|
|
|
|
|
#5 | |||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quote:
Sono due value type, hanno semantica puramente di valore (anche se in Java non puo' essere forzata). In parole povere contengono solo dati, sono copiabili, non hanno comportamento. E senza comportamento non c'e' nulla da testare Quindi anche in futuro rimarranno tali. Ho provato a spostare un createImage in DroppableDescripton ma rompe la mia idea di semantica di valore, infatti avrebbe bisogno di un test diretto che non ho scritto, perche' era un semplice tentativo di refactoring, che non mi sta piacendo. Le classi Description NON sono degl strategy e non lo devono diventare. Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|||
|
|
|
|
|
#6 | ||
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
1- Testare una classe che esce dal refactorinng per avere test diretti 2- Non scrivere decine di test ridondanti che complicano solo il codice, vanno mantenuti e non ci aggiungono copertura Purtroppo non c'e' una risposta univoca, dipendera' da situazione a situazione. Noi propenderemo comunque per il testare, a parte casi nei quali i test gia' esistenti che coprono quella classe sono abbastanza semplici e a basso livello. Quote:
Che senso avrebbe testare se il numero 5 e' proprio il numero 5?
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
||
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Non ho il codice sottomano ma mi pare che abbiano dei getter. Per me i getter si possono testare... Magari e` overkilling ma di solito testiamo tutto..
|
|
|
|
|
|
#8 | ||
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Quote:
Quote:
Imparo, imparo, imapro
|
||
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
E' un value type! Io neppure ci metterei i getter! Ma poi checkstyle si arrabbia.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 06-02-2008 alle 20:10. |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Fatto!
Adesso BigGem assomiglia molto di più ad un droppabale!! Ora si costruisce una gemma con un determinato colore e una area 2x2. Quindi per costruire gemme non c'è più bisogno di fare qui mandrubbi insert2x2Block, insertBigGem, updateBigGem e chi più ne ha più ne metta... Ora basta fare: Codice:
BigGem bigGem = new BigGem(DroppableColor.DIAMOND, engine);
grid.insertDroppable(bigGem, row, column);
Codice:
singleGem.getRegion().setColumn(column);
singleGem.getRegion().setRow(row);
bigGem.addGem(singleGem);
assertEquals(6, bigGem.getArea());
Volendo si può aggiungere un costruttore con width e height. Ora tutti a mettere a posto i test!!! (io vado a letto |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
|
Ho cercato anche di eliminare le included gems.
Verebbe anche bene, se no per il fatto che BigGem vorrebbe eliminare le gemme appena le accorpa, ma così ci si becca la ConcurrentModificationException. Per adesso ho lascito così, ma quella lista lì deve sparire!! Viene usata solo in updateBigGems() di Grid. O mettiamo in bigGem un metodo clearIncludedGems(), oppure aggiungiamo uno stato che non fa nient'altro che iterare la grid e pulirla dalle gemme segnate come da eliminare o con un flag ( che fa schifo) o con un lista. Io voto per il metodo clearIncludedGems() Ultima modifica di Bonfo : 07-02-2008 alle 09:35. |
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Quote:
Ottimo lavoro comunque |
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Bel lavoro Bonfo! E' elegantissimo.
Anche secondo me. Metterei un metodo che espande aggiungendo una che delega il lavoro ad un metodo che espande aggiungendo una region. Ma solo se il secondo serve a semplificare qualche pezzo di codice o test. Altrimenti va bene la sola gemma.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
In Grid esiste gia` removeGem. Basta chiamarlo da BigGem per le gemme incluse...
|
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Apr 2006
Città: Gazzaniga (BG)
Messaggi: 67
|
Secondo me quella lista da qualche parte ci deve essere, non può sparire. Era "cattiva" quando se ne faceva un uso assurdo, ma è ovvio che se vuoi allargare la BigGem devi eliminare le gemme adiacenti, e non puoi farlo in concomitanza con il loro rilevamento o ti becchi la concurrent...
Certo, non va passata da oggetto a oggetto, andrebbe semplicemente creata, usata e "salutata" all'interno di uno stesso metodo. Ad esempio, non si potrebbe delegare a UpdateBigGems il piccolo onere (per lei) di trovare ed eliminare le gemme, e invece far fare a BigGem solo la sua estensione tramite una Region? Ultima modifica di Baol : 07-02-2008 alle 13:29. |
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
Mi sembra complicato.
La soluzione semplice, secondo me, e` questa: - Grid non contiene alcuna lista (in questo caso le Gem diventate BigGem) se non i Droppable contenuti - BigGem mentre si estende si segna le gemme da eliminare in una lista - Alla fine di ogni estensione BigGem itera la lista e chiama, per ogni gemma, grid.removeDroppable(gem); Non funzionerebbe cosi`? Non ho il codice sotto mano... |
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Mi sembra un task da fare in pair e in TDD. Stasera dovrei tornare a casa presto e ci possiamo pensare assieme.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 1545
|
molto pene.
|
|
|
|
|
|
#20 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:37.











), oppure vediamo se si spezza le ditine anche da solo










