【问题标题】:What to do to prevent God Object?怎么做才能防止God Object?
【发布时间】:2011-07-13 18:08:51
【问题描述】:

我知道当你有一个只在一个地方使用的类对象时,这是糟糕的编程和架构。但我也被警告过要创建一个功能强大且可以做太多事情的对象。那么我该如何分解呢?这是我的意思的一个例子 - 请不要把这些东西从字面上看,因为这只是一个例子。

无论如何,我正在处理一个相当复杂的对象。很多信息都存储在这个对象中,它可以对数据执行很多操作。所以,我们称这个物体为地球。

Public Class Planet
Private _population As UInteger = 0
Public ReadOnly Property Population() As UInteger
    Get
        Return _population
    End Get
End Property

Public Overridable Sub CreatePerson(Optional ByVal numberOfPeople As Integer = 1)
    _population += numberOfPeople
End Sub
End Class

到目前为止已经足够简单了。但我可以继续处理对象可能执行的许多事情。因此,为了避免事情变得过于复杂,我通过创建另外两个对象来分解白天和晚上发生的“活动”:白天和夜晚(这两个没有显示)。所以现在我有一个更新的 Planet 类。

Public Class Planet

Private _population As UInteger = 0

Private _day As New Day
Private _night As New Night

Public ReadOnly Property Day() As Day
    Get
        Return _day
    End Get
End Property

Public ReadOnly Property Night() As Night
    Get
        Return _night
    End Get
End Property

Public ReadOnly Property Population() As UInteger
    Get
        Return _population
    End Get
End Property

Public Overridable Sub CreatePerson(Optional ByVal numberOfPeople As Integer = 1)
    _population += numberOfPeople
End Sub

End Class

现在,这两个类 - Day 和 Night - 永远不会在 Planet 类之外使用。这是为这个“父”类Planet组织我的方法和属性的好方法吗?我还能如何整齐地组织类似的东西?

我读过关于重构的文章,但我认为这对我的情况没有帮助。我喜欢我可以像这样调用 Planet 对象的想法:Earth.Night.BlowUpMoon

【问题讨论】:

  • 我认为这是一个实际的术语,表示一个类变得太强大或知道如何做太多事情。

标签: vb.net oop god-object


【解决方案1】:

从可发现性的角度考虑。如果其他人要使用您的对象,他们会知道他们必须去一天中的特定时间炸毁月球,这与BirthdayCard.September25th.Send() 相同吗?任何“其他人”我也包括你在 6 个月内。您是为了组织而组织,还是以一种有意义的方式将相似的方法和属性放在一起?

【讨论】:

  • 我肯定会以一种有意义的方式添加方法和属性,但我想确保这是一个好的设计。我觉得我错过了一些东西,因为我曾经被告知不要创建一个对象,如果它只用于一个地方。我开始认为这没有意义,但我也看到使用对象进行组织可能是糟糕的设计技术。
  • 在 .Net 中,一切都是对象,因此您始终创建一次性对象。但我认为你的意思是一堂课,对吧?下载 Reflector 并检查 .Net 框架本身,您会在父类中看到大量私有类,这些私有类仅用于存储相关属性。 System.Uri 有 2 个类、1 个结构和 6 个类私有的枚举。使用上面的示例,我个人认为Night 对象不会能够BlowUpMoon(),我只是看不到这种关系。
【解决方案2】:

虽然您的示例是人为设计的,但这种情况在领域驱动设计中很常见。您的 Planet 类将是一个 aggregate - 一个管理其自己的内部实体的根对象。在聚合边界之外,所有交互都是通过根聚合对象进行的。

【讨论】:

    【解决方案3】:

    重构您的类并将其拆分为几个较小的类,每个类都有一个single responsibility。它们中的每一个都只使用一次并不重要 - 代码仍然会更好,更容易理解,并且更易于测试。

    【讨论】:

      猜你喜欢
      • 2016-05-01
      • 1970-01-01
      • 2015-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多