【发布时间】:2017-06-17 10:48:56
【问题描述】:
我喜欢使用 enum 类来尽可能避免硬编码值,但对于字符串来说它有点复杂。我想分享一个我觉得有点笨重的设计,我希望能有一些关于如何简化它的想法。
class StringDefinition
{
private:
StringDefinition(const std::string &def);
public:
bool operator==(const StringDefinition&rhs) const;
public:
static const StringDefinition StringDefinitionOne;
static const StringDefinition StringDefinitionTwo;
static const StringDefinition StringDefinitionThree;
public:
std::string ToString() const;
private:
string stringDef;
};
StringDefinition::StringDefinition(const std::string &stringDef)
{
this->stringDef = stringDef;
}
const StringDefinition StringDefinition::StringDefinitionOne("One");
etc...
欢迎所有想法和cmets。
编辑:我没有使用字符串文字,因为它不会强制开发人员使用定义列表中的值。即使您希望他们使用您的字符串文字,他们仍然可以对字符串进行硬编码。如果我在做一些疯狂的事情,我会喜欢一些建设性的批评,而不是仅仅投反对票。
【问题讨论】:
-
这带来了什么只是一个命名的全局字符串文字?
-
我不想只用 const 字符串创建一个对象,因为类型是字符串。任何人仍然可以对字符串进行硬编码。假设我创建了一个方法并且我想要传入一个 StringDefinition,我可以这样做。如果我使用字符串文字,有人可以传递硬编码字符串
-
一个
std::tuple<const std::string, const std::string, ...>可能吗? -
@Pitfall 有什么办法可以阻止某人创建自己的 StringDefinition 并将其传入?
-
使用枚举来强制执行值。来自外部世界(例如文件或数据库)的输入字符串应转换为/从枚举。