2

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

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

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.

4

3 回答 3

2

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

于 2011-07-13T18:20:49.960 回答
2

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

于 2011-07-13T18:43:45.910 回答
1

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

于 2011-07-13T18:16:44.843 回答