Что делать, чтобы не дать Богу возразить? - PullRequest
2 голосов
/ 13 июля 2011

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

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

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? Как еще я бы аккуратно организовал подобное?

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

Ответы [ 3 ]

2 голосов
/ 13 июля 2011

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

2 голосов
/ 13 июля 2011

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

1 голос
/ 13 июля 2011

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

...