Enfatizza la negazione

13

Stavo solo scrivendo un'istruzione if con nomi di proprietà abbastanza lunghi e mi sono imbattuto in questo problema.

Diciamo che abbiamo un'istruzione if in questo modo:

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
   !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}

La seconda proprietà è di tipo booleano e non ha senso avere lo stetement come

if(boleanValue == true)

C'è un modo migliore per enfatizzare la negazione, quindi mettere in primo piano ! . A me sembra che questo possa essere facilmente supervisionato durante la lettura del codice e potrebbe potenzialmente causare problemi con il debug

    
posta Ivan Crojach Karačić 21.01.2013 - 12:17
fonte

4 risposte

22
if(_someViewModelNameThatIsLong.NeedsMeToDoSomething(someValue))
{
    //Do something
}

E poi, nella vista oggetto modello

public bool NeedsMeToDoSomething(string someValue)
{
    return AnotherPropertyINeedToCheck == someValue &&
        !ThisIsABooleanPropertyThatIsImportant;
}

(supponendo che someValue sia una stringa e non sia conosciuto dall'oggetto del modello)

Questo non solo enfatizza il! operatore, ma lo rende più leggibile in generale. Ora, nel metodo di chiamata, posso vedere una condizione, che dovrebbe essere ben denominata per descrivere la condizione nel contesto dell'oggetto chiamante. E nell'oggetto modello, posso vedere cosa significa nel contesto dell'oggetto modello.

    
risposta data 21.01.2013 - 12:37
fonte
5

Mettilo nel suo blocco se prima di valutare le condizioni meno importanti. Non solo sarebbe più facile leggere senza il disordine delle altre condizioni, ma è anche la prima condizione che un programmatore leggerà. Combina questo con l'idea già menzionata da @scrwtp per assegnare a una variabile con un nome significativo e ottieni:

var isValid = !_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant;
if( isValid ) 
{
    if( _someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue ) 
    {
        //Do something
    }
}

Se si sta programmando in un linguaggio del compilatore, la maggior parte delle volte questi blocchi annidati se vengono combinati alla fine comunque, fintanto che non si inserisce il codice tra l'esterno se e l'interno se, quindi non dovrebbe influenzare prestazioni in questi casi.

    
risposta data 21.01.2013 - 12:32
fonte
2

Se si utilizza C / C ++, il preprocessore potrebbe fornire una leggibilità.

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}
    
risposta data 21.01.2013 - 21:47
fonte
0

Vorrei solo estrarre

'!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant'

In un metodo che restituisce questo. Se si nomina questo metodo NotThisIsABooleanPropertyThatIsImportant dovresti stare bene.

    
risposta data 21.01.2013 - 13:27
fonte

Leggi altre domande sui tag