Советы по работе с устаревшим кодом
Мне нужен совет о том, как работать с устаревшим кодом.
Некоторое время назад мне было поручено добавить несколько отчетов в приложение для составления отчетов. написано в Struts 1, еще в 2005 году. Ничего страшного, но код довольно грязный. Не нужно использовать формы Action, и в основном код - это одно огромное действие и множество операторов if-else внутри. Кроме того, никто здесь не имеет функциональных знаний по этому вопросу. Мы просто нашли это в нашем контракте.
Я очень недоволен этим и не уверен, как поступить. Это приложение невидимо: его используют немногие (но все очень важно), поэтому им все равно, кровоточат ли мои глаза при чтении кода, стандартов и т. Д.
Тем не менее, я чувствую, что технический долг должен быть оплачен. Как мне поступить? Продолжить движение по дороге if-else или попытаться выполнить это требование правильным образом, игнорируя остальную часть проекта? Начать огромный рефакторинг, рискуя моим сроком?
4 ответа
Устаревший код - большая проблема, и я уверен, что люди не согласятся!
Я бы сказал, что начинать большой ре-фактор может быть ошибкой.
Большой рефакторинг означает большую работу, чтобы заставить его функционировать точно так же, как сейчас. Если вы решите взять это на себя, вам не будет видно, что вы делаете. Если это сработает, никто не узнает, сколько часов работы вы поставили. Если это НЕ работает, и вы в итоге получаете аккуратный код, но добавляете некоторые ошибки (и кто когда-либо писал код без добавления некоторых ошибок), тогда вы получите вопросы типа "почему это изменилось".
В настоящее время я почти завершил проект, работающий на базе 10-летнего кода. Мы сделали немало ре-факторинга по пути. Но для каждого пересмотренного фактора мы можем обосновать, что "это конкретное изменение облегчит реальную задачу, которую мы сейчас делаем". Вместо "это теперь чище для будущей работы". Мы обнаружили, что когда мы работали над кодом, исправляя проблемы, с которыми мы фактически сталкиваемся по одному, мы исправляли многие из них, не ломая их (много).
И я бы сказал, прежде чем вы сможете многократно пересчитать, вам понадобятся автоматизированные тесты, так что вы можете быть очень счастливы, что правильно соединили их!
Большая часть ре-факторинга делается для того, чтобы "облегчить обслуживание и дальнейшее развитие". Ваш проект звучит так, как будто у нас не так много будущего развития. Это ограничивает преимущество, которое дает ре-фактор компании.
Правило № 1: Если это не сломано, не исправляйте это.
Правило № 2: В случае сомнений перечитайте правило № 1.
К сожалению, устаревший код очень редко можно описать как "он не сломан". Поэтому мы должны настроить существующий код, чтобы исправить вновь обнаруженную ошибку, настроить существующий код, чтобы изменить поведение, которое было ранее приемлемым, или настроить существующий код, чтобы добавить новые функциональные возможности.
Мой опыт научил меня, что любой рефакторинг должен выполняться "бесконечно малыми" шагами. Если вы должны нарушить правило № 2, я предлагаю вам начать поиск с самого внутреннего вложенного цикла или структуры IF и расширяться наружу, пока не найдете чистую логическую точку разделения и не создадите новую функцию / метод / подпрограмму, содержащую только кишки этого цикла или структуры. Это не сделает ничего более эффективным, но должно дать вам более четкое представление о базовой логике и структуре. Если у вас есть несколько новых, более мелких функций / методов / подпрограмм, вы можете реорганизовать их и объединить в нечто более управляемое.
Правило № 3: игнорируйте мой предыдущий абзац и перечитайте первые два правила.
Я согласен с другими комментариями. Если вам не нужно, то не делайте этого. Обычно это стоит намного больше, чем стоит, если кодовая база в любом случае более или менее мертва.
С другой стороны, если вы чувствуете, что не можете разобраться с кодом, то рефакторинг, вероятно, неизбежен. Если это так, то, поскольку это веб-приложение, можете ли вы создать солидный набор функциональных тестов с использованием селена? Если это так, то это самый быстрый и наиболее полезный подход к тестированию для такого кода, и он поймает большинство ошибок.
Во-вторых, начните с рефакторинга метода извлечения, чтобы создать методы сложения больших сложных методов. Каждый раз, когда вы думаете о себе "У этого должен быть комментарий, объясняющий, что он делает", вы должны извлечь его в метод с именем, которое заменяет комментарий.
Как только это будет сделано, если вы все еще не можете добавить необходимые функции, вы можете перейти к более сложному рефакторингу и, возможно, даже добавить некоторые юнит-тесты. Но я обычно нахожу, что могу добавить то, что требуется / исправить ошибку в унаследованном коде, просто создав самодокументированный код.
В двух словах: прежде чем вносить какие-либо изменения в унаследованный код, рекомендуется начать с автоматизированных модульных тестов. Это даст разработчику понимание ключевых вещей: зависимостей, которые имеет этот фрагмент кода, входных данных, выходных результатов, граничных условий и так далее.
Когда это будет сделано, скорее всего, вы лучше поймете, что делает этот код и как он работает.
После этого имеет смысл (но не обязательно) немного очистить код, давая более точные имена локальным переменным, перенеся некоторые функциональные возможности (повторяющийся код, если есть) в функции с понятными понятными для человека именами.
Простая очистка может сделать код более читабельным и в то же время избавить разработчика от проблем регрессии с помощью модульных тестов.
Рефакторинг - вносите небольшие изменения, шаг за шагом, когда у вас есть время и понимание требований и функциональности, регулярно проводите модульное тестирование кода.
Но не начинайте с рефакторинга