您是否会将变量名称大写,以帮助自己理解数据的含义?
或者您不会这样做,因为这违反了惯例并使事情更加混乱?
更大的问题是: 即使情境不符合惯例,但很接近以至于可能帮助您个人理解事物,您是否仍要遵循惯例?
如果这样做有利于你(和其他人)在半年后理解你的代码,那就去做。如果没有好处,那就不需要做。其实很简单。
个人认为应该将它大写。在Java中,常量总是由于其面向对象的特性在运行时分配的约定。我会更加放心,因为如果我意外地给它赋值了,下次我浏览那一块代码的时候肯定会注意到。
我会给它命名为一个变量,我喜欢保持我的命名非常一致。 正如罗布已经建议的那样,readonly怎么样(至少在C#中可用)。 或者一个没有setter的属性。
把它封装起来。
#include <iostream>
class ParamFoo
{
public:
static void initializeAtStartup(double x);
static double getFoo();
private:
static double foo_;
};
double ParamFoo::foo_;
void ParamFoo::initializeAtStartup(double x)
{
foo_ = x;
}
double ParamFoo::getFoo()
{
return foo_;
}
int main(void)
{
ParamFoo::initializeAtStartup(0.4);
std::cout << ParamFoo::getFoo() << std::endl;
}
boolean
变量,以便在多次调用 initializeAtStartup
时抛出异常。我的直觉是,你在运行时设置的东西,然后永远不会改变,只有在业务规则不变的情况下才是常量。此外,你应该使用mutators/accessors,因为使用全大写字母几乎不能保证“constness”。
public class BadClass
{
public static final double PI = 3.1;
// PI is very constant. Not according to the business roles modeled by my
// application, but by nature. I don't have a problem making this publicly
// accessible--except that [Math] already does, with much better precision)
public static /*final*/ int FOO = null;
// FOO is constant only by convention. I cannot even enforce its "constness".
// Making it public means that my enemies (overtime, for example) can change
// the value (late night programming), without telling me.
}
相反地,
public class BetterClass
{
public static final double PI = 3.1;
private /*final*/ Integer foo = null;
public int getFoo() {
return this.foo.intValue();
}
public void setFoo(int value) {
// The business rules say that foo can be set only once.
// If the business rules change, we can remove this condition
// without breaking old code.
if ( null == this.foo ) {
this.foo = value;
} else {
throw new IllegalStateException("Foo can be set only once.");
}
}
}
如果您始终使用mutator来设置值,即使在[BetterClass]内部,您也知道foo的“constness”不会被违反。当然,如果有人要直接设置foo的值(我需要在晚上2点之前停止工作!),仍然没有保证。但是,这样的事情应该在代码审查中指出。
因此,我的建议是将foo视为普通成员变量--不需要为几乎是const的东西制定特殊的命名约定。
但是,即使对于私有变量,也要使用mutators/accessors。这些通常非常快速,并且您可以在其中强制执行业务规则。这应该是您的惯例。
(如果您正在编写嵌入式医疗设备的代码,请假装您从未看到过此帖子)。
可以将其标记为只读吗?那么惯例就不那么重要了。
就我个人而言,我的惯例是在#define
和枚举类型中使用全大写字母。对于const
变量,我要么不使用特定的约定,要么使用前缀为“k
”的名称(表示“konstant”,而不是已经过度使用的“c”用于诸如“count”或“char”之类的东西)。
我发现我喜欢“k
”约定,并可能更频繁地使用它,甚至可能将其用于枚举类型,将大声的全大写标识符保留给可怕的预处理器宏。
实际上,处理伪常量的更好方法是封装它。在Java中,您可以将其声明为私有成员并提供getter和setter。 setter应该做一些事情,以防止伪常量在第一次设置后被更改。任何体面的Java JIT编译器都会内联简单的getter,因此这不应影响运行时性能。