Как вы рефакторинг класса Бог?

кто-нибудь знает лучший способ рефакторинга Бог-объект?

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

2 ответов


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

прочие советы:

  • подумайте, прежде чем вытаскивать методы: на каких данных работает этот метод? Какая у него ответственность?
  • сначала попробуйте сохранить интерфейс класса god и делегировать вызовы новым извлеченным классам. В класс Бога должен быть чистым фасадом без собственной логики. Тогда вы можете сохранить его для удобства или выбросить и начать использовать только новые классы
  • модульные тесты справка: напишите тесты для каждого метода перед его извлечением, чтобы убедиться, что вы не нарушаете функциональность

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

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

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

  • поля/параметры, которые часто используются вместе. Они могли бы вместе перейти в новый класс!--1-->

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

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

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

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

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

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

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