Підкресліть заперечення


13

Я просто писав заяву if із досить довгими іменами властивостей і стикався з цією проблемою.

Скажімо, у нас є твердження if, як це:

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

Друга властивість булевого типу, і не має сенсу мати схожість

if(boleanValue == true)

Чи є кращий спосіб підкреслити заперечення, потім поставити !попереду. Мені здається, що це можна легко контролювати під час читання коду, і це може спричинити проблеми з налагодженням


7
Витягніть умову в метод зі змістовною назвою.
Йоахім Зауер

2
... або призначити заперечне значення змінній зі значущим іменем та використовувати її в умові if.
scrwtp

+1, що сказав @JoachimSauer, якщо можливо, покладіть цей метод на об'єкт, на який запитуєте .. У цьому випадку вся умова може бути інкапсульована методом_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

@pdr Можливо, вам слід створити властивість для цієї моделі перегляду з тим самим булевим і повторно використовувати цей прапор в інших місцях. Я впевнений, що вам це стане в нагоді.
radu florescu

5

Поставте його у свій, якщо блок перед оцінкою менш важливих умов. Не тільки було б легше читати без захаращення інших умов, але це також перша умова, яку прочитає програміст. Поєднайте це з ідеєю, яку вже згадував @scrwtp, щоб призначити змінну зі значущим іменем, і ви отримаєте:

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

Якщо ви програмуєте на мові компілятора, то в більшості випадків вони вкладені, якщо блоки все-таки поєднуються, доки ви не вставите код між зовнішнім, якщо і внутрішнім, якщо це не повинно впливати на продуктивність справ.


2

Якщо ви використовуєте C / C ++, тоді препроцесор може забезпечити читабельність.

#define NOT !

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

а може ... функція не (x) {return! x; } // javascript
Alex

2
Оператори в C і C ++ Вже є стандартні синоніми для різних операторів.
Джоел

0

Я просто видобуду

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

У методі, який повертає це. Якщо ви називаєте цей метод NotThisIsABooleanPropertyThatIsIm важливо, вам слід добре.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.