Как реорганизовать блок Delphi на 10000 строк без документации?

Мне была поручена реорганизация подразделения Delphi. Вау. 10000 строк кода, без документации, тонны кода копирования и вставки.

Есть много методов, сделанных с копией и вставкой, которые могут быть реорганизованы, так или иначе, я теряюсь во всех этих строках, у меня есть раздел интерфейса, где я могу "найти свой путь", но в целом то, что предлагает yuo для решения этой проблемы вид задачи?

Спасибо.

Ответы

Ответ 1

  • Получите себе копию Эффективной работы с устаревшим кодом от Micheal Feathers. Он имеет всевозможные методы безопасного кода рефакторинга, чтобы заставить его работать под тестовой платформой. Примеры в основном в Java и С++, но должны быть достаточно легкими, чтобы понять.
  • Установите сторонний инструмент рефакторинга (или несколько), например CodeRush для Delphi (к сожалению, уже не разработан), Castalia или ModelMaker Code Explorer. В Delphi есть встроенная поддержка рефакторинга, но, по моему опыту, она слишком ограничена и имеет тенденцию забивать очень большие базы кода.
  • Купите копию Simian. Он не имеет прямой поддержки Object Pascal, но его простой текстовый парсер работает достаточно хорошо. Если достаточно людей запросят поддержку Object Pascal, я уверен, что они добавят его. Я не нашел другого инструмента обнаружения дублирования кода, такого же, как Simian.

Я также рекомендую закладок http://www.refactoring.com/catalog/ и http://www.industriallogic.com/xp/refactoring/catalog.html.

Также не помешало бы получить копию "чистого кода": "Руководство по гибкому программному мастерству" Роберта "Дядя Боб" Мартин и др. Легко распознать плохой код. Это гораздо сложнее узнать, когда вы пишете хороший код.

Предупреждение: сосредоточьтесь на реорганизации кода, над которым вам нужно работать. Его легко начать вниз по кроличьей дыре и завершить месячный рефакторинг кода, который не сразу был связан с этой задачей.

И избавь себя от некоторых проблем. Не пытайтесь "исправить" код и реорганизовать его одновременно. Рефакторинг сначала, затем исправить ошибки или добавить эту новую функцию. Помните, что рефакторинг изменяется без изменения внешнего поведения.

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

Ответ 2

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

Лучшие 12 причин для написания модульных тестов применимы в вашем случае:

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

Ответ 3

Я столкнулся с подобными ситуациями. Мои соболезнования вам!

На мой взгляд, самое главное, что вы действительно понимаете весь код, как сегодня. Ум лучше, чем мой, может просто читать код и понимать его. Однако я не могу.

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

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

Ответ 4

Разделяет ли раздел интерфейса кучу определений классов? Если это так, создайте новый блок для каждого класса и переместите каждый класс в его собственный блок.
Если вы используете Delphi 2007 или выше, вы можете использовать опцию" refactor/Move ", чтобы переместить эти классы в новое (пространство имен).
Следующий шаг - разделение больших классов на более мелкие классы. Это просто много ручной работы.
После того как ваш код делится на несколько единиц, вы можете исследовать каждый блок, обнаруживать идентичный код и генерировать базовые классы, которые будут использоваться как родительские для двух классов, которые имеют сходную функциональность.

Ответ 5

Помимо понимания кода и т.д., эти инструменты могут помочь в реорганизации и реорганизации проекта:

Model Maker - мощный инструмент проектирования, реверсирования и рефакторинга: http://www.modelmakertools.com/modelmaker/index.html

Model Maker Code Explorer - мощный плагин для Delphi IDE, который поможет в рефакторинге, навигации по коду и т.д.: http://www.modelmakertools.com/code-explorer/index.html

Ответ 6

Я бы использовал какой-то инструмент UML для создания диаграмм som-классов и других диаграмм, чтобы получить обзор системы, и начать разделение и комментирование, как сказал @Workshop Alex.

Ответ 7

Используйте инструмент, такой как Doxygen, чтобы помочь вам сопоставить код.

Справка об этом здесь

Ответ 8

Начните с малого и в конечном итоге выполните частичную или полную переписывание. Начните создавать базовые классы для выполнения частей головоломки, не меняя выход. Прополощите-повторите, пока у вас нет новой поддерживаемой кодовой базы. Когда вы нажмете эти процедуры copy-n-paste, у вас будут базовые классы для выполнения этой работы, и это действительно поможет ускорить выполнение задачи.