检查后立即设置BOOL

时间:2013-05-06 11:03:37

标签: objective-c

我正在通过别人的代码库工作,有以下几行:

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

是否有任何指向检查后立即将其设置为YES?这里有什么我想念的吗?

4 个答案:

答案 0 :(得分:7)

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

在正确编写的代码中,您没有遗漏任何内容,并且该setter行使用no-op将可计费行代码增加一个。

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

正如@HotLicks所说,可能对设置者产生副作用,可能需要被触发。但是它们应该在set 上被触发,除非开发人员有误导的概念,即直接在任何地方设置ivar,然后使用上面的方法将设置成本合并到一个地点。但那将是一件非常脆弱和愚蠢的事情。

另一个原因是,传统上,Objective-C的BOOL是一个美化的char。只有它没有那么美化。因此,将BOOL与YES进行比较实际上是危险的,因为YES具有明确的值。

BOOL mmmmmK = 2;  // this is valid

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

有点像攀登悬崖,有些事情开始下降,你不要喊“瓶子”,“鞋子”,“鹅卵石”或“假肢”,但你总是喊叫 ROCK

所以,也许开发人员正在考虑用明确的YES来肯定肯定。再次,非常值得怀疑,即使情况确实如此,那么它应该引起对其余代码库质量的怀疑。

哎哟。

答案 1 :(得分:2)

如果没有更多代码,这很难分辨。我想每个人都会同意代码看起来是错的,但是,我们看到的是一个obj-c属性 - 以前的程序员可以做一些“聪明”的事情,例如当您调用它时,aBooleanProperty的吸气剂可能会将自己设置为NO

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

答案 2 :(得分:1)

我认为这个人错误地写了YES,而是应该写了NO,因为它在检查条件时已经是YES。或者对该行有任何意义。

答案 3 :(得分:0)

如果

 self.aBooleanProperty = YES;

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

 self.aBooleanProperty = NO;
包含

,然后它是合乎逻辑的