我应该更喜欢const函数吗?

时间:2013-08-04 01:07:20

标签: c++ class function coding-style

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

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

  1. void A::LoadConfiguration(string filename)
  2. map<string, string> A::LoadConfiguration(string filename) const
  3. 我应该更喜欢这两种实现中的任何一种,为什么?

3 个答案:

答案 0 :(得分:3)

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

考虑下面你意识到使用std数组更有效率的情况,无论出于何种原因,现在使用这个代码的每个程序都必须改变它的许多算法。使用第一个版本,可以在内部处理对阵列的更改,并且不会在外部进行任何更改。

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

答案 1 :(得分:1)

完全忽略了你的建议,但这可能是我会这样做的(不知道你所有的约束,所以如果它不合适就忽略我):

class A
{
public:
    static A fromConfiguration( string fileName );

    /* ... */
}

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

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

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

答案 2 :(得分:1)

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

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

相关问题