Как провести рефакторинг блока Delphi с 10000 строками без документации? - PullRequest
13 голосов
/ 13 октября 2010

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

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

Спасибо.

Ответы [ 8 ]

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

Я бы также порекомендовал добавить в закладки http://www.refactoring.com/catalog/ и http://www.industriallogic.com/xp/refactoring/catalog.html.

Также не помешало бы получить копию Чистый код:Справочник по Agile Software Craftsmanship от Роберта "Дядя Боб", Martin et al.Плохой код легко распознать.Гораздо сложнее понять, когда вы пишете хороший код.

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

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

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

16 голосов
/ 13 октября 2010

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

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

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

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

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

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

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

3 голосов
/ 13 октября 2010

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

2 голосов
/ 13 октября 2010

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

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

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

1 голос
/ 13 октября 2010

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

0 голосов
/ 13 октября 2010

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

0 голосов
/ 13 октября 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...