2013-05-06 41 views
4

我通過別人的代碼庫工作,有幾行是這樣的:檢查後設置一個布爾右它

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

任何點檢查後立即將其設置爲YES?有什麼我在這裏失蹤?

+0

如果self.aBooleanProperty爲yes,那麼它會進入循環。 – Balu 2013-05-06 11:05:45

+4

你不會錯過任何東西..你提到的人錯過了很多 – Krishnabhadra 2013-05-06 11:06:10

+5

當處理一個布爾變量時,上述模式沒有意義 - 浪費了運動。使用Objective-C屬性**有一點小小的可能性,因爲setter有一些所需的副作用。但最有可能的是,這種模式只是對代碼進行反覆編輯的結果 - 當你改變它的時候,你可以很容易地得到這樣的奇怪的東西,然後再改變它。 – 2013-05-06 11:09:00

回答

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

在正確編寫的代碼中,你不會錯過任何東西,並且setter行增加了可計費的lin代碼由一個沒有操作的代碼組成。

但是,有兩個原因可能是因爲錯誤的原因。

正如@HotLicks說,有可能副作用,二傳手是可能需要被觸發。但是他們應該已經觸發了集合,除非開發人員誤導了將伊娃直接設置到任何地方,然後使用上述方法將設置成本合併到一個地點。但那是一件非常脆弱和愚蠢的事情。

另一個原因是因爲傳統上Objective-C的BOOL是一個光榮的char。只有它沒有如此榮耀。因此,將BOOL與YES進行比較實際上很危險,因爲YES具有明確的值。

BOOL mmmmmK = 2; // this is valid 

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

有點像爬坡時懸崖和東西開始下降,你不喊「瓶」,「鞋」,「石子」,或「假肢」,但你總是嚷嚷ROCK

因此,也許開發人員正在考慮用肯定的YES來規範化肯定。再一次,相當令人懷疑,即便如此,它也應該引起對代碼庫其餘部分質量的懷疑。

Ouch。

+0

這就是我最初的想法,檢查是將它設置爲「YES」或「NO」以外的設置。但是看看其餘的代碼,會有很多浪費(爲所有四種狀態設置'UIButton'標題,重複代碼)。所以也許這只是爲了誇大代碼。 – 2013-05-06 15:42:21

+3

檢查原始合同;如果它是通過代碼行收費的,那麼您的答案是。 ;) – bbum 2013-05-06 15:52:34

1

我認爲這個人誤寫了YES,而是應該寫入NO,因爲它在檢查條件時已經是YES。否則,有任何一點指向該行。

+0

我不認爲他們的意思是「不」。當一切完成時,他們在代碼的中心點設置「否」。 – 2013-05-06 11:35:48

2

這是很難說,沒有更多的代碼。我認爲每個人都會同意代碼看起來是錯誤的,但是,我們所看到的是一個obj-c屬性 - 之前的程序員可以做一些「聰明」的事情,例如當您調用它時,aBooleanProperty的獲取方可能會將其自身設置爲NO

在修改代碼之前,請檢查getter。這讓我想起schrödinbug

+0

這個屬性的代碼中沒有getter,它是完全合成的。 – 2013-05-06 11:37:27

+0

+1。 – viral 2013-05-08 07:28:45

0

如果

self.aBooleanProperty = YES; 

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

self.aBooleanProperty = NO; 

被包括在內,那麼這是合乎邏輯