Pulizia codice con operatore ternario...

Sono uno zuccone, ma questo operatore ternario non mi entra in testa...
Sto cercando di pulire il codice, ed arrivo a questa serie di istruzioni:

if (retro){analogWrite(lampeggio,255);}  //retroilluminazione 
  else{analogWrite(lampeggio,0);}

Posso semplificare in questo caso??
Mi spiegate meglio come usare il ternario??
Grazie

retro ? analogWrite(lampeggio,255) : analogWrite(lampeggio,0)

Grazie

manolomao:
Posso semplificare in questo caso??

Cosa pensi di semplificare ? ? ? Tutt'al più rendi il codice meno leggibile ... il compilatore se ne frega ed il risultato è identico.

La cosa corretta, che risponde a tutti gli standard, invece che quello che hai scritto, è scrivere:

/* verifica retroilluminazione */
if (retro) {
  analogWrite(lampeggio,255);
}
else {
  analogWrite(lampeggio,0);
}

Guglielmo

Ma ragazzi, domanda
analogWrite (lampeggio, (retro*255));
Va bene?

Silente:
Ma ragazzi, domanda
analogWrite (lampeggio, (retro*255));
Va bene?

Se retro è bool si, se è byte o int o long o ecc devi essere certo che i possibili valori assegnati siano solo o zero o uno.
In quanto a leggibilità comunque è certamente meglio la soluzione di Guglielmo

Se anche fosse int, MA, fosse l'esito di un test, sarebbe come se fosse bool
Che in 'c' non esiste, ma questa è altra storia...

Cia' dai aggiungiamo un suggerimento allo 'aiutatemi ad aiutarvi'
L'operatore ternario è sconsigliato.

UNDICESIMO COMANDAMENTO
Non commetterai terniarizzazione!
Non col tuo pc ne con la tua tastiera
Non col pc di altri ne con la tastiera di altri
Non col tuo IDE ne con lo IDE del tuo vicino

Santifica il sabato e via così..
.

Mai che trovo le faccine, sul furbofono

Concordo che il ternario è veramente poco leggibile, soprattutto se la condizione di test non è secca (Es. variabile bool) c'è e a qualcosa serve, come il goto... :smiley: ma è meglio lasciarlo a quel qualcosa :smiling_imp:

Standardoil:
Se anche fosse int, MA, fosse l'esito di un test, sarebbe come se fosse bool
Che in 'c' non esiste, ma questa è altra storia...

Yes, ma nell'esempiio di Silente è un'operazione quindi ho preferito fargli porre l'attenzione su possibili "effetti avversi"

Vero, grazie della correzione, non ci avevo pensato
analogWrite (lampeggio, ((retro==1)*255));
Poi noni ricordo mai, analogWrite va fino a 255 o 511?

Guarda, io mi sto scrivendo, a tempo perso delle macro di tastiera, tipo quelle di Autoit nella finestra
E per la if mi mette anche la else con le due graffe su due linee differenti
Basta come indice di quanto sono kosher?
Edit rispondevo a fabpolli

Silente:
Vero, grazie della correzione, non ci avevo pensato
analogWrite (lampeggio, ((retro==1)*255));
Poi noni ricordo mai, analogWrite va fino a 255 o 511?

Sbagliato, ritenta :slight_smile:
Prova a pensare che retro (non di tipo bool altrimenti non serve) possa valere:
0
1
123
e tu vuoi ottenere o zero o 255

Silente:
Poi noni ricordo mai, analogWrite va fino a 255 o 511?

Use il reference Luke! :slight_smile:

analogWrite

parameters
value: ...

Premesso che non mi è mai piaciuto il ternario e che se di fatto non fornisce praticamente alcun vantaggio in termini di dimensione o velocità del codice (quindi a cosa serve?), volendo proprio fare qualcosa di apparentemente più compatto in questo caso farei:

analogWrite(lampeggio, (retro>0)*255);

oppure, meglio, farei "bool retro" (non so se sia così) e:

analogWrite(lampeggio, retro*255);

Urca, pensavo fosse utile invece....
Nei miei codici ho sempre fatto degli if-else, e il ternario pensavo migliorasse,invece effettivamente complica....

Ps: Retro è una bool....

Grazie degli spunti dati...

manolomao:
Nei miei codici ho sempre fatto degli if-else, e il ternario pensavo migliorasse,invece effettivamente complica....

... come ti ho già scritto, a livello "risultato finale", né semplifica, né complica ... il compilatore ottimizza comunque come crede meglio, comunque tu scriva; invece, a livello di "lettura" del codice, lo rende sicuramente meno leggibile :wink:

Guglielmo

docdoc:
analogWrite(lampeggio, retro*255);

A me paradossalmente questo sembra meno leggibile del ternario, perché tocca fare mente locale sui valori assunti da retro e accettati da analogWrite, c'è un calcolo che non c'entra direttamente con il valore da assegnare. L'unico caso in cui il ternario mi sembra utile è proprio con la write:

analogWrite(lampeggio, retro ? 255 : 0);

Magari con molte write l' utilità è più evidente:

digitalWrite(PIN_LUCE,    luce    ? RL_ON : RL_OFF);
digitalWrite(PIN_ALLARME, allarme ? RL_ON : RL_OFF);
digitalWrite(PIN_POMPA,   pompa   ? RL_ON : RL_OFF);
digitalWrite(PIN_VALVOLA, valvola ? RL_ON : RL_OFF);
digitalWrite(PIN_SFIATO,  sfiato  ? RL_ON : RL_OFF);

Claudio_FF:
A me paradossalmente questo sembra meno leggibile del ternario,...

Sono d'accordo, anche io preferisco usare il ternario :slight_smile:

In merito alla leggibilità, beh è tutta questione di abitudine. Io scrivo tanto in C# e Javascript, e la trovo comodissima, rende il codice compatto, tanto che ne sento la mancanza nei linguaggi VB!

Anche io sono per la salvaguardia del ternario, ma solo nei casi semplici esemplificati da @Claudio_FF
e magari con la sua impaginazione che incolonna bene bene.
Ovvio che se le istruzioni diventano più lunghe cambia tutto.
Questa è la mia opinione a prescindere da norme, regole, dogmi ecc.
Poi, in certi ambiti certe regole vanno applicate... amen, se s'ha da fa', s'ha da fa' e ci si adegua....