2013-04-24 10 views
7

他のオブジェクトからのデータでカスタムオブジェクトを構築するための提案や代替パターンがある人はいらっしゃいますか。オブジェクト - 静的ビルダーメソッドとビルダークラスと拡張メソッドのビルド

現在、3つのアプローチを検討しています。

1)静的ビルド方法

public class MyObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public static MyObject Build(DataRow data) 
    { 
     MyObject newObject = new MyObject(); 
     newObject.Id = Convert.ToInt32(data["ID"]); 
     newObject.Name = Convert.ToString(data["NAME"]); 
     return newOjbect; 
    } 
} 

2)ビルダークラス

public class MyObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public class MyObjectBuilder 
{ 
    public static MyObject Build(DataRow data) 
    { 
     MyObject newObject = new MyObject(); 
     newObject.Id = Convert.ToInt32(data["ID"]); 
     newObject.Name = Convert.ToString(data["NAME"]); 
     return newOjbect; 
    } 
} 

3)拡張メソッド

public class MyObject 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

public static class MyObjectExtensions 
{ 
    public static void Build(this MyObject obj, DataRow data) 
    { 
     obj.Id = Convert.ToInt32(data["ID"]); 
     obj.Name = Convert.ToString(data["NAME"]); 
    } 
} 

主な考慮事項の1つは、今まで接近してきたことですが、System.Datausingという参照をクラスに追加する必要があることです。この時点で、この依存関係を直接MyObjectクラスに追加することを躊躇しています。

これらのアプローチのいずれにもメリットとデメリットがありますか、あるいは拡張性とテスト容易性を向上させる代替手段を提供する人はいますか?

答えて

6

第1のアプローチの欠点は、オブジェクト定義をビルダーロジックと混在させることです。選択した全体的なアーキテクチャを考慮すると、モデルオブジェクトをPOCOとして保持し、その中に定義されたコピーロジックを持たないことをお勧めします。

あなたのプロジェクト全体を通して特定の機能が必要な場合は、私の意見では、フレームワーク(通常は文字列またはIEnumerableクラス)から機能を拡張する方が適切です。

したがって、第2の解決策は、オブジェクト定義をビルディングロジックから分離できるので興味深いです。ただし、これを適用するオブジェクトの数を考慮する必要があります。あなたはそれらの多くを持っている場合、それは維持するために混乱になる可能性があります。

2

IdタイプはデフォルトコンストラクタがあることができGuidた場合は、コンストラクタ

public class MyObject 
{ 
    public int Id { get; private set; } 
    public string Name { get; private set; } 

    public MyObject(int Id,string Name) 
    { 
     this.Id = Id; 
     this.Name = Name; 
    } 

    public MyObject(DataRow data) 
    { 
     Id = Convert.ToInt32(data["ID"]); 
     Name = Convert.ToString(data["NAME"]); 
    } 
} 

を使用することができます。

MyObject myObject = new MyObject(data) 

は、より読みやすくなります、その後

MyObject myObject = MyObject.Build(data) 

私は、拡張メソッドは、オブジェクトの振る舞いに関連する一方、拡張メソッドは、状態に関連するオブジェクトの作成理由ではなく、行動には合わないと思います。

関連する問題