考虑到最佳实践,将可选参数添加到构造函数签名的可取方法是什么?您是否应该只列出核心参数并依赖于非可选属性的初始化程序?在我看来,这是最明智的做法!
4 回答
特别是能够使用对象初始化器分配属性值,构造函数的多个重载远不如以前有用。在过去,它们主要用于为代码紧凑性设置可变属性。
现在可以写了
MyClass my = new MyClass() { PropA = 1, PropB = 2 };
几乎一样紧凑
MyClass my = new MyClass(1, 2);
同时更具表现力。
但是,有时对象的性质决定了重载将为对象使用者提供有意义的契约。例如,为接受长度和宽度的Rectangle类提供重载并非不合理(我不会在代码审查中使用它)。就我个人而言,我仍然不会提供重载,因为对象初始化器语法更具表现力,避免了诸如“是 Rectangle(int length, int width) 还是 Rectangle(int width, int length)?”之类的问题。在阅读代码时(我知道,智能感知在编写代码时会有所帮助)。
我相信这是一个很好的方法。通常人们将属性用于可选参数;但这使对象可变。使用可选的构造函数参数/ctor 重载是保持对象不可变的好方法。
根据经验,我只向构造函数添加创建有效工作对象所需的参数。随着对象初始化器语法的出现,客户端可以更容易地配置他想要的任何其他参数。
但是,我认为这条规则应该有很多例外:很多时候,您可能希望提供一个重载,使开发人员更容易和更清楚地了解他期望能够对对象进行哪些更改。
考虑子类化而不是多个构造函数。
原因:通常两个不同的构造函数表示需要两种不同的行为。不同的nehaviors应该由不同的类来实现。
然后,子类将具有一个名称,表明它是基类的专用版本,以及一个确保只能在有效状态下创建此类对象的构造函数。