Sta usando 'continue', 'break' in loop non-'switch' e '?:' cattiva pratica? [duplicare]

3
    

Questa domanda ha già una risposta qui:

    

Di ritorno al college mi è stato detto che usare break; e continue; al di fuori di switch istruzioni (ad esempio per sfuggire for o while loops) è sbagliato, cattive abitudini e cattive abitudini allo stesso tempo perché significa solo che non puoi scrivere correttamente loop. È davvero?

Un mio amico mi ha anche detto che usare% condizionale% di co_de è una cattiva pratica, tuttavia ho iniziato a usarlo più spesso perché mi permette di scrivere cose in meno di 70 righe di codice mentre senza di esso avrei finire con qualcosa come 200 linee di codice. È molto utile in quasi tutti i progetti su cui lavoro e lo uso spesso. Dovrei smettere?

    
posta user84585 16.03.2013 - 20:20
fonte

4 risposte

12

break e continue stanno perfettamente bene, ci sono molti programmi che saranno difficili da esprimere senza di essi. L'unica volta che usarli diventa un problema è se vuoi dimostrare formalmente la correttezza. Nella maggior parte dei codici di vita reale, la correttezza è assicurata usando il test unitario, non la prova formale. Tuttavia, se un loop può essere espresso altrettanto facilmente senza break e continue , non usarli inutilmente.

L'utilizzo di ?: è in realtà una buona pratica. Una buona pratica per ?: è che tutte le espressioni (cioè la parte condizionale, la parte vera e la parte falsa) non dovrebbero avere alcun effetto collaterale eccetto per il loro valore di ritorno. Se l'espressione contiene un effetto collaterale, potresti invece utilizzare l'istruzione if-block convenzionale. Questo è un caso di separazione comandi-query , comando che ha un effetto collaterale usa if-block mentre le query che sono side-effect-free dovrebbero usare :? , questa però è una linea guida, non una regola dura e veloce, a volte query complicate potrebbero essere meglio espresse usando if-block.

    
risposta data 16.03.2013 - 21:18
fonte
12

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.

    
risposta data 16.03.2013 - 21:10
fonte
4

break e continue sono inestimabili, spesso rendono il codice più breve e più leggibile.

Bene, tranne quando non lo fanno. Se ti trovi a usarli troppo spesso o più volte in un blocco, può essere che tu voglia veramente che il corpo del ciclo sia una funzione (cioè "metodo" nella terminologia OO). A volte è meglio avere una funzione con ritorni anticipati di un blocco con più interruzioni e continua.

Per quanto riguarda ?: , questo è in realtà il cugino funzionale dell'istruzione if. La programmazione funzionale è alla moda, quindi sì, usala. Ma ricorda, quel codice funzionale dovrebbe essere privo di effetti collaterali, come altri qui detto.

    
risposta data 16.03.2013 - 23:00
fonte
1

È solo uno strumento dei programmatori. Nessuno strumento è cattivo o buono da solo, è sull'utente quanto efficientemente lui / lei può usare quello strumento e cosa può produrre con quello.

Diventa necessario quando vuoi scrivere codici ottimizzati e quando non ha senso continuare ad andare avanti nei loop

Un esempio molto comune di utilizzo dell'istruzione break è nell'algoritmo Ordinamento a bolle . Quando si effettua un controllo che se non si esegue alcuno scambio nel ciclo, il ciclo si interromperà ulteriormente mentre l'array è già risolto.

Allo stesso tempo è brutto quando viene usato male nei loop nidificati e si incorpora in troppi cicli annidati che si dimentica il flusso ed è altamente probabile che si possano ottenere errori logici nel codice.

? : --- è un modo per scrivere codice. Solo una mano corta, è anche uno strumento e dipende da dove lo usi. Può ridurre le linee di codice in alcuni punti e allo stesso tempo può ridurre la leggibilità del codice.

    
risposta data 16.03.2013 - 21:21
fonte

Leggi altre domande sui tag