4

我正在研究别人的代码库,有几行是这样的:

if (self.aBooleanProperty) {
    self.aBooleanProperty = YES;
    // Do some stuff
}

检查后将其设置为正确有什么意义吗?YES我在这里缺少什么吗?

4

4 回答 4

7
if (self.aBooleanProperty) {
    self.aBooleanProperty = YES;
    // Do some stuff
}

在正确编写的代码中,您不会遗漏任何内容,并且该 setter 行将可计费的代码行增加了 1 个,并且没有操作。

但是,有两个原因可能会出于误导的原因而这样做。

正如@HotLicks 所说,可能需要触发设置器的副作用。但是它们应该在设置时触发,除非开发人员有错误的想法,即直接在任何地方设置 ivar,然后使用上述方法将设置成本合并到一个位置。但这将是一件非常脆弱和愚蠢的事情。

另一个原因是,传统上,Objective-C 的 BOOL 是一种美化的char. 只是它没有那么荣耀。因此,将 BOOL 与YES比较实际上是危险的,因为YES它具有显式值。

BOOL mmmmmK = 2;  // this is valid

if (mmmmmK == YES) { /* this won't execute */ } 

有点像在攀爬悬崖时,有东西开始下落,你不会大喊“瓶子”、“鞋子”、“卵石”或“假肢”,但你总是大喊ROCK

所以,也许开发人员正在考虑用明确的“是”来规范化肯定。同样,非常值得怀疑,即使是这样,也应该引起人们对代码库其余部分质量的怀疑。

哎哟。

于 2013-05-06T14:20:36.603 回答
2

如果没有更多代码,这很难说。我想每个人都会同意代码似乎是错误的,但是,我们看到的是一个 obj-c 属性 - 以前的程序员可以做一些“聪明”的事情,例如当你调用它时,getter 可能会aBooleanProperty设置自己NO.

在修改代码之前,请检查 getter。这让我想起了schrödinbug

于 2013-05-06T11:22:28.817 回答
1

我认为这个人写错了 YES,而不是应该写 NO,因为它在检查条件时已经是 YES。否则,那条线没有任何意义。

于 2013-05-06T11:06:08.250 回答
0

如果

 self.aBooleanProperty = YES;

包含在大括号中,不需要它,如果它是

 self.aBooleanProperty = NO;

包含在内,那么它是合乎逻辑的

于 2013-05-06T12:07:36.263 回答