Mettre l'accent sur la négation

13

J'étais en train d'écrire une instruction if avec des noms de propriétés assez longs et je suis tombé sur ce problème.

Disons que nous avons une instruction if comme celle-ci:

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

La deuxième propriété est de type booléen et cela n'a aucun sens d'avoir la stetement comme

if(boleanValue == true)

Existe-t-il une meilleure façon de mettre l'accent sur la négation que de mettre !en avant. Pour moi, il semble que cela peut être facilement supervisé lors de la lecture du code et peut potentiellement causer des problèmes de débogage

Ivan Crojach Karačić
la source
7
Extrayez la condition dans une méthode avec un nom significatif.
Joachim Sauer
2
... ou affectez la valeur négative à une variable avec un nom significatif et utilisez-la à la place dans la condition if.
scrwtp
+1 ce que @JoachimSauer a dit, si possible, mettez cette méthode sur l'objet qui est interrogé. Dans ce cas, la condition entière pourrait être encapsulée avec une méthode sur_someViewModelNameThatIsLong
MattDavey
2
Une chose générale que je fais souvent est d'entourer la négation d'un espace de chaque côté pour la rendre plus visible. if( ! something)vsif(!something)
Svish
Si vous privilégiez la négation, pourquoi ne pas l'utiliser ... && model.Prop == false)? Personnellement je l'utilise très rarement !, c'est trop facile à oublier.

Réponses:

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

Et puis, dans l'objet modèle de vue

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

(en supposant que someValue est une chaîne et n'est pas connue par l'objet modèle)

Cela met non seulement l'accent sur le! , mais il le rend généralement plus lisible. Maintenant, dans la méthode d'appel, je peux voir une condition, qui devrait être bien nommée pour décrire la condition dans le contexte de l'objet appelant. Et dans l'objet modèle, je peux voir ce que cela signifie dans le contexte de l'objet modèle.

pdr
la source
1
+1, c'est une bonne application du principe de l'expert en information .
MattDavey
1
Il convient de noter que cela someValuepeut devoir être un paramètre de la NeedsMeToDoSomethingméthode, selon votre situation.
MattDavey
@MattDavey: Oh, bon point.
pdr
@pdr Vous devriez peut-être créer une propriété pour ce modèle de vue avec le même booléen et réutiliser ce drapeau dans plus d'endroits. Je suis sûr que vous le trouverez à portée de main.
radu florescu
5

Mettez-le dans son propre bloc if avant d'évaluer les conditions les moins importantes. Non seulement il serait plus facile de lire sans l'encombrement des autres conditions, mais c'est aussi la première condition qu'un programmeur lira. Combinez cela avec l'idée déjà mentionnée par @scrwtp pour l'attribuer à une variable avec un nom significatif et vous obtenez:

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

Si vous programmez dans un langage de compilation, la plupart du temps, ces blocs imbriqués sont combinés à la fin de toute façon, tant que vous n'insérez pas de code entre les if externes et les if internes, cela ne devrait donc pas affecter les performances dans ces cas.

Neil
la source
2

Si vous utilisez C / C ++, le préprocesseur peut fournir une lisibilité.

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}
CWallach
la source
ou peut-être ... fonction not (x) {return! x; } // javascript
Alex
2
Opérateurs en C et C ++ Il existe déjà des synonymes standard pour différents opérateurs.
Joel
0

Je voudrais juste extraire

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

Dans une méthode qui renvoie cela. Si vous nommez cette méthode NotThisIsABooleanPropertyThatIsImportant, ça devrait aller.

mhr
la source