【问题标题】:Constructors or Static Methods for Loading and Saving Objects?用于加载和保存对象的构造函数或静态方法?
【发布时间】:2009-01-22 11:35:12
【问题描述】:

我正在尝试决定是使用静态方法加载/保存对象更好,还是使用构造函数/实例方法更好。

所以,比如说对象Project,实例版本是

public Project(path) { // Load project here }
public void Save(path) { // Save project here }

静态版本是

public static Project Load(path) { // Load project and return result }
public static void Save(path, proj) { // Save project }

那么,你更喜欢哪一个?

【问题讨论】:

    标签: c# .net design-patterns architecture


    【解决方案1】:

    两者都不是。倾向于从您的域模型中提取持久性逻辑并放入单独的类层中。

    (来自 ChrisW 回答中留下的评论)关于域对象泄漏到另一个类的详细信息:如果您的语言允许,您可以通过使用包隐私/内部访问来限制这些详细信息的可见性。或者,您可以使用 DTO 方法。

    【讨论】:

      【解决方案2】:

      如果没有要维护的状态,只有行为,则使用静态方法。但是,如果 Project 对象需要有状态,则应该使用构造函数/实例方法。

      【讨论】:

        【解决方案3】:

        为了节省,我认为将 Save 设为静态方法没有任何好处。

        对于加载,如果Project是一个抽象基类,定义一个静态的Load方法更好;但除此之外,定义和调用构造函数更为惯用。

        另外,我同意 moffdub 的回答,如果且仅当功能足够大以使持久性逻辑值得拆分/分离到其他类时。但是,如果您这样做,则 Project 中包含的数据的详细信息将不再是私有的(相反,这些详细信息必须与加载和保存 Project 实例的类共享)。

        【讨论】:

        • 静态保存的唯一真正好处是它可以移动到另一个类。我只是为了完整性才真正包含它。但我同意,如果在对象上定义了保存,则可能值得使用实例版本。
        • 关于域对象泄漏的细节:如果您的语言允许,您可以通过使用包隐私/内部访问来限制这些细节的可见性。或者,您可以使用 DTO 方法。
        猜你喜欢
        • 2011-06-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多