Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo
Per diversi giorni il Galaxy S26 Ultra di Samsung è stato il nostro compagno di vita. Oltre alle conferme del colosso coreano come la qualità del display e una suite AI senza rivali, arriva il Privacy Display, un unicum nel mondo smartphone. Ci sono ancora alcuni gap che non sono riusciti a colmare lato batteria e fotocamera, seppur con alcuni miglioramenti.
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Diablo II Resurrected: il nuovo DLC Reign of the Warlock
Abbiamo provato per voi il nuovo DLC lanciato a sorpresa da Blizzard per Diablo II: Resurrected e quella che segue è una disamina dei nuovi contenuti che abbiamo avuto modo di sperimentare nel corso delle nostre sessioni di gioco, con particolare riguardo per la nuova classe dello Stregone
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup
Siamo tornati nel parco tecnologico di Trieste per il kick-off del programma che mette a disposizione di cinque startup le infrastrutture di ricerca, dal sincrotrone Elettra ai laboratori di genomica e HPC. Roberto Pillon racconta il modello e la visione
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-04-2007, 14:35   #1
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
[qualsiasi]salti condizionali

Ciao a tutti

Mi sto sconfortando perchè non riesco ad organizzare in modo logico una serie di scelte che il programma dovrebbe fare in base a delle condizioni.

A prescindere dal tipo di linguaggio che sto utilizzando, ho difficoltà di questo tipo nel modo di pensare:

Codice:
//devo prima verificare che determinati valori non siano nulli, per esempio:

if(valore1 != null)
{
   //istruzione
}
if(valore2 != null)
{
  //istruzione
}
Fin qui, tutto chiaro (come concetto)
Ora, però mi trovo ad affrontare una catena orrorifica di "if" dato che quando verifico il primo valore, poi devo anche verificare altri due `subvalori`, per es.:

Codice:
if(valore1 != null && subvalue1 != null)
{
   //istruzione
}
if(valore1 != null && subvalue2 != null)
{
  //istruzione
}
if(valore1 != null && subvalue3 != null)
{
   if(subvalue2 > subvalue1)
   {
      //istruzione
   }
   else if(subvalue5 <= subvalue1)
   {
     //istruzione
   }
}

//etcetera...
Capisco da solo che è un modo orrendo di `pensare`.

Mi dareste una mano a migliorare?


Grazie mille


RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 14:54   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Ora, però mi trovo ad affrontare una catena orrorifica di "if" dato che quando verifico il primo valore, poi devo anche verificare altri due `subvalori`

Capisco da solo che è un modo orrendo di `pensare`.

Mi dareste una mano a migliorare?
Beh, se è proprio quello che devi fare non è che ci siano molte altre strade .....
Al massimo visto che il test valore1 != null l'hai ripetuto più volte, potresti racchiudere tutto in un unico if (valore1 != null).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 15:06   #3
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
ricorda che la validità dei parametri va verificata solo se provengono da fonti non fidate, come librerie esterne non del sistema operativo o dall'input dell'utente. mi sento di doverlo specificare perché al corso di programmazione 2 c'era una professoressa che diceva che i parametri delle funzioni vanno verificati SEMPRE (con anche il grassetto, o urlando a squarciagola se lo diceva a voce ), cosa palesemente falsa
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 15:16   #4
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Innanzitutto, grazie per le risposte

@ 71104: si tratta di input utente, quindi devo per forza di cose verificarne la validità

@ andbin: quindi dici che purtroppo non ho molte strade da seguire, ma credo che questo derivi dal fatto che non ho esposto troppo bene il problema Faccio un pò di `analisi` e poi sono sicuro che mi segnalerai al daily wtf

Mentre leggevo le vostre risposte, ho però pensato a:

e se usassi `switch\case` ?
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 15:23   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Mentre leggevo le vostre risposte, ho però pensato a:

e se usassi `switch\case` ?
Dipende da cosa devi testare. A seconda del linguaggio in genere lo switch è limitato a certi tipi di dati. Ad esempio in Java puoi usare solo byte/char/short/int (e i relativi wrapper) e gli enum, non certo stringhe o altri reference.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 20:12   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da andbin Guarda i messaggi
Dipende da cosa devi testare. A seconda del linguaggio in genere lo switch è limitato a certi tipi di dati. Ad esempio in Java puoi usare solo byte/char/short/int (e i relativi wrapper) e gli enum, non certo stringhe o altri reference.
anche boolean penso... ovvio però che non ha molto senso
Codice:
switch (flag)
{
case true:
case false:
default:  // lol?
}
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 20:21   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da 71104 Guarda i messaggi
anche boolean penso...
No, in Java non è ammesso nello switch.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 20:23   #8
Fede_Reghe
Member
 
L'Avatar di Fede_Reghe
 
Iscritto dal: Dec 2006
Città: Firenze
Messaggi: 118
Potresti fare uno switch sulle sub, ma non avrebbe molto senso... Ti conviene usare gli if come hai fatto...

P.S: non è necessaria la default:
__________________
Federica
Fede_Reghe è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 00:23   #9
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
Codice:
public class ProvaIf {

	public ProvaIf() {
		String a = "";
		String b = null;
		String c = null;
		String d = null;
		if (a != null) {
			try {
				Class.forName("B" + b).newInstance();
				Class.forName("C" + c).newInstance();
				Class.forName("D" + d).newInstance();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}


	public static void main(String[] args) {
		ProvaIf p = new ProvaIf();
	}
}
Codice:
public class Bnull {

	public Bnull() {
		System.out.println("B null");
	}
}
Codice:
public class Cnull {

	public Cnull() {
		System.out.println("C null");
	}
}
Codice:
public class Dnull {

	public Dnull() {
		System.out.println("D null");
	}
}
Ecco un esempio di come NON usare la reflection
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 11:02   #10
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Grazie a tutti per i suggerimenti, ma, tra poco dovrei aver finito l'horror code.

Quando lo termino, lo posto, in modo da essere sicuro di potervi far morire dal ridere per i prossimi 5 lustri
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 15:27   #11
pisto
 
Messaggi: n/a
ma tipo fare una matrice/array di Method? (parlando di java)
  Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 16:09   #12
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Per sfruttare il collegamento dinamico deve prima ricondurre l'insieme di condizioni ad un identificatore. Un hashing, in pratica. Roba tipo:

actions.get(valore1, valore2, subValue1, subValue2, subValue3).execute();

Il "get" non deve essere definito tramite "if" o analoghi, se no è un barbatrucco.

Tutto sta nel trovare una funzione di hashing che riesca ad indentificare un'azione considerando non il valore assoluto dei parametri ma le loro disuguaglianze.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 16:18   #13
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Ecco, adesso state cominciando a spaventarmi
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 17:21   #14
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da pisto Guarda i messaggi
ma tipo fare una matrice/array di Method? (parlando di java)
ma caro Andrea (), e come indici cos'hai intenzione di usare, i null?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 17:43   #15
pisto
 
Messaggi: n/a
Quote:
Originariamente inviato da 71104 Guarda i messaggi
ma caro Andrea (), e come indici cos'hai intenzione di usare, i null?
se è una battuta non l'ho capita
  Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 18:56   #16
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da pisto Guarda i messaggi
se è una battuta non l'ho capita
cosa usi come indici per accedere agli elementi della matrice?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 18:59   #17
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quote:
Originariamente inviato da RaouL_BennetH Guarda i messaggi
Ecco, adesso state cominciando a spaventarmi
Non c'è nulla di cui spaventarsi .

Supponiamo un caso semplice. Cioè usiamo Java .

Hai due riferimento, a e b. Vuoi fare qualcosa in corrispondenza delle condizioni:

a != null e b != null
a == null e b == null
a = null e b != null
a != null e b = null

Non è bizzarro pensare, come ha fatto pisto, di avere un array di 4 oggetti, diciamo 4 Runnable (lasciamo da parte la riflessione ma si potrebbe usare anche quella per rendere l'ambaradan ancora più generico). I 4 Runnable nell'array sono indicizzati. Tutto quello che devi fare è stabilire un qualche genere di funzione che data una coppia di riferimenti trasforma l'unione dei loro valori in un numero intero da 0 a 3.

Ad esempio (molto teoricamente e detto da uno per cui la matematica è uno stato d'animo ):

Codice:
int hash(Object valueA, Object valueB) {
    int hashA = System.identityHashCode(valueA);
    int hashB = System.identityHashCode(valueB);
    hashA = (3 * hashA) / (2 * hashA);
    hashB = (3 * hashB) / (2 * hashB);
    return hashA + 2 * hashB;
}
Basandoti su una comprovata (e non quella) funzione di hash che faccia quanto su detto, puoi creare senza difficoltà una struttura tipo:

Codice:
public class DecisionMap {
	private static final class Condition {};
	public static final Condition NULL = null;
	public static final Condition NOT_NULL = new Condition();
	private Runnable[] runners = new Runnable[4];

	public void set(Runnable r, Condition valueA, Condition valueB) {
		runners[hash(valueA, valueB)] = r;
	}

	public void decide(Object valueA, Object valueB) {
		runners[hash(valueA, valueB)].run();
	}

	private int hash(Object a, Object b) {
		int hashOne = System.identityHashCode(a);
		int hashTwo = System.identityHashCode(b);
		hashOne = (3 * hashOne) / (2 * hashOne + 1);
		hashTwo = (3 * hashTwo) / (2 * hashTwo + 1);
		return hashOne + 2 * hashTwo;
	}
}
e usarla ad esempio:

Codice:
public class Main {

	public static void main(String[] args) {
		class Printer implements Runnable {
			private String text;
			Printer(String text) { this.text = text; }
			public void run() { System.out.println(text); }
		}
		DecisionMap map = new DecisionMap();
		map.set(new Printer("null, null"),
			DecisionMap.NULL,
			DecisionMap.NULL);
		map.set(new Printer("null, not null"),
			DecisionMap.NULL,
			DecisionMap.NOT_NULL);
		map.set(new Printer("not null, not null"),
			DecisionMap.NOT_NULL,
			DecisionMap.NOT_NULL);
		map.set(new Printer("not null, null"),
			DecisionMap.NOT_NULL,
			DecisionMap.NULL);

		map.decide(null, "hello");
		map.decide(2, null);
		map.decide("hello", "world");
	}
}
Tutto sta nel ricondurre caratteristiche note a valori noti ed eseguire poi un calcolo dall'esito... noto L'arte di sapersi spiegare .

Non so quanto sia conveniente a livello di conti fatti dal PC. Ma se ti stanno antipatici gli if penso che l'unica alternativa sia l'hashing.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!

Ultima modifica di PGI-Bis : 03-04-2007 alle 19:00. Motivo: tolto un commento al codice
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 19:00   #18
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
E perché non togliere tutti i controlli e poi
catch di NullPointerException?

Certo bisognerebbe vedere il codice...

lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 19:48   #19
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
@PGI-Bis: la versione con la matrice sarà anche più efficiente, ma obiettivamente quella con gli if occupa molte meno righe di codice... :|
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 19:50   #20
RaouL_BennetH
Senior Member
 
L'Avatar di RaouL_BennetH
 
Iscritto dal: Sep 2004
Messaggi: 3967
Quote:
Originariamente inviato da lovaz Guarda i messaggi

Certo bisognerebbe vedere il codice...

mmm.. mi sa di no ... mi vergogno

Però tenete presente che sono un principiante, quindi siate comprensivi....

Premessa:

tutto questo casino che sto cercando di fare (ma con il solo scopo di iniziare a crearmi dei problemi e vedere se riesco a risolvermeli) nasce dal fatto ho un oggetto `griglia` composto da:

entrata1, uscita1, entrata2, uscita2, totale, totaleSingolo, Ordinario, Festivo, Notturno, TotaleEuroGiornaliero:

Ora.. devo fare in modo che :

1) se entrata1 ed uscita1 non sono vuoti, la cella corrispondente nella colonna 'totale' mi faccia un calcolo

2) se entrata2 e uscita2 non sono vuoti (ma sono vuoti entrata1 e uscita1), la cella corrispondente a totale mi faccia un altro calcolo

3) e non sono vuote tutte e quattro, mi faccia un calcolo fra uscita2 e uscita1.

4) se sono vuote tutte e quattro, devo vagliare solo totaleSingolo.

Inoltre... se:

1) Ordinario = 1; totaleGiornaliero faccia "totale (o totaleSingolo) * 6

2) Festivo = 1; vuol dire che ne Ordinario ne Notturno sono uguali a 1, e quindi devo fare: totaleGiornaliero = (totale o totaleSingolo) * 12

etc....

E ancora, appena una cella perde il focus, devo:

fare il parsing del testo immesso dall'utente e validarlo
se non è valido formattarlo..

dopodichè, ecco a voi il mio horror code:

Codice:
//il programma è scritto in C#, ma credo che non sia scritto come se fosse C#



private void TestMethod(DataGridViewCellEventArgs e)

DateTime dt1, dt2, dt3, dt4;
bool b1, b2, b3, b4;

if(griglia.Rows[e.RowIndex].Cells[2].Value != null)
{
   for(int r = 3; r <= 12; r++)
   {
       griglia.Rows[e.RowIndex].Cells[r].ReadOnly = true;
   }
}

if(griglia.Rows[e.RowIndex].Cells[entrata1].Value != null &&
griglia.Rows[e.RowIndex].Cells[uscita1].Value != null)
{
   b1 = DateTime.TryParse(griglia.Rows[e.RowIndex].Cells[entrata1].Value, out dt1);

   b2 = DateTime.TryParse(griglia.Rows[e.RowIndex].Cells[uscita1].Value, out dt2);

   if( dt1 > dt2 )
   {
       TimeSpan ts = dt2.AddHours(24) - dt1;
       griglia.Rows[e.RowIndex].Cells[totale].Value = ts.ToString();
      
       if(griglia.Rows[e.RowIndes].Cells[Ordinario].Value != null)
       {
          griglia.Rows[e.RowIndex].Cells[totaleEuroGiornaliero].Value = (ts.Hours + (ts.Minutes / 60 )) * 6;

        }
        else if (griglia.Rows[e.RowIndex].Cells[Festivo].Value != null)
        {
           griglia.Rows[e.RowIndex].Cells[totaleEuroGiornaliero].Value = (ts.Hours + (ts.Minutes / 60)) * 12;
        }

//e questo solo nel primo caso e nel primo sottocaso in cui dt2 è < di dt1
//immaginate cosa sono riuscito a combinare per tutti i casi.... :D

}
Oltre ad una profonda vergogna che mi impone di non continuare a postare il codice..... vi prego di farmi letteralmente a pezzi senza nessuna pietà


RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek
RaouL_BennetH è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione Samsung Galaxy S26 Ultra: finalmente qualcosa di nuovo Recensione Samsung Galaxy S26 Ultra: finalmente ...
Diablo II Resurrected: il nuovo DLC Reign of the Warlock Diablo II Resurrected: il nuovo DLC Reign of the...
Deep Tech Revolution: così Area Science Park apre i laboratori alle startup Deep Tech Revolution: così Area Science P...
HP OMEN MAX 16 con RTX 5080: potenza da desktop replacement a prezzo competitivo HP OMEN MAX 16 con RTX 5080: potenza da desktop ...
Recensione Google Pixel 10a, si migliora poco ma è sempre un'ottima scelta Recensione Google Pixel 10a, si migliora poco ma...
MacBook Neo sorprende iFixit: 'Non vedev...
Venus Optics presenta due nuovi obiettiv...
AMD pubblica una guida per eseguire Open...
Tomb Raider I-III Remastered arriva su A...
X fa marcia indietro: si adeguerà...
Framework e la crisi delle memorie: terz...
Doom è ovunque: perché il ...
NVIDIA aggiorna G-Sync Pulsar: migliorat...
Portatile gaming con RTX 5060 a 1.099€: ...
6G for dummies: al MWC 2026 il CEO di Qu...
Le RAM tornano a salire di prezzo: quest...
5 robot aspirapolvere bestseller al mini...
A 59 anni il mio primo hackathon: dieci ...
Come sfruttare le Offerte di Primavera p...
NVIDIA promette un salto enorme: path tr...
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: 23:35.


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