Su break
e continue
Non penso che ci sia qualcosa di fondamentalmente sbagliato in break
o continue
. Penso che la motivazione per evitarli debba davvero fare di più con la leggibilità che con qualsiasi altra cosa. Considera i seguenti cicli (non strettamente codice c / c ++):
// loop 1
for(int i = 0; i < a.length; i++)
{
if (!found(a[i]))
continue;
result = a[i];
break;
}
// loop 2
for(int i = 0; i < a.length; i++)
{
if (found(a[i]))
{
result = a[i];
break;
}
}
// loop 3
{
bool resultFound = false;
for(int i = 0; !resultFound && i < a.length; i++)
{
if (found(a[i]))
{
result = a[i];
resultFound = true;
}
}
}
Tutti e tre questi cicli eseguono essenzialmente lo stesso codice, ma sono scritti in modi leggermente diversi. La vera domanda è quale tra le più efficaci trasmette l'intento dell'autore?
-
loop 1 - molto cattivo. Qui la logica sembra essere invertita e la continue
è praticamente gratuita. Se tradotto in inglese questo dovrebbe leggere qualcosa come:
Loop through the list while the item is not found, but if it is set the result then stop.
-
loop 2 - buono. Questo è il modo in cui tali loop vengono generalmente scritti. Se tradotto in inglese questo dovrebbe leggere qualcosa come:
Loop through the list and if the item is found, set the result then stop.
-
loop 3 - un po 'brutto. La logica break / continue si trova nelle condizioni del for
loop, che non è così comune. Significa che se qualcuno sta leggendo il tuo codice vuole sapere cosa
succederà dopo, devono tornare all'inizio del ciclo. A break
(come nel ciclo 2)
specifica quella logica esattamente in un punto. Se tradotto in inglese questo dovrebbe leggere qualcosa come:
Loop through the list while the item is not found and if an item is found, set the result.
sull'operatore ?:
Ancora una volta, non c'è niente di fondamentalmente sbagliato in questo. È davvero una questione di stile personale e leggibilità.
// Good uses of conditional operator
string result = (someBool) ? "YES" : "NO";
string oddness = (someInt % 2 == 0) ? "even" : "odd";
// Bad use of conditional operator
int result = ConditionA() ? (ConditionB() ? 0 : 1) : (ConditionC() ? 2 : 3);
Anche in questo caso l'intento dei programmatori è abbastanza chiaro nei primi due esempi, ma è molto più oscurato nell'ultimo.