构造函数变量应该直接传递给私有字段或者属性吗?

时间:2020-03-06 14:42:15  来源:igfitidea点击:

现在是.NET,但我确信主体应适用于所有OOP语言,为简化起见,我以.NET为例:

通常,创建器构造函数会将传入的变量传递给私有字段,对我而言,我倾向于将其传递给Property。

是否有什么不同的意见?最佳做法是什么?

解决方案

通过属性设置器传递参数使我们可以将任何验证代码仅保留在一个位置。

我建议将其发送到Property,而不是直接发送到private字段,尽管实际实现将规定确切的条件。例如,有时在使用Property时会触发一些事件,而我们又不想在构造函数中触发这些事件。或者,我们可能出于其他一些原因而想规避属性逻辑。

只要属性不是虚拟的/覆盖的,就可以使用属性。属性本质上是方法,我们不应从构造函数中调用虚拟方法,因为可能尚未构造适当的类型。 Microsoft已经列出了自己的准则集,只需向下滚动至底部即可看到说明问题的相关准则和代码片段(他们使用方法进行了说明,但是正如我所提到的,.NET属性本质上是特殊方法)。

使用属性设置器时要小心。设置器中可能包含代码,这可能会导致意外的副作用。

我操纵构造函数中的字段。字段实际上代表了对象的固有状态,构造函数的工作是初始化此内部状态。属性仅是出于封装目的,并且是对象状态的公共接口的一部分。

在设置对象的内部状态之前,应用于构造函数参数或者属性输入值的转换逻辑可能会大不相同。无论如何,如果是这种情况,我曾经使用从属性设置器和构造函数调用的显式转换方法,而不是在属性设置器上直接链接构造函数。

如果根本没有逻辑,我看不到我们为什么要在构造函数中使用属性设置器。