强调否定


13

我只是在编写带有相当长的属性名称的if语句,并且遇到了这个问题。

假设我们有一个if语句,如下所示:

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

第二个属性是布尔类型,像

if(boleanValue == true)

有没有更好的方法来强调否定然后放在!前面。在我看来,在阅读代码时可以很容易地对此进行监督,并且可能会导致调试问题


7
将条件提取到具有有意义名称的方法中。
Joachim Sauer

2
...或将取反的值分配给具有有意义名称的变量,然后在if条件中使用它。
scrwtp

+1 @JoachimSauer所说的,如果可能的话,将该方法放在要查询的对象上。在这种情况下,可以用以下方法封装整个条件:_someViewModelNameThatIsLong
MattDavey 2013年

2
我通常要做的一般事情是在否定词的两边各加一个空格,以使其更明显。if( ! something)vsif(!something)
Svish

如果您强调否定,为什么不使用... && model.Prop == false)?我个人很少使用!它,这太容易忽略了。

Answers:


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

然后,在视图模型对象中

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

(假设someValue是一个字符串,并且模型对象不知道)

这不仅强调了!运算符,但通常使其更具可读性。现在,在调用方法中,我可以看到一个条件,应该对它进行适当的命名以在调用对象的上下文中描述该条件。在模型对象中,我可以看到在模型对象的上下文中这意味着什么。


1
+1,这是信息专家原则的良好应用。
MattDavey 2013年

1
值得注意的someValueNeedsMeToDoSomething,根据您的情况,可能需要作为方法的参数。
MattDavey 2013年

@MattDavey:哦,好点。
pdr

@pdr也许您应该使用相同的布尔值为该视图模型创建一个属性,然后在更多位置重用该标志。我相信您会发现它很方便。
radu florescu

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
}

或...函数not(x){return!x; } // JavaScript
Alex

2
C和C ++中的运算符各种运算符已经有标准的同义词。
2013年

0

我只是提取

`!_someViewModelNameThatIsLong.ThisIsABooleanPropertyThatIsImportant`

在返回此方法的方法中。如果将此方法命名为NotThisIsABooleanPropertyThatIsImportant,则应该没问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.