我应该更喜欢const函数吗

Should I prefer a const function?

本文关键字:函数 const 更喜欢 我应该      更新时间:2023-10-16

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

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

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

我应该更喜欢这两种实现中的任何一种吗?为什么?

如果用户想要获取文件信息时,您更喜欢第二个版本,那么他们会将所有算法都建立在地图上。如果你做第二个版本,这意味着实现可能是一个映射,,但不必是,他们可以将代码建立在API的基础上,即使内部实现这样做,也不必更改。

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

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

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

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

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

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

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

假设其他类稍后使用该配置,我更喜欢选项1和一个额外的GetConfigurationParameter公共常量方法,该方法可以获取特定键的配置值。这让我可以创建其他类,这些类只需按名称请求一些参数,而不必关心它是作为映射实现的。

我喜欢选项1的另一个原因是加载配置和返回配置应该不同。如果我看到像LoadConfiguration这样的名称,我认为它从某个地方加载配置并设置类中的参数。我不认为它会返回一些配置描述,相反,我希望从GetConfiguration这样的方法中得到这些描述,但当然,不同的人对此的看法会有所不同。