Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 02-04-2007, 13: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, 13:54   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 14: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, 14: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, 14:23   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
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, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 19: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, 19:21   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da 71104 Guarda i messaggi
anche boolean penso...
No, in Java non è ammesso nello switch.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 02-04-2007, 19: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 02-04-2007, 23:23   #9
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12113
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, 10: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, 14: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, 15: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, 15: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, 16: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, 16: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, 17: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, 17: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 18:00. Motivo: tolto un commento al codice
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 03-04-2007, 18: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, 18: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, 18: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


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Windows 11, arriva il single-finger scro...
Porsche Cayenne Electric, arrivano porte...
Apple valuta NVIDIA NVLink per un server...
Energia solare sempre più economica: dal...
Google apre Home MCP: l'IA può controlla...
Auto SR di Microsoft arriva sui Copilot+...
Eu Kids Act ufficiale: niente social sot...
PS5 Linux perde il suo sviluppatore: sto...
GPU gaming, Rubin e RDNA 5 verso il 2028...
AMD: l'alternativa al DLSS 5 sarebbe in ...
Canon EOS R8 Mark II: sensore da 24,2 MP...
Alla Napoli Shipping Week 2026 arriva il...
Addio bollo: il Governo cancella la tass...
Speciale Logitech G: mouse PRO X SUPERLI...
Cosa pensano Altman, Amodei, Benioff e H...
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: 07:22.


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