Что делать, чтобы не дать Богу возразить?

Я знаю, что это плохое программирование и архитектура, когда у вас есть объект класса, который должен использоваться только в одном месте. Но меня также предупреждали о создании мощного объекта, который может сделать слишком много. Так как мне это сломать? Вот пример того, что я имею в виду - пожалуйста, не воспринимайте эти вещи буквально, поскольку это только пример.

В любом случае, у меня есть объект, с которым я работаю, довольно сложный. В этом объекте хранится много информации, и он может выполнять много манипуляций с данными. Итак, давайте назовем этот объект Землей.

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

Пока все достаточно просто. Но я мог бы продолжать и продолжать многое из того, что мог бы выполнить объект. Таким образом, чтобы не усложнять ситуацию, я разбил "активизации", которые могут происходить днем ​​и ночью, создав два других объекта: день и ночь (эти два не показаны). Так что теперь у меня есть обновленный класс Планеты.

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

Теперь эти два класса - День и Ночь - никогда не будут использоваться вне класса Планеты. Это хороший способ организовать мои методы и атрибуты для этого "родительского" класса Planet? Как еще я бы аккуратно организовал подобное?

Я читал о рефакторинге, но я не думаю, что это помогает моему делу. Мне нравится идея, что я могу вызвать объект Planet следующим образом: Earth.Night.BlowUpMoon,

3 ответа

Решение

Думайте с точки зрения открываемости. Если бы кто-то еще использовал ваш объект, он знал бы, что ему нужно отправиться в определенное время дня, чтобы взорвать Луну, что совпадает с BirthdayCard.September25th.Send()? Любой "кем-то еще", я также включаю вас через 6 месяцев. Вы организуетесь ради организации или объединяете сходные методы и свойства таким образом, чтобы это имело смысл?

Несмотря на то, что ваш пример надуманный, такая ситуация часто встречается в доменно-управляемом дизайне. Ваш класс Planet будет агрегатом - корневым объектом, который управляет своими собственными внутренними объектами. За пределами агрегатной границы все взаимодействие происходит через корневой агрегатный объект.

Рефакторинг вашего класса и разделить его на несколько небольших классов, каждый из которых несет одну ответственность. Неважно, что каждый из них будет использоваться только один раз - код все равно будет лучше, проще для понимания и гораздо более тестируемым.

Другие вопросы по тегам