2012-07-09 76 views
0

我們有幾個類,其中對成員函數的調用可能會改變狀態,有時不會依賴於具有默認值的布爾值。改進代碼可讀性而不會導致性能損失

A a; 
a.set("foobar"); 
assert(a.changed() == true); 

A a; 
a.set("foobar", false); 
assert(a.changed() == false); 

請注意,這些成員函數都是虛擬的。我贊成使用別名,以更好地讀取代碼,使私有成員函數仍然允許舊的方法,並只給出包裝公衆:

a.silentlySet("foobar") { 
    a.set("foobar", false); 
} 

我想這將內聯無論如何,然後。我知道我可以寫枚舉和常量,這也會提高可讀性:a.set("foobar", SILENTLY);但我不覺得它好,因爲問題是布爾性質(是否)。另一方面。不過,我想聽聽你如何處理這種情況。 (我假設我會得到一個「取決於」的答案,因爲我肯定錯過了一些關鍵細節)與之共存?

那些成員函數並不是經常被調用和使用,但也不是很少。我擔心的是,有時候你可能會誤解一個布爾值爲silent/not_silent-flag,但這有另一個含義。

一個例子,這也可能會產生誤導:

if(b->getData(false) && something_other) 

這可能是夾雜了b->getData() == false

+1

枚舉比布爾值更好。如果你*表示*默默地,*說*「默默地」,不要說「錯誤」。它只需要幾個'foo(true,false,true,true)'調用和接下來的錯誤來真正感謝兩值枚舉。 – molbdnilo 2012-07-09 11:27:56

+1

和枚舉聲明新類型。使用類型系統是有利的。 – 2012-07-09 14:36:43

回答

3

,但我不覺得很好用[使用枚舉這裏],作爲問題是布爾性質(是否)

不,枚舉是完美的,使用它。 FWIW,CodeReview上有another discussion about this case

也就是說,包裝函數很可能會被內聯。 C++完全是提供沒有運行時成本的抽象。內聯函數調用是這方面的一個基本工具,所以編譯器在適用的地方使用它。

+0

我剛加入Code Review(不知道是否有這樣的SE網站),所以任何擁有適當權利的人都可以隨意將它移動到CR,因爲我認爲它更適合我。 – math 2012-07-09 09:52:59

相關問題