构建对象 - 静态构建器方法与构建器类与扩展方法

时间:2013-04-24 15:37:55

标签: oop design-patterns

我很想知道是否有人有任何建议或替代模式来构建包含来自其他对象的数据的自定义对象。

我们目前正在探索三种方法。

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

一个主要的考虑因素是,我们需要向该类添加using System.Data的{​​{1}}引用。在这一点上,我们犹豫是否要将此依赖项直接添加到我们的MyObject类。

任何人都可以为这些方法中的任何一种提供优点或缺点,或者提供可以更好地实现可扩展性和可测试性的替代方案吗?

2 个答案:

答案 0 :(得分:6)

第一种方法的缺点是您将对象定义与构建器逻辑混合在一起。考虑到您选择的整体架构,您可能更愿意将模型对象保留为POCO,因此不会在其中定义复制逻辑。

我不会使用扩展方法,因为在我看来,当您需要通过所有项目的特定功能时,更广泛地扩展框架中的功能(通常是字符串或IEnumerable类)。

所以第二个解决方案很有趣,因为它允许您将对象定义与构建逻辑分开。但是,您可以考虑要应用此对象的对象数。如果你有很多,它可能会变得一团糟。

答案 1 :(得分: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"]);
    }
}

如果Id类型为Guid,则可以使用默认构造函数。

MyObject myObject = new MyObject(data) 

看起来更具可读性

MyObject myObject = MyObject.Build(data)

我认为扩展方法不适合因为创建与状态相关的对象,而不是与行为相关,而扩展方法与对象的行为相关。