Что делать, чтобы не дать Богу возразить?
Я знаю, что это плохое программирование и архитектура, когда у вас есть объект класса, который должен использоваться только в одном месте. Но меня также предупреждали о создании мощного объекта, который может сделать слишком много. Так как мне это сломать? Вот пример того, что я имею в виду - пожалуйста, не воспринимайте эти вещи буквально, поскольку это только пример.
В любом случае, у меня есть объект, с которым я работаю, довольно сложный. В этом объекте хранится много информации, и он может выполнять много манипуляций с данными. Итак, давайте назовем этот объект Землей.
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 будет агрегатом - корневым объектом, который управляет своими собственными внутренними объектами. За пределами агрегатной границы все взаимодействие происходит через корневой агрегатный объект.
Рефакторинг вашего класса и разделить его на несколько небольших классов, каждый из которых несет одну ответственность. Неважно, что каждый из них будет использоваться только один раз - код все равно будет лучше, проще для понимания и гораздо более тестируемым.