0

我想知道与在构造函数中相比,在构造之后设置对象的属性是否有优势。

我正在使用具有创建成本高昂的属性的对象,因此在我看来,我应该在创建对象后设置属性。但是,在使用对象时,我不得不质疑属性是否已设置,而我更愿意假设它已设置。

特别适用于我的问题:假设我们有一个带有好友列表属性(用户数组)的用户对象。如果必须设置friendslist 属性,那么每个“朋友”用户都必须使用自己的friendslist 进行初始化。这会永远持续下去吗?但是,似乎好友列表适合作为用户的属性 - 那么我们是否将好友列表与用户分开或稍后选择性地设置好友列表?

希望对此事有任何见解,谢谢。

4

2 回答 2

0

理想情况下,对象不应具有无效状态,因此将对象直接构建到配置状态应该是可取的。

但是,您将遇到您使用的语言的细节。例如,在 C++ 中,有两种力量会推动你反对这一点:

  • 构造函数异常的问题。函数尝试块有帮助,但它们往往是深奥的,许多开发人员并不了解它们。
  • 许多复杂的类签名构造函数的扩散,使得很难评估哪个是正确的。

其他语言可以做一些掩盖问题的语法糖。例如。C# 具有对象初始化器构造new A() {foo="x", bar="y";},这使得很难(并非不可能!)使用处于中间、未初始化状态的对象。

于 2013-10-28T14:17:11.153 回答
0

我一般选择在构造函数中初始化对象的所有属性。这是我的推理:

您不能在伪代码中意外设置对象的某些属性,而现在又设置另一个属性:

obj = new Obj(prop_a, prop_b, prop_c) // Error if not all three properties are set
method_requiring_all_three_values_are_initialized(obj)

对比

obj = new Obj() //No error, becuase constructor doesn't take the arguments
obj.set_prop_a(val);
obj.set_prop_b(val_2);

method_requiring_all_three_values_are_initialized(obj) // Runtime error

此外,如果对象是不可变的(在构造它之后您不能修改它),您的代码将更容易维护,因为您不必总是担心对象的状态。请参阅可变对象与不可变对象

但是,如果在分析您的代码并且对象属性的早期初始化成为一个明显的瓶颈之后,您可以重构您的代码以稍后将其初始化为优化,我相信您已经听说过 Donald Knuth 的名言:

“我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源”

对于您的具体问题,我会将朋友列表与用户分开,因为它会使用户对象更容易推理(您不必担心它设置为什么状态,或者如果属性定义明确,您只需知道一个用户是用户...)你可以有一个单一的数据结构和函数,它接受一个用户对象并返回其对应的好友列表。

于 2013-10-28T14:17:43.463 回答