Существует ли эвристика для определения того, принадлежит ли метод или поле в классе? - PullRequest
5 голосов
/ 25 февраля 2009

Есть ли хорошее практическое правило или тест, который я могу выполнить, чтобы определить, принадлежит ли метод или поле классу? Как определить, когда член не принадлежит?

Я обнаружил, что мой самый большой камень преткновения в объектно-ориентированном дизайне пытается выяснить, что и куда идет. Кажется, что есть слишком много случаев, когда ответ таков: «он может пойти сюда или туда».

Вот краткий пример того, с чем я борюсь:

Public Class ITDepartment

    Private _sysadmins As List(Of Employee)
    Private _developers As List(Of Employee)

    // properties, public stuff...

    Private Sub AddSkillToGroup(ByVal emps As List(Of Employee), ByVal skill As Skill)
        For Each e As Employee In emps
            e.AddSkill(skill)
        Next
    End Sub

End Class

Объект ITDepartment управляет двумя группами Employees ... но должен ли он знать, что у Employees есть навыки? Нужно ли перемещать такой метод, как AddSkillToGroup?

EDIT:

Похоже, что до сих пор все согласны с тем, что ИТ-отдел не должен знать о навыках сотрудников. Я немного сыграю адвоката Дьявола, чтобы проиллюстрировать, где мое замешательство вступает в игру.

ИТ-отдел состоит из двух коллекций сотрудников. Разве он не должен быть в состоянии делегировать эти предметы коллекции? Метод AddSkill по-прежнему принадлежит классу Employee. ITDepartment просто инструктирует свою группу сотрудников, чтобы добавить навык для каждого из своих членов.

Ответы [ 2 ]

4 голосов
/ 25 февраля 2009

Я был бы склонен превратить List(Of Employee) в свой собственный класс на этом этапе, чтобы он мог иметь свой собственный метод AddSkill ().

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

Ищите методы или наборы методов и членов, которые образуют согласованную подгруппу в классе - они готовы для перемещения в свой собственный класс.

3 голосов
/ 25 февраля 2009

Посмотрите на принципы SOLID . Они подскажут вам, где находится метод.


Редактировать

«Разве [ITDepartment] не может быть в состоянии делегировать эти предметы коллекции?»

"нормально ли, чтобы класс ITDepartment" добрался до "и делегировал классу Employee список List (Of Employee), из которого он состоит (как это происходит при вызове e.AddSkill выше)."

Да.

Делегирование - это то, как работает ОО-программирование. Вы делегируете детали Единому Ответственному Классу. Вы делегируете реализацию, чтобы вы могли зависеть от абстракций, а не от реализаций.

Кстати, AddSkillToGroup является приватным, что сбивает с толку. Он не скрывает детали реализации, которые могут измениться. Там нет причин для этого быть частным. [частный часто используется слишком часто и используется не по назначению. Очень, очень мало должно быть приватным; и он должен быть объявлен закрытым только когда это абсолютно необходимо.]

Поскольку реализация была делегирована Employee, AddSkillToGroup не является деталью реализации этого класса.

...