Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Set a BOOL right after checking it

Tags:

objective-c

I'm working through someone else's codebase and there are several lines like this:

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

Is there any point to setting it to YES right after checking it? Is there something I'm missing here?

like image 702
nevan king Avatar asked Dec 26 '22 04:12

nevan king


2 Answers

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

In properly written code, you aren't missing anything and that setter line increases the billable lines of code by one with a no-op.

There are two reasons, though, that this could be done for misguided reasons.

As @HotLicks said, there may be side effects to the setter that might need to be triggered. But they should have been triggered on set unless the developer had the misguided notion of setting the ivar directly everywhere and then using the above to coalesce the cost of setting to one spot. But that'd be a remarkably fragile and silly thing to do.

The other reason is because, traditionally, Objective-C's BOOL is a glorified char. Only it isn't so glorified. Thus, comparing a BOOL to YES is actually dangerous because YES has an explicit value.

BOOL mmmmmK = 2;  // this is valid

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

Sort of like when climbing a cliff and something starts falling, you don't yell "bottle", "shoe", "pebble", or "prosthetic limb", but you always yell ROCK.

So, maybe the developer was thinking of normalizing the affirmative with an explicit YES. Again, quite doubtful and, even if that is the case, then it should raise suspicion about the quality of the rest of the codebase.

Ouch.

like image 197
bbum Avatar answered Jan 15 '23 11:01

bbum


This is difficult to tell without having more code. I think everybody will agree the code appears to be wrong, however, what we are seeing is an obj-c property - the previous programmer could do some "clever" thing, e.g. it's possible that the getter of aBooleanProperty sets itself to NO when you call it.

Before modifying the code, check the getters. This reminds me of schrödinbug

like image 22
Sulthan Avatar answered Jan 15 '23 10:01

Sulthan