Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Borderlands 4, tra divertimento e problemi tecnici
Recensione Borderlands 4, tra divertimento e problemi tecnici
Gearbox Software rilancia la saga con Borderlands 4, ora disponibile su PS5, Xbox Series X|S e PC. Tra le novità spiccano nuove abilità di movimento, un pianeta inedito da esplorare e una campagna che lascia al giocatore piena libertà di approccio
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale
NXTPAPER 60 Ultra è il primo smartphone con tecnologia NXTPAPER 4.0 per il display, un ampio IPS da 7,2 pollici. Con finitura anti-riflesso, processore MediaTek Dimensity 7400, fotocamera periscopica e modalità Max Ink per il detox digitale, NXTPAPER 60 Ultra punta a essere il riferimento tra gli smartphone pensati per il benessere degli occhi.
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming
Questo mouse ultraleggero, con soli 36 grammi di peso, è stato concepito per offrire un'esperienza di gioco di alto livello ai professionisti degli FPS, grazie al polling rate a 8.000 Hz e a un sensore ottico da 33.000 DPI. La recensione esplora ogni dettaglio di questo dispositivo di gioco, dalla sua agilità estrema alle specifiche tecniche che lo pongono un passo avanti
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-01-2008, 14:51   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Eliminazione actions e getType

PREMESSA

il refactoring che ci apprestiamo a fare mira all'eliminazione di AbstractDroppable.getType nonché di alcuni altri metodi "getType" (cioè che effettuano dei test di runtime sul tipo di un dato oggetto) presenti in AbstractDroppableType e derivate.

poiché le actions sembrano utilizzare parecchio i metodi di cui sopra, e poiché esse non hanno più motivo di esistere in sostituzione di metodi diretti per modificare Grid (il codice di logging è stato eliminato), questo refactoring comporta anche l'eliminazione del design delle actions.

i task che cerco di riassumere nel seguito sono soggetti a possibile modifiche man mano che la situazione si evolve.


TASK LIST

1) eliminazione di AbstractDroppableType - spostare tutti i metodi di AbstractDroppableType (isXxx) in AbstractDroppable o derivate. eliminare metodo getType.

2) refactoring interfacce - controllare se i metodi spostati necessitano di essere utilizzati solamente da chi conosce gli oggetti sotto forma di interfacce specifiche (FallingObject, GridObject, ecc.), e non tramite tutta la AbstractDroppable; spostare eventualmente i metodi nelle rispettive interfacce.

3) eliminazione delle actions - ora, per ciascuna action:

3a) smistamento codice - il codice della action deve essere spostato in uno o più metodi nel chiamante della stessa: i test per quella action vanno anch'essi spostati nel test case corretto e refattorizzati di conseguenza.

3b) rimozione della action - rimuovere la action appena sostituita; i test ad essa relativi dovrebbero essere già scomparsi poiché dovrebbero essere stati spostati tutti in altri test case.

4) (ancora non è finita ) metodi polimorfici - tra i metodi spostati al punto 1, tutti quelli che cominciamo con "is" effettuano un test a runtime del tipo di gemma: devono essere eliminati ed il tutto refattorizzato di conseguenza, e non devono essere sostituiti da metodi canXxx perché sarebbe una cosa molto simile. Introdurre appositi metodi polimorfici con implementazioni specifiche per ogni tipo di droppable: vedi esempio di Jappilas, metodo crush in Abstract(Single)Droppable che nell'implementazione di default non fa nulla, mentre nell'implementazione della classe Chest effettua un crush.


NOTE AGGIUNTIVE

non iniziate ancora che non sono molto sicuro di questi passaggi, vorrei prima il parere di fek. a parer mio una volta svolto questo mega-refactoring Diamond Crush sarà molto più pulito, oserei dire al 70-80%

Ultima modifica di 71104 : 30-01-2008 alle 19:52.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2008, 15:17   #2
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
non ho la code base sotto mano, ma quante sono le action?

Non si rischia di far ingrassare troppo grid?(possibile fosse una motivazione per l'introduzione delle action?)
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2008, 16:49   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da thebol Guarda i messaggi
non ho la code base sotto mano, ma quante sono le action?
in it.diamonds.grid.action ne conto 10 e anche belle corpose (vedi sotto).

Quote:
Non si rischia di far ingrassare troppo grid?
sono d'accordo, infatti nel frattempo tocca anche spolparla con refactoring di contorno. è faticoso, lo so, ma secondo me è ciò che va fatto per riportare la codebase ad uno stato di pulizia
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2008, 16:52   #4
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Ricordo che ad un certo punto Grid era diventato un mostro a dieci test: va tenuto il piu' possibile snello e pulito a colpi di Extract Class.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2008, 17:01   #5
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Prima di procedere vorerei ricordare che bisogna prima pulire i test !!! Se iniziamo a fare il resto prima rimaniamo di nuovo impantanati (http://www.hwupgrade.it/forum/showpo...2&postcount=7)!

__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2008, 17:22   #6
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Bonfo Guarda i messaggi
Prima di procedere vorerei ricordare che bisogna prima pulire i test !!! Se iniziamo a fare il resto prima rimaniamo di nuovo impantanati (http://www.hwupgrade.it/forum/showpo...2&postcount=7)!

E abbiamo il volontario per il refactoring dei test relativi a Grid e AbstractDroppables.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2008, 17:24   #7
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Quote:
Originariamente inviato da fek Guarda i messaggi
E abbiamo il volontario per il refactoring dei test relativi a Grid e AbstractDroppables.
Volentieri!! Rispondi però alla domanda Agile (Grazie )

EDIT:
Ehm.. c'è da piangere !!!!
__________________
Software engineer
Bonfo's Blog

Ultima modifica di Bonfo : 30-01-2008 alle 17:44.
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2008, 19:19   #8
jappilas
Senior Member
 
L'Avatar di jappilas
 
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 4741
Quote:
Originariamente inviato da 71104 Guarda i messaggi
<...>
3a) introduzione metodo diretto - introdurre in Grid un metodo la cui esecuzione corrisponda ad una chiamata doIteration(xxxAction);
vedi altro thread - se pensi a "cosa" fa una action o meglio ancora una Crush in termini di operazioni base, vedi che è possibile che un metodo per ogni action (almeno non un metodo equivalente) in Grid, non serva

Quote:
4) (ancora non è finita ) metodi polimorfici -
siccome alla fine alla Droppable è richiesto un comportamento autonomo in due situazioni , cioè in fase statica nella griglia e al termine della caduta ( questo vale sia per la nuova gempair sia per le Droppable che si muovono a seguito di una crush, potenzialmente innescandone un' altra )
quindi tutta l' intelligenza delle singole Droppable potrebbe in effetti condensarsi in crush() ( o touchDown() ) ed eventualmente update(timestamp)
__________________
Jappilas is a character created by a friend for his own comic - I feel honored he allowed me to bear his name
Saber's true name belongs to myth - a Heroic Soul out of legends, fighting in our time to fullfill her only wish
Let her image remind of her story, and of the emotions that flew from my heart when i assisted to her Fate
jappilas è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2008, 19:47   #9
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da jappilas Guarda i messaggi
vedi altro thread - se pensi a "cosa" fa una action o meglio ancora una Crush in termini di operazioni base, vedi che è possibile che un metodo per ogni action (almeno non un metodo equivalente) in Grid, non serva
ho visto l'altro thread, avete ragione; provo a modificare la task list.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 30-01-2008, 19:53   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
il punto 3 è diventato da così:
Quote:
3a) introduzione metodo diretto - introdurre in Grid un metodo la cui esecuzione corrisponda ad una chiamata doIteration(xxxAction); naturalmente il metodo non deve contenere quella chiamata, ma svolgere il codice della action in questione. il metodo deve essere sviluppato TDD nella maniera più semplice possibile (repetita iuvant ).

3b) refactoring dei chiamanti - individuare tutte le chiamate a doIteration con quella action e sostituirle con una chiamata al metodo diretto. non dovrebbero essere sviluppati nuovi test per questo passaggio, ma controllate che i test vecchi passino ancora.

3c) rimozione della action - rimuovere la action appena sostituita ed i test ad essa relativi.
a così:
Quote:
3a) smistamento codice - il codice della action deve essere spostato in uno o più metodi nel chiamante della stessa: i test per quella action vanno anch'essi spostati nel test case corretto e refattorizzati di conseguenza.

3b) rimozione della action - rimuovere la action appena sostituita; i test ad essa relativi dovrebbero essere già scomparsi poiché dovrebbero essere stati spostati tutti in altri test case.
che ne pensate?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2008, 01:04   #11
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
mi sono preso la libertà di cominciare a spostare i metodi da AbstractDroppableType ad AbstractDroppable
tanto il punto 1) della task list è una cosa che va fatta sicuramente al 100%.

ho spostato il metodo toString, il quale ora è diventato un getTypeName implementato in ciascun tipo di droppable. inizialmente credevo fosse inutile el'ho eliminato, poi mi sono accorto che veniva utilizzato per costruire i nomi dei files delle textures, e quindi ho introdotto test-driven il metodo getTypeName.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2008, 08:44   #12
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Tutto cio` che coinvolge Grid, GridController, Actions e Stati della griglia e` una delle parti piu` delicate al momento.

Volevo occuparmi della separazione del codice di rendering dal codice che gestisce la logica ma temo che questo task dovra` aspettare per ora...

Ieri ho pensato a cosa si potrebbe fare per semplificare il tutto e mi sono venute un po' di idee:

- Grid deve essere soltanto una griglia che contiene gemme. Le operazioni permesse sarebbero qualcosa tipo: insertGemAt(Droppable, Cell) e getGemAt(Cell).

- GridController gestirebbe un po' piu` esplicitamente l'esecuzione degli stati e le transizioni tra uno stato e l'altro.

- Idealmente non ci sarebbe piu` l'idea di droppable polimorfi ma di una singola classe Droppable che puo` contenere una o piu` Strategie (tipo nello strategy pattern) a seconda dello stato. Per esempio se lo stato e` MERGING_CELLS, molti droppable non faranno nulla quando il metodo droppable.update(State currentState) viene eseguito ma le BigGem invece eseguiranno la MergingStrategy. MERGING_CELLS potrebbe benissimo essere un enumeratore cosi` da poter tenere gli stati in una mappa.


Questa e` un'idea generale che sicuramente necessita una revisione
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2008, 08:52   #13
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
L'idea di uno Strategy o State dentro Droppable mi piace perche' semplifica molto la gerarchia.

Sto guardando la classe AbstractCrushAction e contiene dipendenze ovvie su Grid, Gem e usa isGem() per eseguire il suo compito. Questo e' sbagliato. Dovrebbe limitarsi a chiamare un qualche metodo crush() su un droppable, ma viste le dipendenze ha bisogno di un po' di refactoring per potere spostare la logica da questa Action al Droppable.

Questa cosa qui poi e' del tutto fuori dagli schemi:

Codice:
    protected void setAddAtScore(boolean addAtScore)
    {
        this.addToScore = addAtScore;
    }
Sta cambiando il comportamento di questa classe attraverso un flag. Si fa in C, non in Java
fek è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2008, 08:55   #14
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Ah si mi sono svanito una parte. Alla fine droppable abbiamo detto che avrebbe una hashmap<State, Strategy>. A questo punto, in teoria, non dovremmo piu` avere bisogno di diverse classi per Gem, Chest etc...

Ci basterebbe avere una factory che crea gli oggetti con le strategie giuste.
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2008, 09:34   #15
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Voglio togliere quello Sprite da Droppable e creare un oggetto che sia una collezione di Sprite e relativo Droppable: qualcosa tipo RenderableDroppable o DrawableDroppable.

Ci provi tu Fede o ci provo io stasera se torno presto?
fek è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2008, 09:41   #16
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da Ufo13 Guarda i messaggi
Ah si mi sono svanito una parte. Alla fine droppable abbiamo detto che avrebbe una hashmap<State, Strategy>. A questo punto, in teoria, non dovremmo piu` avere bisogno di diverse classi per Gem, Chest etc...

Ci basterebbe avere una factory che crea gli oggetti con le strategie giuste.
non è un po la riporoposizione dell'AbstractDroppableType(magari un po più potente)?
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2008, 10:52   #17
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Quote:
Originariamente inviato da fek Guarda i messaggi
Voglio togliere quello Sprite da Droppable e creare un oggetto che sia una collezione di Sprite e relativo Droppable: qualcosa tipo RenderableDroppable o DrawableDroppable.

Ci provi tu Fede o ci provo io stasera se torno presto?
Non sono sicuro di aver capito quello che hai in mente... La mia idea era creare un oggetto GridRenderer che prendesse tutti i Droppable da Grid e li renderizzasse.

L'informazione su come renderizzare un Droppable dovrebbe essere decoupled (scusate non mi viene un termine in italiano) il piu` possibile.

Fra possiamo vederlo insieme se ti va.
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2008, 12:53   #18
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Ok, lo guardiamo stasera assieme.
fek è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Borderlands 4, tra divertimento e problemi tecnici Recensione Borderlands 4, tra divertimento e pro...
TCL NXTPAPER 60 Ultra: lo smartphone che trasforma la lettura da digitale a naturale TCL NXTPAPER 60 Ultra: lo smartphone che trasfor...
Un fulmine sulla scrivania, Corsair Sabre v2 Pro ridefinisce la velocità nel gaming Un fulmine sulla scrivania, Corsair Sabre v2 Pro...
Nokia Innovation Day 2025: l’Europa ha bisogno di campioni nelle telecomunicazioni Nokia Innovation Day 2025: l’Europa ha bisogno d...
Sottile, leggero e dall'autonomia WOW: OPPO Reno14 F conquista con stile e sostanza Sottile, leggero e dall'autonomia WOW: OPPO Reno...
Disagi al traffico aereo europeo: le ind...
Intel in crisi chiama Apple: un riavvici...
Snapdragon X2 Elite Extreme, il cuore de...
Snapdragon 8 Elite Gen 5 è il nuovo rife...
Bombe Apple su Amazon: iPhone di scorsa ...
Micron: memoria HBM4 a 11 Gbps e patto d...
NVIDIA rende Audio2Face open source: ecc...
Logitech Signature Slim Solar K980+: 10 ...
Disney Plus aumenta i prezzi: si parte d...
Intel XeSS con Multi Frame Generation: u...
iPhone 16 a soli 700€ su Amazon: stile e...
Signature Slim Solar+ K980, la nuova tas...
Logitech MX Master 3S, il mouse perfetto...
Borderlands 4 per Switch 2 rinviato a te...
Reddit studia con Google una partnership...
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: 06:04.


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