Negation betonen

13

Ich habe gerade eine if-Anweisung mit ziemlich langen Eigenschaftsnamen geschrieben und bin auf dieses Problem gestoßen.

Nehmen wir an, wir haben eine if-Anweisung wie diese:

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

Die zweite Eigenschaft ist ein Boolescher Typ und es macht keinen Sinn, dass das stetement so ist

if(boleanValue == true)

Gibt es eine bessere Möglichkeit, die Verneinung zu betonen, als das in den Vordergrund zu stellen !? Mir scheint, dass dies beim Lesen des Codes leicht übersehen werden kann und potenziell Probleme beim Debuggen verursachen kann

Ivan Crojach Karačić
quelle
7
Extrahieren Sie die Bedingung in eine Methode mit einem aussagekräftigen Namen.
Joachim Sauer
2
... oder weisen Sie den negierten Wert einer Variablen mit einem aussagekräftigen Namen zu und verwenden Sie ihn stattdessen in der if-Bedingung.
Scrwtp
+1 was @JoachimSauer gesagt hat, wenn möglich diese Methode auf das Objekt setzen, das abgefragt wird. In diesem Fall könnte die gesamte Bedingung mit einer Methode gekapselt werden_someViewModelNameThatIsLong
MattDavey
2
Eine allgemeine Sache, die ich oft tue, ist, die Negation mit einem Leerzeichen auf jeder Seite zu umgeben, um sie sichtbarer zu machen. if( ! something)vsif(!something)
Svish
Wenn Sie Negation betonen, warum nicht verwenden ... && model.Prop == false)? Ich persönlich benutze !es sehr selten , es ist zu leicht zu übersehen.

Antworten:

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

Und dann im Ansichtsmodellobjekt

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

(unter der Annahme, dass someValue eine Zeichenfolge ist und dem Modellobjekt nicht bekannt ist)

Dies unterstreicht nicht nur die! Operator, aber es macht es allgemein besser lesbar. Jetzt kann ich in der aufrufenden Methode eine Bedingung sehen, die gut benannt sein sollte, um die Bedingung im Kontext des aufrufenden Objekts zu beschreiben. Und im Modellobjekt kann ich sehen, was das im Kontext des Modellobjekts bedeutet.

pdr
quelle
1
+1, dies ist eine gute Anwendung des Informationsexpertenprinzips .
MattDavey
1
Es ist zu beachten, someValuedass NeedsMeToDoSomethingabhängig von Ihrer Situation möglicherweise ein Parameter für die Methode sein muss.
MattDavey
@ MattDavey: Oh, guter Punkt.
pdr
@pdr Vielleicht sollten Sie diesem Ansichtsmodell eine Eigenschaft mit demselben Booleschen Wert zuweisen und dieses Flag an mehreren Stellen wiederverwenden. Ich bin sicher, Sie werden es praktisch finden.
Radu Florescu
5

Setzen Sie es in einen eigenen if-Block, bevor Sie die weniger wichtigen Bedingungen auswerten. Es ist nicht nur einfacher zu lesen, ohne die anderen Bedingungen zu verfälschen, sondern es ist auch die erste Bedingung, die ein Programmierer lesen wird. Kombinieren Sie dies mit der Idee, die bereits von @scrwtp erwähnt wurde, um eine Variable mit einem aussagekräftigen Namen zuzuweisen, und Sie erhalten:

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

Wenn Sie in einer Compilersprache programmieren, werden diese verschachtelten Blöcke meistens trotzdem am Ende kombiniert, sofern Sie keinen Code zwischen dem äußeren und dem inneren if einfügen, sodass die Leistung in diesen nicht beeinträchtigt wird Fälle.

Neil
quelle
2

Wenn Sie C / C ++ verwenden, bietet der Präprozessor möglicherweise Lesbarkeit.

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}
CWallach
quelle
oder vielleicht ... funktioniert nicht (x) {return! x; } // Javascript
Alex
2
Operatoren in C und C ++ Es gibt bereits Standard-Synonyme für verschiedene Operatoren.
Joel
0

Ich würde nur extrahieren

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

In einer Methode, die dies zurückgibt. Wenn Sie diese Methode NotThisIsABooleanPropertyThatIsImportant nennen, sollten Sie in Ordnung sein.

mhr
quelle