-1

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

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

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

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

4

3 回答 3

3

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

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

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

于 2013-08-04T01:14:09.353 回答
1

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

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

    /* ... */
}

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

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

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

于 2013-08-04T01:14:24.850 回答
1

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

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

于 2013-08-04T01:16:28.687 回答