Подчеркните отрицание

13

Я просто писал оператор if с довольно длинными именами свойств и столкнулся с этой проблемой.

Допустим, у нас есть выражение if, подобное этому:

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

Второе свойство имеет логический тип, и нет смысла иметь такой тип

if(boleanValue == true)

Есть ли лучший способ подчеркнуть отрицание, чем поставить !перед. Мне кажется, что это легко можно заметить при чтении кода и может вызвать проблемы с отладкой.

Иван Крояч Карачич
источник
7
Извлеките условие в метод со значимым именем.
Иоахим Зауэр
2
... или присвойте отрицательное значение переменной со значимым именем и используйте ее вместо условия if.
scrwtp
+1 то, что сказал @JoachimSauer, если возможно, поместите этот метод на объект, который запрашивается .. В этом случае все условие может быть инкапсулировано с помощью метода on_someViewModelNameThatIsLong
MattDavey
2
Обычно я часто окружаю отрицание пробелом с каждой стороны, чтобы сделать его более заметным. if( ! something)vsif(!something)
Свиш
Если вы подчеркиваете отрицание, почему бы не использовать ... && model.Prop == false)? Лично я очень редко пользуюсь !, это слишком легко не заметить.

Ответы:

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

И тогда в представлении модель объекта

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

(предполагается, что someValue является строкой и не известен объекту модели)

Это не только подчеркивает! оператор, но это делает его более читабельным в целом. Теперь в вызывающем методе я вижу одно условие, которое должно быть хорошо названо, чтобы описать условие в контексте вызывающего объекта. И в объекте модели я вижу, что это означает в контексте объекта модели.

прецизионный самописец
источник
1
+1, это хорошее применение принципа информационного эксперта .
MattDavey
1
Стоит отметить, someValueчто в NeedsMeToDoSomethingзависимости от вашей ситуации может потребоваться указать параметр метода.
MattDavey
@MattDavey: О, хорошая мысль.
фунтовые
@pdr Возможно, вам следует создать свойство для этой модели представления с тем же логическим значением и повторно использовать этот флаг в других местах. Я уверен, что вы найдете это удобно.
Раду Флореску
5

Поместите его в свой блок if перед оценкой менее важных условий. Мало того, что было бы легче читать без беспорядка других условий, но также и первое условие, которое будет читать программист. Объедините это с идеей, уже упомянутой @scrwtp, назначить переменную со значимым именем, и вы получите:

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

Если вы программируете на языке компилятора, в большинстве случаев эти вложенные блоки if объединяются в конце концов, если вы не вставляете код между внешним if и внутренним if, поэтому это не должно влиять на производительность в этих случаев.

Нил
источник
2

Если вы используете C / C ++, то препроцессор может обеспечить читабельность.

#define NOT !

if(_someViewModelNameThatIsLong.AnotherPropertyINeedToCheck == someValue &&
    NOT _someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant)
{
    //Do something
}
CWallach
источник
или, возможно ... функция не (х) {возврат! х; } // javascript
Алекс
2
Операторы в C и C ++ Уже существуют стандартные синонимы для различных операторов.
Джоэл
0

Я бы просто извлечь

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

В методе, который возвращает это. Если вы назовете этот метод NotThisIsABooleanPropertyThatIsImportant, с вами все будет в порядке.

MHR
источник