Как реорганизовать блок 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, у вас будут базовые классы для выполнения этой работы, и это действительно поможет ускорить выполнение задачи.