假设我想实现必须从文件加载其“配置”的类A
。我们假设“配置”是一个简单的map<string, string>
。
我可以通过两种不同的方式实现A::LoadConfiguration
:
void A::LoadConfiguration(string filename)
map<string, string> A::LoadConfiguration(string filename) const
我应该更喜欢这两种实现中的任何一种,为什么?
答案 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
这样的方法 - 但是对于不同的人来说,对此的看法会有所不同。