我有一个类定义数据库的历史提取:
class ExtractionConfiguration
{
string ExtractionName;
time ExtractionStartTime;
time ExtractionEndTime;
// Should these functions be static/non-static?
// The load/save path is a function of ExtractionName
void SaveConfigruation();
void LoadConfiguration();
}
Run Code Online (Sandbox Code Playgroud)
这些ExtractionConfiguration需要保存到磁盘/从磁盘加载.在静态/非静态方面组织保存/加载功能的最佳方法是什么?对我来说,很明显SaveConfiguration()应该是一个成员函数.但是使用LoadConfiguration(),调用更有意义
ExtractionConfiguration newExtraction;
newExtraction.LoadConfiguration();
Run Code Online (Sandbox Code Playgroud)
并有一个临时的空实例或使加载功能静态
static ExtractionConfiguration LoadConfiguration(string filename);
Run Code Online (Sandbox Code Playgroud)
然后打电话
ExtractionConfiguration newExtraction = ExtractionConfiguration::LoadConfiguration(filename);
Run Code Online (Sandbox Code Playgroud)
对我来说感觉更整洁,但打破了加载/保存机制的"对称性"(这是否是一个有意义/值得考虑的问题?).
我想要求'最好'的答案有点天真.我真的想要更好地理解这里涉及的问题.
PS这是我关于SO的第一个问题,所以如果我没有正确提出,请告诉我,我会尽力让问题更清晰.
您应该考虑使用Boost.Serialization 风格的序列化函数,以避免使用单独的函数来保存和加载(即使您不使用库本身)。
在这种方法中,您可以向函数传递具有运算符&的任何类型的对象,以对所有成员变量执行操作。其中一个这样的对象可能会将数据保存到文件中,另一个可能会从文件中加载,第三个可能会在控制台上打印数据(用于调试等)。
如果您希望保留单独的函数,将它们作为非静态成员可能是更好的选择。对于保存功能来说这是显而易见的,但加载则是另一回事,因为您需要构造对象。然而,我猜,出于对称原因,通常加载是通过默认构造然后调用加载非静态成员函数来完成的。
将加载作为返回新对象的函数在某些方面似乎更好,但您需要决定它如何返回对象。是通过new分配的,还是简单的通过值返回?按值返回要求对象可复制,并且返回指针要求资源管理方案(不能仅将对象存储在堆栈上)。