好吧,我认为这可以归结为好与好之间的区别。
尽管在大多数情况下,可以通过实现其他模式(策略或轻量级)来避免使用常量,但可以说不需要用其他六类来表示一个概念。我认为可以归结为是需要其他常量的可能性。换句话说,需要扩展接口上的常量提供的ENUM。如果可以预见需要扩展它,那么可以使用更正式的模式。如果没有,那么就足够了(足够好了,因此编写和测试的代码更少了)。这是一个足够好和不好使用的示例:
坏:
interface User {
const TYPE_ADMINISTRATOR = 1;
const TYPE_USER = 2;
const TYPE_GUEST = 3;
}
够好了:
interface HTTPRequest_1_1 {
const TYPE_CONNECT = 'connect';
const TYPE_DELETE = 'delete';
const TYPE_GET = 'get';
const TYPE_HEAD = 'head';
const TYPE_OPTIONS = 'options';
const TYPE_POST = 'post';
const TYPE_PUT = 'put';
public function getType();
}
现在,我选择这些示例的原因很简单。该User
接口正在定义用户类型的枚举。随着时间的流逝,这很可能会扩展,并且更适合其他模式。但这HTTPRequest_1_1
是一个不错的用例,因为枚举是由RFC2616定义的,并且在类的生存期内不会更改。
总的来说,我不认为常量和类常量的问题是一个全局问题。我将其视为依赖性问题。这是一个狭窄的区别,但却是一个明确的区别。我将全局问题视为未强制执行的全局变量,因此会产生软的全局依赖关系。但是硬编码的类会创建强制的依赖关系,因此会创建硬的全局依赖关系。因此,两者都是依赖关系。但是我认为全局会更糟糕,因为它没有被强制执行。这就是为什么我不喜欢将类依赖与全局依赖放在一起。
如果您编写了代码MyClass::FOO
,则会将其硬编码为的实现细节MyClass
。这会产生硬耦合,从而使代码的灵活性降低,因此应避免使用。但是,存在接口以完全允许这种类型的耦合。因此MyInterface::FOO
不引入任何具体的耦合。话虽如此,我不会仅仅为了向接口添加常量而引入接口。
因此,如果您正在使用接口,并且非常确定自己(或其他任何人)不需要其他值,那么我就不会真正看到接口常数有什么大问题了……最好设计将不包含任何常量或条件,幻数,幻弦或硬编码的任何内容。但是,这会增加开发时间,因为您必须考虑其用途。我的观点是,大多数时候绝对值得花额外的时间来构建出色的实体设计。但是有时候确实足够好是可以接受的(需要有经验的开发人员来了解差异),在那种情况下就可以了。
再次,那只是我的看法...