2010-02-23 62 views
5

方面组织加载/保存功能的方式,我有一个类定义了数据库的历史提取:最好的静态/非静态

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(); 
} 

这些ExtractionConfigurations需要保存/从磁盘加载。根据静态/非静态组织保存/加载函数的最佳方式是什么?对我来说,很明显SaveConfiguration()应该是一个成员函数。然而,随着LoadConfiguration(),它更有意义调用

ExtractionConfiguration newExtraction; 
newExtraction.LoadConfiguration(); 

,并有一个临时的空实例或使负载功能静电

static ExtractionConfiguration LoadConfiguration(string filename); 

并调用

ExtractionConfiguration newExtraction = ExtractionConfiguration::LoadConfiguration(filename); 

这对我来说感觉更加整洁,但打破了加载/保存机制的“对称性”(这甚至是一个有意义/值得考虑的问题?)。

我想询问“最佳”答案有些天真。我真的想要更好地理解这里涉及的问题。

P.S.这是我的第一个问题,所以如果我没有正确表达,请让我知道,我会尽量让问题更清楚。

+0

欢迎。要将代码格式化,可以通过4个空格或1个选项卡缩进代码部分。请参阅http://stackoverflow.com/editing-help。 – kennytm 2010-02-23 11:26:41

+0

谢谢Kenny,我很确定*我错过了格式化技巧! – 2010-02-23 11:30:51

+3

您应该使用较短的名称。例如。只需保存并加载,因为他们已经在课堂上了。不是每个人都使用Intellisense :) – Tronic 2010-02-23 11:34:24

回答

1

您应该考虑使用避免了用于保存和加载(即使你不使用库本身)独立的功能Boost.Serialization style序列化功能。

在这种方法中可以传递函数的任何类型的对象,其具有操作者&,在所有成员变量的操作。一个这样的对象可能会将数据保存到文件中,另一个可能会从文件中加载,第三种可能会在控制台上打印数据(用于调试等)。

如果你想保持独立的功能,让他们作为非静态成员可能是一个更好的选择。对于保存功能这是显而易见的,但加载是一个不同的问题,因为你需要构造对象。然而,相当普遍的加载是通过默认 - 构造,然后调用加载非静态成员函数,出于对称原因,我猜。

具有负载为返回一个新的对象,似乎在某些方面更好的功能,但你需要决定如何返回对象。它是由新的分配还是仅由价值返回?按值返回需要该对象是可复制的,并返回一个指针来强制资源管理方案(不能将对象存储在堆栈中)。

+0

好的序列化调用。如果出于某种原因不喜欢boost,那么推出自己的序列化函数并不难。 @Rodion,如果你想避免额外的副本,考虑做一个构造函数或初始化函数,将文件名作为参数。你可以保留你的负载或反序列化函数作为帮手。 – thebretness 2010-02-23 12:09:36

+0

我会看看序列化库,它听起来很有用。不幸的是,我的老板对OOP有一种“不相信炒作”的态度,事实上几乎所有你没有亲自编码的东西,这就是为什么我使用基本的加载/保存结构。 你在加载/保存上的观点非常符合我的感受。我打算进行非静态加载/保存。至于在使用静态负载时要返回什么,我认为按值返回是最好的。正如你所说,通过指针决定了你的资源管理方法,它会把你的设计拴在一些相当小的东西上。 – 2010-02-24 10:37:59