Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio
POCO F9 Pro arriva sul mercato con l'obiettivo di portare prestazioni da smartphone top di gamma in una fascia di prezzo "più aggressiva", senza rinunciare a un comparto fotografico finalmente all'altezza. Dopo averlo testato sul campo, emerge uno smartphone molto più completo rispetto alla generazione precedente, ma anche con alcuni piccoli compromessi che diventano difficili da ignorare quando il prezzo di listino sfiora i 1.000 euro.
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI
Snapdragon Soung Gen 2 è la piattaforma Qualcomm per i dispositivi audio sempre più integrati nel mondo dell'intelligenza artificiale: al prorpio interno tanta potenza elaborativa per gestire al meglio le necessità d'uso dell'agentic AI
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6
In occasione del proprio Snapdragon Summit Qualcomm annuncia i due nuovi chip per dispositivi mobile di fascia alta che entreranno nel mercato nel corso del 2027: tanta potenza a disposizione per elaborazioni di intelligenza artificiale sempre più complesse
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 developer – SCJP 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 developer – SCJP 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 developer – SCJP 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


Recensione POCO F9 pro: potenza da vero top di gamma, display da 185 Hz e finalmente una fotocamera da prendere sul serio Recensione POCO F9 pro: potenza da vero top di g...
Tra audio e AI: la ricetta di Qualcomm per l'agentic AI Tra audio e AI: la ricetta di Qualcomm per l'age...
Qualcomm annuncia la nuova generazione di SoC Snapdragon 8 Elite Gen 6 Qualcomm annuncia la nuova generazione di SoC Sn...
realme 16 Pro Harry Potter Edition: il nuovo midrange ha uno stemma di Hogwarts che cambia colore al sole! realme 16 Pro Harry Potter Edition: il nuovo mid...
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Opera: la VPN gratuita si accende in aut...
Giochi capaci di costruirsi in tempo rea...
Giochi DX11 su Intel Arc e Proton: le ot...
Bentley Torcal ufficiale: 876cv e ricari...
Counter-Strike 2: con poche modifiche, V...
Silent Hill potrebbe tornare al cinema c...
L'integrazione di ChatGPT su Siri è stat...
ASML: 'Non vendiamo assolutamente nulla ...
Anthropic limita Claude Opus 5.5 nello s...
Microsoft 365, l'Antitrust respinge le p...
SAP NOW AI Tour Milan: una giornata con ...
Quake Champions dice addio al free-to-pl...
Anker AeroClip 2, li indossi e dopo un p...
Notebook ASUS da gaming per il Back to S...
Auto elettriche UE al 21,7%: sorpasso si...
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: 00:34.


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