2011-10-09 119 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'和其他类导入该命名空间。 –