2012-04-09 12 views
1

他の方法で使用されていても公開されていないような、滑らかさの属性を持つPotatoクラス(およびインスタンス)があるとします。この属性は、インスタンスの作成時に設定され、インスタンスの内部でのみ使用されます。デザインパターン:プライベートメンバーを保存

また、私のシステムはいくつかのデータベースドライバをサポートする必要があります。したがって、私は現時点で使用したいドライバを使用するクラスでインスタンス化される "databse adapter"というインタフェースを持っています。

今問題が発生します。オブジェクト(ポテト)を永続化してデータベースに保存する必要があるため、データベースアダプタクラスを使用してジャガイモの滑らかさを保存する必要がありますが、プライベートです! ジャガイモの滑らかさを他の目的のために利用できないようにするには、どうすればいいですか?事前

+2

smoothness属性はどのようにして決定されますか?それが他のプロパティから派生している場合、それを格納する必要はありません。そうでない場合、それはどこから来るのですか? – mellamokb

+2

アクセサを実装 – zerkms

+0

プライベートセッターの使用について考えましたか?このようにして、インスタンスの外側の誰かによって滑らかさを設定することはできませんが、取り出すことができます。データベースアダプタを含むどのクラスも、この値を読み取ってデータベースに書き込む必要があります。 –

答えて

2

オブジェクトを保存して、何らかの種類のライターをパラメータとして使用できるメソッドを記述します。これはデータベースなので、Saveメソッドだけでなく、InsertメソッドとUpdateメソッドの両方が必要な場合があります。これらをインターフェイスに配置することもできます。あなたは、その実装の詳細(この場合は、そのプライベートメンバーとデータ型へのアクセスを与えることなくPotatoの「状態」を外部化の輸入/輸出インターフェイスペアを作成することができます

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, ...); 
    } 
} 
1

おかげでこれはinternalとしてマークされた平滑性を有するのバリエーションです。ポテトを使用するには、ジャガイモにsmoothnessが設定されている必要があると仮定すると、内部コンストラクタが優れている可能性があります。私は、平滑さを隠す正当な理由があるという信念を受け入れるつもりです。おそらくジャガイモの部分で謙虚さ?同じアセンブリで

public class Potato 
{ 
    internal int Smoothness { get; set; } 

    internal Potato(int smoothness) 
    { 
     this.Smoothness = smoothness; 
    } 
    private Potato() { } 
} 

のみクラスが内部コンストラクタを使用して、Potatoをインスタンス化することができるであろう。また、同じアセンブリ内のクラスだけが平滑度にアクセスできるため、ジャガイモを節約することができます。

2

ラフ例)。彼らはビルダーのタイプです。

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を見てください。

関連する問題