2011-10-09 127 views
2

人力定義了許多公共靜態常量:使用聲明公共靜態常量類成員

class Human 
{ 
public: 

static const int NUM_FINGERS = 10; 
static const int NUM_TOES = 10; 
static const int NUM_HANDS = 2; 
static const int NUM_FEET = 2; 

//The rest of the human class here 
}; 

一個不相關的類讓他們頻繁的使用,並與類名來限定它們:

class Unrelated 
{ 
public: 
int SomeFunction() 
{ 
//Many uses of Human's public static constants 
return Human::NUM_FINGERS + Human::NUM_TOES + Human::NUM_HANDS + Human::NUM_FEET; 
} 
}; 

在命名空間的情況下,您可以:

using namespace blah; 

是否有與這樣的itaution?

using namespace Human; //wrong 

int Unrelated::SomeFunction() 
{ 
return NUM_FINGERS + NUM_TOES + NUM_HANDS + NUM_FEET; 
} 

它被認爲是不好的編程來定義一堆常量的方式嗎?

+3

並非所有的人類都有10個手指,10個腳趾,2個手和2個腳。 –

回答

0

不,它被認爲是不好的編程扁平化的命名空間,使用using namespace即,特別是在全球範圍內。如果這是X課程中的常量,請編寫X::constant,否則只會妨礙可讀性(以及風險命名衝突)。

0

是它認爲不好的編程來定義一堆常量的方式?

確實如此,你的第二個不相關的類使用了另一個類的常量。這是一個緊耦合的依賴關係。如果第一個類因爲某些原因而被修改以移除/重構常量,那麼第二個類也會受到影響。避免這種依賴。

2

一個不相關的類經常使用它們,並且必須用類名限定它們。

這有什麼錯呢?想想這樣:什麼是更好的變量名稱,ntnum_toes?如果您將類更改爲命名空間,則可以使用類Human(或命名空間Human)進一步限定名稱是件好事,而不是壞事。它有助於編譯器,它可以幫助你作爲一個編碼人員意外地碰撞其他的名字,並幫助另一個試圖理解你的代碼的人。

有關地名NUM_FINGERS等:我建議不要使用ALL_CAPS。有一天,有人會寫一個NUM_FINGERS宏,這會把你的代碼變成亂碼。爲宏保留ALL_CAPS名稱,然後嘗試避免使用宏。

+3

誰是downvoter的隨機驅動器?僅對宏和宏使用ALL_CAPS的建議不僅僅是我的。你會發現許多編碼標準。 –

1

這一定程度上取決於形勢。

的常量涉及到人的類,所以它非常有意義,他們被它「擁有」,並使用命名空間的名稱(人力:: NUM_ARMS),使它們的使用明確的。 (想象一下,如果你引入了新的類,比如Octopus,會發生什麼,你會使用Octopus :: NUM_ARMS,這將會是8而不是2.感謝對本地化類/名稱空間名稱的善意!)

當然,在您可能需要重新考慮使用常量的Human/Octopus情況,而是使用Animal類/接口和每個都可以覆蓋的虛擬GetNumArms()方法。這樣可以讓你的客戶端代碼只與人和八達通鬆散耦合,並且適用於這兩種類型的動物。這將允許基礎常量對這些類中的每一個都是私有的。

或者,如果您正在另一個方向編寫代碼,請考慮外部類正在計算什麼。這個計算是誰的責任?也許你應該計算添加到人類(如Human::GetNumLimbs()Human::GetNumBodyParts()

最後,我們都從1970年的感動,所以我建議你使用常量更可讀的風格(如Human::cNumFeet導致少得多眼滲血不止Human::NUM_FEET,並不會很容易誤認爲任何宏你已經躺在附近)

2

假設Unrelated真的Unrelated_but_about_Humans,你可以簡單地說「我有相同的常量Human」:

class Unrelated 
{ 
private: 
    static const int NUM_FINGERS = Human::NUM_FINGERS; 
    static const int NUM_TOES = Human::NUM_TOES; 
    static const int NUM_HANDS = Human::NUM_HANDS; 
    static const int NUM_FEET = Human::_NUM_FEET; 
} 

(其他回覆關於脆弱等問題的言論依然存在。)

+0

我沒有想到這一點。我猜這本身並不是無關的。它是相關的,但它需要在它自己的類中,它不能是一個子類,因爲主類是應用程序對象。總共會有3個這樣的類,所以我將不得不重新定義這三個常量。也許不值得。 – user974967

+0

您可以創建一個名爲HumanConstants的名稱空間並將常量放在那裏。然後讓'Human'和其他類導入該命名空間。 –