2013-02-14 3 views
18

Кто-нибудь знает, как лучше всего реорганизовать объект God?Как вы реорганизуете класс Бога?

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

+2

Это кажется довольно невозможным ответить. – jahroy

ответ

30

Это как Дженга. Вам понадобится терпение и устойчивая рука, иначе вам придется воссоздать все с нуля. Что не плохо, само по себе - иногда нужно выбросить код.

Другие советы:

  • Подумайте, прежде чем вытягивать из методов: на каких данных делает этот метод работать? Какую ответственность он несет?
  • Попробуйте сначала поддерживать интерфейс класса богов и делегировать вызовы новым извлеченным классам. В конце концов, класс богов должен быть чистым фасадом без собственной логики. После этого вы можете сохранить его для удобства или выбросить и начать использовать новые классы только
  • Unit Tests помощи: писать тесты для каждого метода перед извлечением его, чтобы обеспечить вам не нарушать функциональность
+0

Хороший совет по тестированию устройства. Но мне действительно нужен способ распутывания. Это основная проблема –

+0

, которая сильно зависит от случая. К сожалению, нет рецепта для всех вариантов, кроме «использовать подходящие [шаблоны рефакторинга] (http://www.refactoring.com/catalog/index.html)»). –

+2

Мне нравится идея превратить его в фасад. Это помогает поддерживать части Jenga, поддерживая друг друга, но также сохраняет рефакторинг, продвигаясь вперед. –

11

Я полагаю, «Объект Бога» означает огромный класс (измеренный в строках кода).

Основная идея состоит в том, чтобы извлечь части своих функций в другие классы.

Для того, чтобы найти те, которые вы можете посмотреть на

  • полей/параметров, которые часто привыкают вместе. Они могут перемещаться в новый класс

  • методы (или части методов), которые используют только небольшое подмножество полей в классе, могут перемещаться в класс, содержащий только это поле.

  • примитивные типы (int, String, boolean). Они часто являются ценностными объектами до их выхода. Когда они являются объектами ценности, они часто привлекают методы.

  • Посмотрите на использование объекта god. Существуют ли разные методы, используемые разными клиентами? Это могут быть отдельные интерфейсы. Эти намерения, в свою очередь, могут иметь отдельные реализации.

Для фактически делает эти изменения вы должны иметь инфраструктуру и инструменты в вашей команде:

  • тесты: Есть (возможно генерируемый) исчерпывающий набор тестов, готовых что вы можете запускать часто. Будьте предельно осторожны с изменениями, которые вы делаете без тестов. Я делаю это, но ограничиваю их такими вещами, как метод extract, который я могу сделать полностью с помощью одного действия IDE.

  • Управление версией: вы хотите иметь контроль версий, который позволяет совершать каждые 2 минуты, не замедляя вас. SVN не работает. Гит делает.

  • Метод Mikado: Идея метода Mikado заключается в том, чтобы попробовать изменения. Если он отлично работает.Если не принимать во внимание то, что ломается, добавьте их как зависимость от изменения, с которым вы начали. Откат вы меняете. В полученном графике повторите процесс с узлом, который еще не имеет зависимостей. http://mikadomethod.wordpress.com/book/

0

Перед тем как начать: , как вы знаете, класс Бога плохо?

или по крайней мере, как вы измеряете класс Бога?

Постарайтесь найти привязанность и отличия между хорошим классом и классом bad-god.

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

Я считаю, что класс Бога - это просто класс большого класса с забытым или отложенным рефакторингом, но причина для того, что рефакторинг растет со временем.

Общие рекомендации здесь является использование:

  • наследования и Mixins,
  • делегации (например: с утилитами файлов, внешние классы, API/фасад),
  • Расщепление класс: добавление подклассы или связанные классы,
  • используя хороший образец, как SOLID,
  • развивается в себя искусство рефакторинга,
Смежные вопросы