是嵌套构造函数(或工厂方法)好,还是应该每个都做初始工作

(从设计POV)到嵌套构造函数调用重载的New或Factory样式方法是一个好主意吗? 这主要是针对简单的构造函数,其中每个重载都建立在前一个重载上。

MyClass( arg1 ) { 
    _arg1 = arg1; 
    _otherField = true; 
    _color="Blue" 
}
MyClass( arg1, arg2) : this(arg1) { 
    _arg2 = arg2  
}
MyClass( arg1, arg2, arg3) : this(arg1, ar2) { 
    _arg3 = arg3; 
}

或者使用工厂方法:

static NewInstance(arg1 ) { 
   _arg1 = arg1;       
}
static NewInstance(arg1, arg2) {
   f = NewInstance(arg1);
   f._arg2 = arg2;
}
//... and so on

双方都可以看到一些缺点

  • 嵌套隐藏构造函数正在做什么
  • 不是嵌套重复所有的功能
  • 所以,这样做是一个好主意,还是它让我觉得我只是没有看到问题。 出于某种原因,我感到不安,主要是因为它分开了初始化的责任。

    编辑: @Jon Skeet :我现在看到为什么这么困扰我。 我正在倒退! 我写了所有的东西,甚至没有注意到,它只是闻起来。 大多数其他案例(我写的)按照您的建议进行,但这当然不是我这样做的唯一一个。 我注意到,我做得很恰当的那些更复杂的,但我看起来很简单的那些似乎马虎。 我喜欢微编辑。 我也喜欢首字母缩写!


    我认为将构造函数链接在一起是合理的,但我以另一种方式进行 - 具有较少参数的版本使用更多参数调用版本。 这样一来,它就清楚发生了什么事情,所有真正的“逻辑”(超出默认值)都集中在一个地方。 例如:

    public Foo(int x, int y)
    {
        this.x = x;
        this.y = y;
        precomputedValue = x * y;
    }
    
    private static int DefaultY
    {
        get { return DateTime.Now.Minute; }
    }
    
    public Foo(int x) : this(x, DefaultY)
    {
    }
    
    public Foo() : this(1, DefaultY)
    {
    }
    

    请注意,如果您有很多构造函数重载,您可能希望转而使用静态工厂方法 - 这通常会使代码更清晰,并允许多个方法采用相同的一组参数,例如

    public static XmlDocument FromText(string xml)
    
    public static XmlDocument FromFile(string filename)
    

    2016编辑 :还在时间之前,C#正在从根本上削减或取消对C#7的记录支持和默认构造器支持,最终可能是C#8。

    2015编辑 :我遥遥领先于时间。 C#6和C#7正在消除构造函数的需要。

    如果您使用.Net 3.5开发,我建议不要使用构造函数。 我留下的唯一例外是,如果您使用注入构造函数进行依赖注入。 使用.Net 3.5,他们创建了允许您执行的对象初始化程序

    var myclass = New MyClass { arg1 = "lala", arg2 ="foo" }
    

    这将使用为arg1和arg2指定的值赋予类,同时将arg3保留为

    default(typeof(arg3)).
    
    链接地址: http://www.djcxy.com/p/18005.html

    上一篇: Is nesting constructors (or factory methods) good, or should each do all init work

    下一篇: How to print all key and values from HashMap in Android?