我应该更喜欢const函数吗
Should I prefer a const function?
假设我想要实现类A
,它必须从文件中加载其"配置"。让我们假设"配置"是一个简单的map<string, string>
。
我可以用两种不同的方式实现A::LoadConfiguration
:
void A::LoadConfiguration(string filename)
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
这样的方法中得到这些描述,但当然,不同的人对此的看法会有所不同。
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 从函数返回const char*数组
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 在 const 函数中通过引用和指针返回之间的区别
- 使用 std::string () const 函数启动线程或未来
- 在运算符重载定义中使用成员函数(const错误)
- 使用共享指针的函数调用,其对象应为 const
- 将函数参数"const char*"转换为"std::string_view"是
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 使用按引用调用时,不能在没有对象的情况下调用成员函数 const
- 在呼叫运算符函数const中调用运算符时错误
- 我需要用c ++ 98重写c ++ 11代码,c ++ 11正在使用lambda函数[&](const Output & o
- 函数 const 本地对象在C++会发生什么
- int const函数(参数)、int函数(const参数)和int函数(parameters)const之间的区别是什
- const_cast为函数const设置规则并破坏规则
- 构造函数"const variables"设置的用于表示C++数组的边界?
- 将char**传递给C++中的函数(const char**)
- 复制构造函数const char*和Shared_ptr
- 使函数"const"的意图是什么
- c++嵌套映射不匹配成员函数const成员