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 つは、どのアプローチを使用する場合でも、クラスへのusing参照を追加する必要があるということです。System.Data現時点では、この依存関係をMyObjectクラスに直接追加することをためらっています。

これらのアプローチのいずれかに長所または短所を提供したり、拡張性とテスト容易性をより有効にする代替手段を提供したりできる人はいますか?

4

2 に答える 2

6

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

私の意見では、すべてのプロジェクトで特定の機能が必要な場合に、フレームワーク (通常は文字列または IEnumerable クラス) から機能を拡張するのにより関連性があるため、拡張メソッドも使用しません。

したがって、2 番目のソリューションは、オブジェクト定義をビルド ロジックから分離できるため、興味深いものです。ただし、これを適用するオブジェクトの数を考慮することもできます。それらの数が多いと、維持するのが面倒になる可能性があります。

于 2013-04-24T16:41:51.443 に答える
2

コンストラクタを使用できます

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"]);
    }
}

Idtype の場合Guid、デフォルトのコンストラクターが存在する可能性があります。

MyObject myObject = new MyObject(data) 

より読みやすく見えます

MyObject myObject = MyObject.Build(data)

拡張メソッドはオブジェクトの動作に関連するのに対し、オブジェクトの作成は状態に関連するが動作には関連しないため、拡張メソッドは適合しないと思います。

于 2013-04-25T12:47:12.633 に答える