是否应在构造函数中填充对象属性

时间:2009-01-22 21:04:40

标签: design-patterns architecture

我正在设计一个新的应用程序,如果我应该在构造函数上填充我的对象属性,我还没决定

Public Sub New(UserId as integer)
    ' get database values
    dr = DataReader
    Me.FirstName = dr.fields(0)
    Me.LastName = dr.fields(1)
End Sub

或者为每个对象类型创建一个带有方法的工厂?

Public Function getUser(UserId as integer) as User
    Dim myUser as new User
    ' get database values
    dr = DataReader
    myUser.FirstName = dr.fields(0)
    myUser.LastName = dr.fields(1)
    return myUser
End Function

我意识到代码很粗糙,但我希望它足以让我的观点得到解决。我看到两者都已实施,并且不确定长期的利弊是什么。

具体来说,我正在使用VB.NET,如果重要的话。

6 个答案:

答案 0 :(得分:3)

我的意见:

构造函数创建对象。 User类的构造函数应创建新用户。

静态成员函数,例如getUser 检索已存在的对象。

我会使用后一种形式。

答案 1 :(得分:1)

我认为类型是不可变的,不会产生其他问题。对于“人”类型,它可能不合适,但值得考虑。您还应该尝试构造对象,以便在调用构造函数之后,对象处于有效状态。

另一方面,你应该尽量避免在构造函数本身做太多的工作 - 这是静态工厂方法往往很好的地方,因为他们可以做很多工作来获取构造对象所需的所有数据,然后将其传递给一个简单的构造函数,以创建一个完整,有效且可能不可变的对象。

答案 2 :(得分:1)

这实际上取决于语言,因为在构造函数和所有基础构造函数完成执行之前,某些语言无法保证对象的状态。

我发现最好填充你需要的任何成员,然后调用方法来完成剩下的工作。这往往会使代码更具可读性,因为构造函数中没有大量代码。

答案 3 :(得分:1)

我会使用Factory-Pattern并使构造函数为private / protected,并创建一个静态NewObject()方法。然后,NewObject方法可以调用适当的构造函数。 专家就是如果你需要在运行时更改Object的行为,你可以插入(覆盖)NewObject方法并让你自己的NewObject方法“混入”。 这样做的缺点是它可以非常快速地变得非常复杂 - 特别是如果你正在调试它。

答案 4 :(得分:0)

  1. 您正在实例化userhandler-object并使用它来获取不同的用户,并让您与所有用户一起工作。 在构造函数中没有GetUser函数。

  2. 您正在实例化userobject并仅与该用户一起工作, 让构造者handeling巫婆用户使用。

  3. 我5美分。

答案 5 :(得分:0)

对象在构造时应该100%准备好使用。默认构造函数应该具有适用于所有引用的合理的非null默认值。

如果您发现构造函数的代码“太多”,或许是时候考虑重构该对象了。