Podkreśl negację

13

Właśnie pisałem oświadczenie if z dość długimi nazwami nieruchomości i napotkałem ten problem.

Powiedzmy, że mamy takie wyrażenie if:

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

Druga właściwość jest typu boolowskiego i nie ma sensu mieć podobnego do stetement

if(boleanValue == true)

Czy istnieje lepszy sposób na podkreślenie negacji niż postawienie jej !na pierwszym planie . Wydaje mi się, że można to łatwo nadzorować podczas czytania kodu i może potencjalnie powodować problemy z debugowaniem

Ivan Crojach Karačić
źródło
7
Wyodrębnij warunek do metody o znaczącej nazwie.
Joachim Sauer
2
... lub przypisz zanegowaną wartość do zmiennej o znaczącej nazwie i użyj jej w warunku if.
scrwtp
+1 to, co powiedział @JoachimSauer, jeśli to możliwe, umieść tę metodę na obiekcie, do którego jest wysyłane zapytanie. W takim przypadku cały warunek może być enkapsulowany za pomocą metody_someViewModelNameThatIsLong
MattDavey
2
Ogólnie rzeczą, którą często robię, jest otoczenie negacji spacją po każdej stronie, aby była bardziej widoczna. if( ! something)vsif(!something)
Svish
Jeśli podkreślasz negację, dlaczego nie użyć ... && model.Prop == false)? Osobiście bardzo rzadko używam !, zbyt łatwo to przeoczyć.

Odpowiedzi:

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

A następnie w obiekcie modelu widoku

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

(zakładając, że someValue jest łańcuchem i nie jest znany obiektowi modelu)

To nie tylko podkreśla! operatora, ale ogólnie czyni go bardziej czytelnym. Teraz w metodzie wywoływania widzę jeden warunek, który powinien mieć dobrą nazwę, aby opisać warunek w kontekście obiektu wywołującego. A w obiekcie modelowym widzę, co to oznacza w kontekście obiektu modelowego.

pdr
źródło
1
+1, jest to dobre zastosowanie zasady eksperta informacji .
MattDavey,
1
Warto zauważyć, że someValuemoże być konieczny parametr NeedsMeToDoSomethingmetody, w zależności od twojej sytuacji.
MattDavey,
@MattDavey: Oh, dobra uwaga.
pdr
@pdr Może powinieneś zrobić właściwość dla tego modelu widoku z tym samym logicznym i ponownie użyć tej flagi w większej liczbie miejsc. Jestem pewien, że ci się przyda.
radu florescu
5

Włóż go do własnego bloku if przed oceną mniej ważnych warunków. Nie tylko łatwiej byłoby czytać bez bałaganu w innych warunkach, ale jest to również pierwszy warunek, który programista odczyta. Połącz to z pomysłem wspomnianym już przez @scrwtp, aby przypisać do zmiennej o znaczącej nazwie, a otrzymasz:

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

Jeśli programujesz w języku kompilatora, w większości przypadków są one zagnieżdżane, jeśli bloki łączą się na końcu, o ile nie wstawisz kodu między zewnętrznym if i wewnętrznym if, więc nie powinno to wpływać na wydajność w tych skrzynie

Neil
źródło
2

Jeśli używasz C / C ++, preprocesor może zapewnić czytelność.

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}
CWallach
źródło
a może ... funkcja not (x) {return! x; } // javascript
Alex
2
Operatory w C i C ++ Istnieją już standardowe synonimy dla różnych operatorów.
Joel
0

Po prostu wyodrębnię

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

W metodzie, która zwraca to. Jeśli nazwiesz tę metodę NotThisIsABooleanPropertyThatIsImportant, wszystko powinno być w porządku.

mhr
źródło