Привет!
Как часто вам приходится переписывать старый код? А что делать если код чужой, и писали его не вы? А если это код, который работает для финансовой структуры, и поэтому цена даже незначительной ошибки может привести к огромным, колоссальным экономическим потерям?
Понимаю вопросы достаточно сложные, поэтому сегодня и будет такая статья на тему, вернее некие мои размышления по поводу проводить рефакторинг кода или или нужно сначала написать тесты на код. Помните, буквально пару дней назад я писал статью про разработку через тестирование?
При работе с устаревшим кодом вы можете столкнуться с интересной дилеммой:
для рефакторинга кода нужны тесты; но прежде чем вы сможете писать тесты, вам нужно провести рефакторинг. Эта проблема "курица или яйцо" называется «дилемма теста-рефакторинга».
В этой ситуации профессиональные программисты часто начинают с рефакторинга; они проводят рефакторинг не больше, чем нужно для написания тестов, которые служат подстраховкой.
Они никогда не реорганизуют код, особенной чужой, хаотично, потому что высок риск сделать ошибку и нарушить существующую функциональность.
Вместо этого они движутся маленькими шагами и минимизируют риск, полагаясь только на подмножество безопасного рефакторинга, предоставляемого IDE: метод извлечения, инкапсуляция поля, введение параметра и т. д. Если IDE которой вы пользуетесь, не дает такие удобные инструменты для работы, то это повод задуматься чтобы сменить ее. Понятно, что даже в "Блокноте" можно написать код и он будет работать, но зачем, когда на рынке появились очень удобные IDE? Даже бесплатные версии содержат в себе весь нужный функционал.
В качестве хорошей практики они делают "git commit" после каждого успешного шага, чтобы они могли откатиться, если следующий шаг завершится неудачно. Этот процесс напоминает кропотливую работу ювелира. Который шаг за шагом создает произведение искусства, правда ювелир не сможет "откатить" изменения назад. Это минус.
Теперь вы знаете, почему в долгоживущих проектах хорошо использовать статические языки программирования со строгой типизацией, такие как Java, Kotlin или TypeScript.
С динамическими и слабо типизированными языками IDE не может вам сильно помочь, и рефакторинг становится рискованным. Но, опять же, если нужно быстро сделать проект и показать, что идея воплощенная в нем рабочая и может принести пользу, и вы понимаете, что не будете дальше поддерживать именно эту версию - то это тоже хороший выбор.
Главное отдавать себе отчет в том, то вы делаете и для чего - и тогда вам не придется в последствии испытывать сложностей.