Combina se blocchi con codice ripetitivo

0

Ho questo pezzo di codice

if (!expr1) {
    codeblock1;
} elseif (expr2) {
    codeblock2;

    codeblock1;
}

Mi sta facendo arrabbiare perché sto cercando di rifattorizzarlo in modo tale che non ci sia un codice ripetitivo, ma continuo a ottenere risultati diversi.

if (!expr1 || expr2) {
    if (expr2) {
        codeblock2;
    }

    codeblock1;
}

Qual è la differenza logica tra questi due esempi?

    
posta php_nub_qq 05.10.2016 - 14:24
fonte

2 risposte

5

Nel snippet 1 dichiari esplicitamente che non vuoi che codeblock2 venga eseguito se expr1 è falso.

In snippet 2 stai affermando che NON vuoi eseguire codeblock2 , anche se expr1 è false, fintanto che expr2 è true.

Inoltre, supponendo che codeblock1 e codeblock2 siano una serie di linee di codice (più di una sola riga), puoi estrarle a metodi. In questo modo puoi:

if (!expr1) {
    codeblock1(); // calling a method
} elseif (expr2) {
    codeblock2(); // calling a method
    codeblock1(); // calling a method
}

... che non è la ripetizione del codice cosiderata.

    
risposta data 05.10.2016 - 14:43
fonte
5

In questo caso specifico, un buon modo per ridefinire il codice sarebbe rendere le condizioni più chiare. (Assicurati di inserire il seguente codice in una funzione)

if (expr1 and !expr2)
    return;
if (expr1 and expr2)
    codeblock2();
codeblock1();

Se leggi il codice riga per riga, vedi:

  • Se expr1 è vero ed expr2 è falso, non fare nulla, lascia la funzione
  • Se expr1 è vero ed expr2 è vero, esegui codiceblock2
  • esegui codeblock1

Rende molto chiaro quali condizioni si stanno effettivamente controllando, e cosa succede quando viene soddisfatta tale condizione specifica.

    
risposta data 05.10.2016 - 17:17
fonte

Leggi altre domande sui tag