我有一个函数可以根据参数执行一些字符串比较。被比较的字符串不会在别处使用。我的直觉是在函数的开头将所有字符串声明为consts。但是,它们可以只是内联,或在类级别声明。什么是首选?
以下是该功能的要点:
void MyType::parse(const wstring& input)
{
if (input == value1) { do1; }
else if (input == value2) { do2; }
}
值的可能选项:
一个。内联值:
if (input == L"foo") { do1; }
B中。功能级值:
void MyType::parse(const wstring& input)
{
const wstring foo = L"foo";
if (input == foo) { do1; }
...
}
℃。类级静态常量:
·H
class MyType
{
private:
static const std::wstring kFoo;
}
的.cpp
const wstring MyType::kFoo(L"foo");
...
void MyType::parse(const wstring& input)
{
if (input == kFoo) { do1; }
...
}
也可能有其他选择。现在,对可读性的看法不同,所以虽然这些很重要,但对此却无法得到明确的答案。所以,当我问,"哪个更受欢迎?"我询问哪个表现最好,复杂度最低。
答案 0 :(得分:2)
我个人的偏好:
保持文字尽可能接近使用点 - 所以选项A或B,但不是C.
要在A和B之间做出选择,请问自己"文字本身是否对阅读此代码的其他人有意义?"。如果是,请转到A,代码仍然是自我记录的。如果它没有,则选项B使您有机会为文字提供有意义的名称。
示例:
// option A
void MyType::parse(const wstring& input)
{
if (input == L"QUIT") { quit(); }
else if (input == L"CONTINUE") { read_next(); }
}
// option B
void MyType::parse(const wstring& input)
{
static const wstring quit_command = L"*34!";
static const wstring continue_command = L"*17!";
if (input == quit_command) { quit(); }
else if (input == continue_command) { read_next(); }
}
答案 1 :(得分:1)
你更喜欢什么?
当然,它们并不完全相同。
如果给它们(命名)命名空间或全局范围,它们可以获得外部可见性,这意味着您可以在单独的TU中定义它们,甚至可以更改它们的定义而无需重新编译(只是链接)。如果该TU位于动态库中,则链接可能在运行时。
此外,函数本地人通常不会单独记录。但是,如果这些值具有重要意义,您可能希望记录它们。如果您不希望暗示外部链接,请将它们设置为文件静态,例如:
namespace /*local to TU*/ {
/** @brief the file pattern is used when ...
*/
constexpr char const* file_pattern = "......";
}
这样,您的类声明不会泄漏实现细节,如果这些细节发生变化则无需更改。
所以,这取决于你。但请考虑您对测试,可维护性和文档的需求。
答案 2 :(得分:0)
您需要问的问题是:您是否认为将来会更改/修改此字符串?如果是这样,内联将无法正常工作。如果你知道这个字符串永远不会改变,通过get()函数接收或修改,那么我会说内联是最好的,因为你不必在内存中声明空间来保存变量(并保存一行代码) 。
答案 3 :(得分:0)
我个人会选择最后一个版本。如果您需要修改" Magic String" ,那么您只需一个改变点,这总是一个好主意。即使你只使用一次字符串,我也会建议你在某个地方仍然有一个常量,否则你会在这种情况下以一种方式进行,但在另一种方式中这样做是不一致的。
只是我的2克拉。
答案 4 :(得分:0)
通常,您应该参考您雇主的编码标准。
如果这不能解释使用哪个,请询问您的团队负责人。
如果他/她不在乎,你的直觉就可以了。
我的经验多种多样......我更喜欢在第一次使用时定义的const std :: string。
编辑:(一些现在缺少的评论显然认为上述内容不完整)
单用价值是否
内联函数级const变量,
类级静态const变量
正如我之前所说;
我更喜欢单次使用值尽可能接近第一次使用。 因此不在类级常量中(既不是静态的也不是其他的)
我通常更喜欢他们自己的行,所以这可能意味着不是内联的,而不是匿名的。我想这与你的代码中没有魔术数字的想法有关。" (即使这不是一个数字。)