构造函数初始化
2006年2月7日
构造函数初始化是一种方法,您可以在对象的创建方法中传入对象所需的所有协作者。它是 Setter 初始化 的替代方法。
因此,要创建一个包含名字、姓氏和收藏酒吧列表的人,我们可能会看到如下代码:
# ruby mf = Person.new('martin', 'fowler', ['Turners Oyster Bar', 'Square and Compass'])
通过这样做,您可以始终确保对象处于合理良好的状态,可以随时使用。这也是一种非常简洁的方法,允许您在一行代码中启动对象。如果您只想对对象执行一项操作,您还可以在该行中为其赋值或调用其上的方法,这意味着您不需要使用变量。
在构造函数中声明所有必要的协作者可以清楚地表明需要哪些协作者,从而更容易了解如何启动类。对于强制协作者的每个有效组合,您都需要一个构造函数方法。提供包含常用可选协作者的构造函数通常也很方便。
这种方法可以很容易地看出不可变属性和可更新属性之间的区别,因为不可变属性没有设置方法,它们只是在构造方法中初始化。
构造函数初始化是我的首选。在某些情况下,很难以这种方式进行设置,我偶尔也会更喜欢 Setter 初始化,但大多数情况下,构造函数初始化是最佳选择。
常见问题
如果新对象有很多不同的合法组合怎么办? 人们经常担心,如果使用这种方法,会有无数个构造函数方法。大多数情况下,这不是问题 - 只有几个。您只需要这里的强制协作者,而且几乎不会有超过几个的组合。
如果在构造函数中要提供很多协作者怎么办? 大量的构造参数,就像任何大型参数列表一样,都是 代码异味。通常,当我看到这些参数时,我发现其中许多参数是 数据块,应该用它们自己的对象替换。话虽如此,构造函数方法的参数比其他方法多并不罕见 - 但它们是发现数据块的好地方。
这与 上下文验证 如何协调? 这里的上下文是对象的基本用法 - 本质上是最低限度的有用状态。这可能不适用于其他各种活动,但它应该足够有效。