【问题标题】:Should I prefer a const function?我应该更喜欢 const 函数吗?
【发布时间】:2013-08-04 01:07:19
【问题描述】:

假设我想实现类A,它必须从文件中加载它的“配置”。让我们假设“配置”是一个简单的map<string, string>

我可以通过两种不同的方式实现A::LoadConfiguration

  1. void A::LoadConfiguration(string filename)
  2. map<string, string> A::LoadConfiguration(string filename) const

我应该更喜欢这两种实现中的哪一种,为什么?

【问题讨论】:

  • 你不想返回地图,如果它是类的成员
  • 显然,我假设地图是课程的一部分。这就是为什么第二个实现是const 函数的原因。我见过更喜欢第二种实现方式的开发人员,但从未得到具体原因。
  • 如果LoadConfiguration 不修改A 的成员,则改为const,否则不要。

标签: c++ class function coding-style


【解决方案1】:

如果您更喜欢第二个版本,当用户想要获取文件信息时,他们会将所有算法都基于地图。如果您使用第二个版本,这意味着实现可能是一个地图,但不一定是,他们可以将他们的代码基于一个 API,即使内部实现确实如此,也不必更改.

考虑一下后来您意识到使用 std 数组效率更高的情况,无论出于何种原因,现在使用此代码的每个程序都必须更改许多算法。使用第一个版本,可以在内部处理对数组的更改,并且不会在外部反映任何更改。

现在,如果您打算创建该类的多个实例,您肯定希望将其设为静态方法,因为您不希望每次调用构造函数时都加载文件(尤其是在文件不会更改的情况下) .

【讨论】:

    【解决方案2】:

    完全无视你的建议,但这可能是我会做的(不知道你的所有限制,所以如果不合适,请忽略我):

    class A
    {
    public:
        static A fromConfiguration( string fileName );
    
        /* ... */
    }
    

    在大多数情况下,类的“配置”应该在对象创建时设置,因此强制用户在构造时提供它是一件好事(而不是必须记住稍后进行加载)。

    namespace NeatStuff
    {
        map<string,string> loadSimpleConfiguration( string fileName );
    }
    

    如果配置文件格式非常简单(并且不是特定于您的类),您可以将实际加载移出类。

    【讨论】:

    • 谢谢。有什么理由选择 static 函数而不是简单的构造函数?
    • 你可以把它想象成构造函数的名字。还可以想象,构造函数可能有多种原因只采用一个字符串(例如,要从中初始化的名称或文件)
    【解决方案3】:

    假设其他类稍后使用该配置,我更喜欢选项 1,以及一个额外的 GetConfigurationParameter public const 方法,用于获取特定键的配置值。这让我可以创建其他类,这些类可以只通过名称请求一些参数,而无需关心它是作为地图实现的。

    我更喜欢选项 1 的另一个原因是加载配置应该不同于返回配置。如果我看到像LoadConfiguration 这样的名称,我假设它从某处加载配置并在类中设置参数。我不认为它会返回一些配置描述,而是我希望从GetConfiguration 之类的方法中获得这些描述 - 但对此的看法当然会因人而异。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-21
      • 2020-07-19
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2016-05-20
      相关资源
      最近更新 更多