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

10

我很想知道是否有人对从另一个对象中获取数据构建自定义对象有任何建议或替代模式。

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

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) Builder Class

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) Extension Method

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

一个主要的考虑因素是,无论我们选择哪种方法,我们都需要向类添加System.Datausing引用。此时,我们不愿直接向MyObject类添加这个依赖项。

有人可以提供任何一种方法的优缺点,或者提供更好地支持可扩展性和可测试性的替代方案吗?


在您的情况下,您声明了“public static class MyObjectExtensions”,但是在Java中不存在顶级静态类。 - Talavera316
2个回答

8
第一种方法的缺点是将对象定义与生成器逻辑混杂在一起。根据你选择的整体架构,你可能更喜欢将模型对象保持为POCOs,因此不会在其中定义副本逻辑。
我也不会使用扩展方法,因为在我看来,它们更适合扩展框架功能(通常是字符串或IEnumerable类),当你需要在项目中通过一个特定功能时使用。
因此,第二个解决方案很有趣,因为它允许你将对象定义与生成逻辑分离。但是,你可能要考虑你想要应用此方法的对象数量。如果你有很多这样的对象,维护它们可能会变得混乱。

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)

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接