单用值是内联函数,函数级常量变量还是类级静态常量变量?

时间:2014-11-19 20:06:48

标签: c++ oop c++11 const

我有一个函数可以根据参数执行一些字符串比较。被比较的字符串不会在别处使用。我的直觉是在函数的开头将所有字符串声明为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; }  
    ...
}

也可能有其他选择。现在,对可读性的看法不同,所以虽然这些很重要,但对此却无法得到明确的答案。所以,当我问,"哪个更受欢迎?"我询问哪个表现最好,复杂度最低。

5 个答案:

答案 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变量

  •   

正如我之前所说;

我更喜欢单次使用值尽可能接近第一次使用。 因此不在类级常量中(既不是静态的也不是其他的)

我通常更喜欢他们自己的行,所以这可能意味着不是内联的,而不是匿名的。我想这与你的代码中没有魔术数字的想法有关。" (即使这不是一个数字。)