【问题标题】:Should object properties be filled in the constructor对象属性是否应该在构造函数中填写
【发布时间】:2009-01-23 07:47:58
【问题描述】:

我正在设计一个新的应用程序,但我不确定是否应该在构造函数中填充我的对象属性

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。

【问题讨论】:

    标签: design-patterns architecture


    【解决方案1】:

    我的看法:

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

    getUser 这样的静态成员函数检索一个已经存在的对象。

    我会使用后一种形式。

    【讨论】:

    • 我同意。这样也不需要在您的 User 类中引用 DataReader。这样您就可以在其他 secnarios 中使用您的 User 对象,并通过设置它们来简单地填充其值。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      我发现最好填充您需要的任何成员,然后调用方法来完成其余的工作。这往往会使代码更具可读性,因为您的构造函数中不会有很多代码。

      【讨论】:

        【解决方案4】:

        我会使用工厂模式并将构造函数设为私有/受保护并创建静态 NewObject() 方法。然后 NewObject 方法可以调用适当的构造函数。 这方面的优点是,如果您需要在运行时更改对象的行为,您可以插入(覆盖)NewObject 方法并“混合”您自己的 NewObject 方法。 这样做的缺点是它会很快变得非常复杂——尤其是在你调试它的时候。

        【讨论】:

          【解决方案5】:
          1. 您正在实例化 userhandler-object 并使用它来获取不同的用户,并让您与所有用户一起工作。 在构造函数中有一个 GetUser 函数。

          2. 您正在实例化用户对象并仅与该用户一起工作, 让构造函数处理女巫用户。

          我的 5 美分。

          【讨论】:

            【解决方案6】:

            一个对象在构建时应该 100% 准备好使用。默认构造函数应该为所有引用提供合理的、非空的默认值。

            如果你发现你的构造函数有“太多”的代码,也许是时候考虑重构那个对象了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-06-11
              • 2017-12-22
              • 2021-07-16
              • 1970-01-01
              • 1970-01-01
              • 2017-08-24
              • 2013-10-14
              相关资源
              最近更新 更多