Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Recensione Samsung Galaxy Z Fold7: un grande salto generazionale
Abbiamo provato per molti giorni il nuovo Z Fold7 di Samsung, un prodotto davvero interessante e costruito nei minimi dettagli. Rispetto al predecessore, cambiano parecchie cose, facendo un salto generazionale importante. Sarà lui il pieghevole di riferimento? Ecco la nostra recensione completa.
The Edge of Fate è Destiny 2.5. E questo è un problema
The Edge of Fate è Destiny 2.5. E questo è un problema
Bungie riesce a costruire una delle campagne più coinvolgenti della serie e introduce cambiamenti profondi al sistema di gioco, tra nuove stat e tier dell’equipaggiamento. Ma con risorse limitate e scelte discutibili, il vero salto evolutivo resta solo un’occasione mancata
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello
AMD ha aggiornato l'offerta di CPU HEDT con i Ryzen Threadripper 9000 basati su architettura Zen 5. In questo articolo vediamo come si comportano i modelli con 64 e 32 core 9980X e 9970X. Venduti allo stesso prezzo dei predecessori e compatibili con il medesimo socket, le nuove proposte si candidano a essere ottimi compagni per chi è in cerca di potenza dei calcolo e tante linee PCI Express per workstation grafiche e destinate all'AI.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 24-03-2006, 00:13   #1
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Sto refactoring sa da fà o non sa da fà??

Vado subito al nocciolo.
Lungo il nostro lavoro abbiamo sviluppato TDD e abbiamo aggiunto tutte le funzionalità in questo modo.
Così facendo però non abbiamo mai realizzato una buona gestione degli errori e delle eccezzioni.

Cosa voglio dire: ci sono alcune classi che se vendute come componente separato, cosa che sarebbe giusto poter fare, avrebbero un sacco di comportamenti non prestabiliti perchè, ad esempio, non si fa nessun controllo sui parametri in ingresso di alcuni metodi o costruttori.

Inoltre, nel caso il controllo sia stato fatto, non c'è una trattazione omogenea. Ovvero alcune volte si restituisce dei null, altre volte delle eccezzioni, altre volte altro ancora.

Ecco allora la mia domanda: dobbiamo riprendere in mano tutto ed aggiungere tutti i controlli sui parametri, naturalmente con test annessi, oppure va bene così?!?

Domanda secondaria: ma siamo noi che non abbiamo applicato perfettamente il TDD oppure è il TDD che ha una mancanza???

Grazie per aver sopportato il mio sproloquio
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 07:27   #2
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Sono d'accordo sulla trattazione omogenea, se è possibile e ha senso ovviamente.

Per quanto riguarda i test, invece, penso che se l'obiettivo di esplicitare i requisiti viene raggiunto, non vedo perché dovremmo occuparci di aggiungere altri controlli sui valori ricevuti in ingresso e l'output risultante: per Diamonds va bene così.

Sarà la natura stessa dell'approccio TDD che ci porterà, quando se ne presenterà la necessità, ad aggiungere altri test per "coprimere meglio" l'utilizzo dei componenti.

Il tutto IMHO, chiaramente.
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 10:21   #3
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Per i controlli sui parametri sono sfavorevole. Abbiamo i test che indicano quali parametri accetta la nostra api in ingresso. Se un autore manda in input ad una nostra classe valori non validi anche sapendo dei test allora c'è qualcosa che non va nella mente del programmatore.
Se però lo fa perché i test sono poco chiari o non specificano bene queste cose è il caso di aggiungere qualche test qua e la per chiarificare queste cose.

Per quanto riguardi una gestione omogenea degli errori cosa intendi?

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 10:28   #4
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Perfettamente d'accordo.

Penso si riferisca a questo:

"Ovvero alcune volte si restituisce dei null, altre volte delle eccezzioni, altre volte altro ancora."
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 10:29   #5
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da cdimauro
Perfettamente d'accordo.

Penso si riferisca a questo:

"Ovvero alcune volte si restituisce dei null, altre volte delle eccezzioni, altre volte altro ancora."
Si ma non capisco cosa vuole fare. Dovremmo per caso usare solo eccezioni?

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 12:10   #6
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Quote:
Originariamente inviato da VICIUS
Per i controlli sui parametri sono sfavorevole. Abbiamo i test che indicano quali parametri accetta la nostra api in ingresso. Se un autore manda in input ad una nostra classe valori non validi anche sapendo dei test allora c'è qualcosa che non va nella mente del programmatore.
1) Cambio la domanda per farmi capire. Supponiamo di vendere il package it.diamonds.engine (esempio a caso), ovviamente senza codice. In questo caso dobbiamo garantire il perfetto funzionamento a chi lo vendiamo.
Cosa facciamo: gli diamo l'intero insieme dei test perchè possa controllare i parametri?? E se passa dei parametri sbagliati..come facciamoa dirglielo.
Nonero lo stesso fek che aveva detto: "Per la gestione delle condizioni di errore applichiamo la filosofia "Die very painfully". "
Questa domanda è molto più filosofica che un problema reale in diamonds

Il fatto è che ho pensato alla discussione con fek del riutilizzo con l'agile programming. E lui mi ha pienamente convinto con l'idea che da un progetto si possono "promuovere" ad un nodo superiore ad entrambi i progetti le classi che possono diventare librerie.
Il fatto è che però le classi promosse si dovrebbero comportare da liberire...quindi anche con tutti i controlli sui parametri

Spero di essere stato chiaro ...

Quote:
Per quanto riguardi una gestione omogenea degli errori cosa intendi?
2) Intendo semplicemente decidere in quali casi usare le eccezioni e in quali casi usare i null o altro.
Per esempio: molte creazioni di oggetti non hanno controllo sui parametri.
Nel momento in cui si farà il controllo cosa si fa?
-si lancia un eccezzione dicendo "cretino hai sbagliato i parametri"
-si ritorna null e dici: cacchi suoi, ha sbagliato e mo se la gestisce lui

Sono approcci diversi che comportano codice diverso da parte dell'utilizzatore..è un gioco di responsabilità fra le classi.

In diamonds sono mischiate le tre cose:
1) non si fa nulla
2) si ritorna null
3) si lanciano eccezzioni

Io dico, nel caso si dica che i controlli vanno fatti, mettere giù una linea generale...che poi sarà valutata caso per caso.

Spero di essere stato chiaro ... anche qua

P.S.:mazza quanto ho scritto
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 12:23   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Secondo me bisogna mettere questi pnti fermi:

- nel repository non deve entrare codice non testato
- se le condizioni di errore non sono testate non devono entrare nel repository

IMHO la penso così, magari mi sbaglio, ma se una classe deve essere promossa a libreria allora dovrà essere testata come tale (il TDD dice che in teoria si potrebbero anche fare test di sistema sulle librerie usate, comprese le API Java)...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 12:56   #8
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Quindi cionci diresti di aggiungere i test relativi ai parametri nel momento della promozione...

...MI PIACE
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 13:09   #9
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
1) SE devono diventare API di libreria, magari sì, ma in mancanza è meglio seguire la filosofia YAGNI.

2) D'accordo. Amo l'uniformità e nel caso di errori preferisco, in genere, che sia sollevata un'eccezione. Non amo però la gestione delle eccezioni di Java con la specifica dei throws.
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 13:26   #10
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da Bonfo
1) Cambio la domanda per farmi capire. Supponiamo di vendere il package it.diamonds.engine (esempio a caso), ovviamente senza codice. In questo caso dobbiamo garantire il perfetto funzionamento a chi lo vendiamo.
Cosa facciamo: gli diamo l'intero insieme dei test perchè possa controllare i parametri?? E se passa dei parametri sbagliati..come facciamoa dirglielo.
Nonero lo stesso fek che aveva detto: "Per la gestione delle condizioni di errore applichiamo la filosofia "Die very painfully". "
Questa domanda è molto più filosofica che un problema reale in diamonds

Il fatto è che ho pensato alla discussione con fek del riutilizzo con l'agile programming. E lui mi ha pienamente convinto con l'idea che da un progetto si possono "promuovere" ad un nodo superiore ad entrambi i progetti le classi che possono diventare librerie.
Il fatto è che però le classi promosse si dovrebbero comportare da liberire...quindi anche con tutti i controlli sui parametri

Spero di essere stato chiaro ...
Oltre a fornire la libreira e i test che la rigardano dovremmo preoccuparci di distribuire anche un po' di documentazione su carta, qualche info sul architettura ed uno o due grafici uml. Nel caso di una libreria andrebbe fatta si una validazione più stretta dei parametri di ingresso ma solo nelle funzioni a contatto con l'esterno. Se dovessimo controlalre i parametri in ogni funzione il codice si complicherebbe di molto.

In questo momento engine rimane all'interno di dimaond quindi direi di evitare di aggiungere controlli vari.
Quote:
Originariamente inviato da Bonfo
2) Intendo semplicemente decidere in quali casi usare le eccezioni e in quali casi usare i null o altro.
Per esempio: molte creazioni di oggetti non hanno controllo sui parametri.
Nel momento in cui si farà il controllo cosa si fa?
-si lancia un eccezzione dicendo "cretino hai sbagliato i parametri"
-si ritorna null e dici: cacchi suoi, ha sbagliato e mo se la gestisce lui

Sono approcci diversi che comportano codice diverso da parte dell'utilizzatore..è un gioco di responsabilità fra le classi.

In diamonds sono mischiate le tre cose:
1) non si fa nulla
2) si ritorna null
3) si lanciano eccezzioni

Io dico, nel caso si dica che i controlli vanno fatti, mettere giù una linea generale...che poi sarà valutata caso per caso.

Spero di essere stato chiaro ... anche qua

P.S.:mazza quanto ho scritto
In effetti non abbiamo delle linee guida. Provo a scrivere qualcosa ora da quello che mi ricordo di cc2 che diceva secondo me cose molto sensate:

- niente try/catch vuote se possibile.

- Niente scarica barili. Se si può gestire una eccezione la si deve gestire nel momento in cui la si intercetta.

- Usare le eccezioni solo per casi veramente speciali od errori che non possono essere ignorati. Ad esempio quando un parametro passato è valido ma non è possibile portare a termine una funzione per qualche motivo. config.getInteger("proprieta"); Qui "proprieta" è un valore valido ma se non è presente nel file di configurazione va lanciata una eccezione.
Esempio in cui non fare check e non usare eccezioni. grid.getGemAt(-1009,2044); I parametri sono completamente sballati. Non serve controllare ogni volta. Se l'accesso avviene ad indici assurdi ci pensa java stesso a lanciare una runtime exception.

- Niente eccezioni lanciate dai costruttori. Un null dopo una new è già di per se un segno che qualcosa è andato storto. Se chi ha chiamato il costruttore non controlla allora ci penserà java a lanciare una eccezione nel momento in cui cercherà di accedervi.

- Usare messaggi per le eccezioni con più informazioni possibili.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 13:42   #11
cdimauro
Senior Member
 
L'Avatar di cdimauro
 
Iscritto dal: Jan 2002
Città: Germania
Messaggi: 26110
Quote:
Originariamente inviato da VICIUS
Oltre a fornire la libreira e i test che la rigardano dovremmo preoccuparci di distribuire anche un po' di documentazione su carta, qualche info sul architettura ed uno o due grafici uml.
[fek MODE ON]
I test sono la migliore documentazione del codice.
[fek MODE OFF]

Quote:
- Niente eccezioni lanciate dai costruttori. Un null dopo una new è già di per se un segno che qualcosa è andato storto. Se chi ha chiamato il costruttore non controlla allora ci penserà java a lanciare una eccezione nel momento in cui cercherà di accedervi.
Però in questo modo si perderà l'informazione sulla causa che ha scatenato l'errore. La JVM, insomma, solleverà una "anonima" NullObjectException o giù di lì.
Se invece il codice solleva un'opportuna eccezione, magari avremo più informazioni su cos'è successo e sarà più facile provvedere al debug e al fix.

E' chiaro che, comunque, dipende dai casi.
cdimauro è offline   Rispondi citando il messaggio o parte di esso
Old 24-03-2006, 18:15   #12
VICIUS
Senior Member
 
L'Avatar di VICIUS
 
Iscritto dal: Oct 2001
Messaggi: 11471
Quote:
Originariamente inviato da cdimauro
[fek MODE ON]
I test sono la migliore documentazione del codice.
[fek MODE OFF]
Dai che qualche disegnino e qualcosa di generale può sempre servire. Anche a fek non dispiacerebbe

Quote:
Originariamente inviato da cdimauro
Però in questo modo si perderà l'informazione sulla causa che ha scatenato l'errore. La JVM, insomma, solleverà una "anonima" NullObjectException o giù di lì.
Se invece il codice solleva un'opportuna eccezione, magari avremo più informazioni su cos'è successo e sarà più facile provvedere al debug e al fix.

E' chiaro che, comunque, dipende dai casi.
Hai ragione. In oggetti in cui il costruttore ha molti parametri in effetti potrebbe essere molto utile ma a patto di usare eccezioni giuste e fornire messaggi chiari. Finché un oggetto ha uno o due parametri ci si riesce anche senza eccezioni.

ciao
VICIUS è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 04:07   #13
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Quote:
Originariamente inviato da Bonfo
Cosa voglio dire: ci sono alcune classi che se vendute come componente separato, cosa che sarebbe giusto poter fare, avrebbero un sacco di comportamenti non prestabiliti perchè, ad esempio, non si fa nessun controllo sui parametri in ingresso di alcuni metodi o costruttori
YAGNI!!!
fek è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 04:09   #14
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Quote:
Originariamente inviato da VICIUS
Hai ragione. In oggetti in cui il costruttore ha molti parametri in effetti potrebbe essere molto utile ma a patto di usare eccezioni giuste e fornire messaggi chiari. Finché un oggetto ha uno o due parametri ci si riesce anche senza eccezioni.

ciao
Soluzione: se un costruttore ha molti parametri lo si rifattorizza per averne meno
fek è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 20:08   #15
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Manco a cercarlo
Allora mi stavo accingendo ad aggiungere un test per migliorare la copertura.
Lancio cobertura e dal report risulta che CreateNewBigGemsAction ha un 3 linee di codice non coperte.
Le linee non coperte riguarda un controllo sul parametro gem in ingersso diverso da null nel metodo isGemNotValidForBigGem(),
Guardo e scopro che è un metodo privato, quindi non direttamente testabile.
Vado a vedere come viene usato dalla classe. Il metodo viene invocato da un metodo pubblico senza alcun controllo sul parametro.

Insomma...quelle 3 linee di codice per adesso non sono mai usate in quanto nessuno invoca con il parametro uguale a null.

Quindi, secondo la filosofia YAGNI, le 3 linee spariscono dalla faccia della terra

Giusto??
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 20:33   #16
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
secondo me spariscono
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 22:06   #17
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Quote:
Originariamente inviato da Bonfo
Quindi, secondo la filosofia YAGNI, le 3 linee spariscono dalla faccia della terra

Giusto??
Dipende. Se l'applicazione puo' logicamente passare un oggetto null e noi dobbiamo controllare la condizione per contratto allora vanno solo testate. Altrimenti saltano.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 22:14   #18
Bonfo
Senior Member
 
L'Avatar di Bonfo
 
Iscritto dal: Nov 2005
Città: Bologna
Messaggi: 1303
Ok...come pensavo io
__________________
Software engineer
Bonfo's Blog
Bonfo è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2006, 22:33   #19
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Secondo me sarebbe meglio procedere al refactoring di Grid dopo aver effettuato un refactoring delle varie gemme, chest, BigGem e stone... Si era parlato di fare una gerarchia di classi se non sbaglio... Io in tal caso sarei per trasferire parte di quello che viene fatto in Grid nelle gemme (come ad esempio la creazione delle BigGem e i crush)...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2006, 11:42   #20
Ufo13
Senior Member
 
L'Avatar di Ufo13
 
Iscritto dal: Nov 2005
Messaggi: 1545
Quote:
Originariamente inviato da cionci
Secondo me sarebbe meglio procedere al refactoring di Grid dopo aver effettuato un refactoring delle varie gemme, chest, BigGem e stone... Si era parlato di fare una gerarchia di classi se non sbaglio... Io in tal caso sarei per trasferire parte di quello che viene fatto in Grid nelle gemme (come ad esempio la creazione delle BigGem e i crush)...

Non so bene cosa intendi però secondo me le modifiche al "gameplay" devono coinvolgere il meno possibile le entità presenti nel gioco (quindi Gem, Grid etc) mentre dovrebbero esserci delle classi che gestiscono appunto le azioni che riguardano le meccaniche del gioco (come ad esempio fa GridController).
Ufo13 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy Z Fold7: un grande salto generazionale Recensione Samsung Galaxy Z Fold7: un grande sal...
The Edge of Fate è Destiny 2.5. E questo è un problema The Edge of Fate è Destiny 2.5. E questo ...
Ryzen Threadripper 9980X e 9970X alla prova: AMD Zen 5 al massimo livello Ryzen Threadripper 9980X e 9970X alla prova: AMD...
Acer TravelMate P4 14: tanta sostanza per l'utente aziendale Acer TravelMate P4 14: tanta sostanza per l'uten...
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Identikit della scheda video perfetta, p...
SUV, 100% elettrico e costa meno di un b...
Hai mai caricato un referto su ChatGPT? ...
Apple vuole un nuovo campus nella Silico...
DJI Osmo 360, la nuova action cam a 360&...
Lo strumento anti-requisiti per Windows ...
Utenti di Claude in rivolta: 'I bei vecc...
Rocket Lab Mars Telecommunications Orbit...
NVIDIA GeForce RTX: supporto driver su W...
iliad ha iniziato a vendere smartphone d...
La cinese SatNet ha lanciato un nuovo gr...
Cloud sovrano europeo: a che punto siamo...
The Medium arriverà al cinema gra...
Addio alle faccende domestiche? Il robot...
Fallito il primo lancio del razzo spazia...
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: 04:00.


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