【问题标题】:Design pattern: Save private members设计模式:保存私有成员
【发布时间】:2012-04-09 21:19:17
【问题描述】:

假设我们有一个 Potato 类(以及因此的实例),它具有用于其他方法但不假装为 public 的属性 smoothness。该属性在创建实例时设置,仅在实例内部使用。

此外,我的系统应该支持多个数据库驱动程序,因此我有一个接口“数据库适配器”,它将使用使用我现在要使用的驱动程序的类进行实例化。

现在问题来了。我需要使对象(马铃薯)持久化并将其保存到数据库中,因此我应该使用数据库适配器类来保存马铃薯的平滑度,但是..它是私有的! 如何发送马铃薯的光滑度而不使其用于其他目的?

提前致谢

【问题讨论】:

  • 平滑度属性是如何确定的?如果它是从其他属性派生的,则无需存储它。如果不是,那它是从哪里来的?
  • 您是否考虑过使用私有设置器?这样,实例之外的任何人都无法设置平滑度,但可以对其进行检索。任何类,包括您的数据库适配器,都需要读取此值才能写入数据库。
  • 平滑度不是派生的,它只是在通过构造函数创建实例时设置的,我希望它对除数据库适配器之外的所有人都是私有的。我知道这很奇怪,我不确定这是否可能。
  • 如果适配器和土豆在同一个组件中,您可以将 Smoothness 属性标记为内部。

标签: c# database design-patterns


【解决方案1】:

编写一个允许对象自我保存的方法,将某种编写器作为参数。由于这是一个数据库,您可能需要同时拥有 Insert 和 Update 方法,而不仅仅是 Save 方法。您也可以将它们放入接口中。

粗略的例子:

public interface IDatabaseSaveable
{
   void InsertToDatabase(Database pDatabase);
   void UpdateDatabase(Database pDatabase);
}

public class Potato : IDatabaseSaveable
{
   private int mID;
   private double mSmoothness;

   public void InsertToDatabase(Database pDatabase)
   {
      pDatabase.InsertToPotatoes(mID, mSmoothness, ...);
   }

   public void UpdateDatabase(Database pDatabase)
   {
      pDatabase.UpdatePotatoes(mID, mSmoothness, ...);
   }
}

【讨论】:

    【解决方案2】:

    您可以创建一个导入器/导出器接口对,将Potato 的“状态”外部化,而无需访问其实现细节(在这种情况下,它的私有成员和数据类型)。他们是建设者的类型。

    public class Potato {
      public interface IExporter {
        void AddSmoothness(string value);
      }
      public interface IImporter {
        string ProvideSmoothness();
      }
    
      public Potato(IImporter importer) {
        this.smoothness = int.Parse(importer.ProvideSmoothness());
      }
    
      public void Export(IExporter exporter) {
        exporter.AddSmoothness(this.smoothness.ToString());
      }
    
      public Potato(int smoothness) {
        this.smoothness = smoothness;
      }
    
      private int smoothness;
    }
    

    然后,您的数据库适配器类将实现相关接口并使用相应的方法。查看 here 的原始想法。

    【讨论】:

      【解决方案3】:

      这是将平滑度属性标记为internal 的变体。假设土豆必须先设置smoothness,然后才能使用它,那么内部构造函数可能会更好。我会相信有一个很好的理由来隐藏平滑度。或许是马铃薯的谦虚?

      public class Potato
      {
          internal int Smoothness { get; set; }
      
          internal Potato(int smoothness)
          {
              this.Smoothness = smoothness;
          }
          private Potato() { }
      }
      

      只有同一程序集中的类才能使用内部构造函数实例化Potato。并且只有同一程序集中的类才能访问 Smoothness(这样他们就可以保存马铃薯了。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-02
        • 1970-01-01
        • 2013-06-01
        • 1970-01-01
        • 2014-04-20
        • 2013-04-14
        相关资源
        最近更新 更多