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

18

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

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

    
задан Oliver Watkins 14.02.2013 в 09:10
источник
  • Это кажется довольно невозможным ответить. –  jahroy 14.02.2013 в 09:24

2 ответа

31

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

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

  • Подумайте, прежде чем вытаскивать методы: по каким данным этот метод работает? Какую ответственность он несет?
  • Сначала попробуйте сохранить интерфейс класса богов и делегировать вызовы новым выделенным классам. В конце концов, класс богов должен быть чистым фасадом без собственной логики. Затем вы можете сохранить его для удобства или выбросить и начать использовать только новые классы.
  • Помогите с помощью Unit Tests: напишите тесты для каждого метода, прежде чем извлекать его, чтобы убедиться, что вы не нарушаете функциональность.
ответ дан Fabian Schmengler 14.02.2013 в 16:06
источник
  • хороший совет по тестированию устройства. Но мне действительно нужен способ распутывания. Это проблема проблемы –  Oliver Watkins 14.02.2013 в 16:09
  • , что сильно зависит от случая. К сожалению, нет рецепта для всех вариантов, кроме «использовать соответствующие шаблоны рефакторинга»). –  Fabian Schmengler 14.02.2013 в 16:12
  • Мне нравится идея превратить его в фасад. Это помогает поддерживать части Jenga, поддерживая друг друга, но также сохраняет рефакторинг, продвигаясь вперед. –  Michael Cordingley 08.09.2014 в 16:48
11

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

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

Чтобы найти те, которые вы можете найти

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

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

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

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

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

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

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

  • Метод Микадо: Идея метода Микадо - попытаться изменить. Если он отлично работает. Если не принимать во внимание то, что ломается, добавьте их как зависимость от изменения, с которым вы начали. Откат вы меняете. В полученном графике повторите процесс с узлом, который еще не имеет зависимостей. Ссылка

ответ дан Jens Schauder 18.03.2013 в 12:22
источник
0

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

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

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

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

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

Общий совет здесь - использование:

  • наследование и микшины,
  • делегирование (например: utils файлы, внешние классы, API / фасад),
  • класс разделения: добавление подклассов или связанных классов,
  • , используя хороший шаблон, например S.O.L.I.D,
  • развивая в себе искусство рефакторинга,
ответ дан Sławomir Lenart 09.06.2017 в 17:39
источник