Содержание
Рефакторинг — это неизбежный процесс
Рефакторинг или реорганизация кода — процесс изменения внутренней структуры программного продукта, не затрагивающий её внешнего поведения и имеющий целью облегчение понимания программного кода и, пусть и не всегда, оптимизацию производительности.
В основе рефакторинга лежит последовательность небольших преобразований программного кода, сохраняющих его поведение. Так как каждое преобразование по объёму незначительно, то программисту легче проследить за его правильностью, а вся последовательность этих изменений может привести к существенной перестройке программы и улучшению её согласованности, четкости и простоты понимания её кода другими разработчиками.
Обычно рефакторят код под контролям прохождения автоматизированных тестов, без этого достаточно сложно убедиться, что внесённые изменения не являются деструктивными и поведение программы осталось прежним.
Без рефакторинга не обходится ни один действительно сложный и долгоживущий проект
Обойтись без рефакторинга можно лишь в том случае, если разрабатывается что-то, что будет использовано лишь однажды, а потом просто выброшено. Во всех остальных случаях рефакторинг необходим. Проявляться он, конечно, может по разному.
В самом простом случае, рефакторинг осуществляется в процессе написания кода. Разработчик реализует функционал, добивается работоспособности, а затем проводит оптимизацию и рефакторинг написанного кода. К сожалению, сложно написать сложный программный компонент сразу идеально: полное понимание взаимосвязей, логики и вариантов реализации, как правило, приходит в процессе разработки.
Тем не менее, рефакторинга только в процессе разработки отдельных компонентов не достаточно. Если разрабатываемый компонент не изолирован, а взаимодействует с другими, то обычно есть необходимость в рефакторинге программных интерфейсов, через которые это самое взаимодействие реализуется.
В рамках всей программной системы перед рефакторингом стоит еще задача унификации именования функций и переменных, форматирования и достижения соблюдения стандартов кодирования.
Наиболее частые причины для рефакторинга:
- дублирование кода
- длинные методы
- объёмные классы
- длинные списки параметров
- избыточные временные переменные
- классы данных
- несгруппированные данные
- несоблюдение стандартов кодирования
Рефакторинг очень существенно влияет на сопровождаемость проекта
Любой проект без регулярного рефакторинга за несколько лет (или даже месяцев) становится трудным для понимания, процессы изменений замедляются и становятся дороже, а иногда такие проекты доходят до состояния «проще переписать тут всё с нуля, чем разбираться». Таким образом затраты на рефакторинг окупаются за счёт того, что изменения вносить становится проще и процесс модернизации обходится значительно дешевле.
Рефакторинг и оптимизация производительности
Стоит разделять эти понятия. Оптимизация кода, нацеленная на обеспечение быстродействия, иногда приводит к снижению понятности кода: часто эффективный код — это код, написанный не так, как понятно человеку, а так, как понятно компьютеру.
Но рефакторинг сам по себе нередко повышает производительность, так как выявляются и удаляются лишние конструкции, от которых результат работы не зависит, но на время выполнения программы такие конструкции могут существенно влиять; иногда меняется и последовательность выполнения программного кода, что тоже может позитивно повлиять на производительность.
Что такое рефакторинг в программировании
В среде разработчиков можно услышать: «Мне нужен год на рефакторинг» (полгода, месяц, неделя, хотя бы денёк). Что это значит и зачем это нужно — разберём.
🤔 Это понятие напрямую связано с техническим долгом, прочитайте о нём →
На примере кафе
Представим такую ситуацию: мы открыли кафе, построили там классную кухню и наняли шеф-повара. Когда кафе только запускалось, в меню были самые простые блюда, которые можно было разогреть в микроволновке. Вы купили микроволновку и поставили на кухне. Рядом разместили стеллаж для всего нужного.
Через два месяца дела пошли лучше, и мы решили добавить в меню выпечку. Купили духовой шкаф, протянули провода, добавили рядом стойку с подносами. Место на кухне уменьшилось, повар всё время перешагивает через провода и обходит стойку, но работать можно.
Ещё через месяц поставили фритюрницу и миксер для теста. К ним тоже протянули провода, добавили рядом шкафы для утвари и наняли второго повара. В итоге на кухне полный бардак, всё друг другу мешает, а блюда готовить неудобно. Если мы захотим добавить новую плиту, то это будет уже сложно: места нет, хотя по площади можно поставить хоть две таких плиты.
В этот момент приходит кухонный проектировщик и рисует всё заново: где что должно стоять.
Через неделю на кухне всё по-другому: оборудование стоит так, чтобы не мешать поварам, провода спрятаны в короба, а стойки с оборудованием не загораживают выход. При этом меню в кафе не изменилось: посетители даже не знают, что у нас что-то происходило на кухне, потому что мы оптимизировали процессы, а не меню. Это и есть рефакторинг — когда мы меняем что-то внутри так, что снаружи это незаметно, но работать дальше становится проще.
В программировании рефакторинг кода — это такое изменение кода, которое не изменяет его функциональность, но улучшает читаемость и дальнейшую поддержку.
Когда нужен рефакторинг в программировании
Есть два подхода к рефакторингу: плановый и по необходимости.
Плановый рефакторинг означает, что разработчики сразу закладывают время на рефакторинг в цикл разработки. Например, каждые четыре спринта или каждые полгода.
В больших компаниях, где много легаси-кода, могут быть вообще отдельные команды, которые занимаются только рефакторингом старья. Это помогает остальным командам быстрее понимать, что в нём происходит и как им пользоваться.
Второй подход — рефакторинг по необходимости, когда добавление новых возможностей тормозится из-за того, что их сложно интегрировать в старый код. Тогда мы говорим «Стоп машина» и берём какое-то время на реорганизацию всего, что было.
На что смотрят при рефакторинге кода
Главный показатель успешного рефакторинга — после него код стал чище, проще и понятнее.
Например, если переменная Z
в программе отвечает за количество покупателей, то лучше её заменить на customerCount
— так будет проще разобраться в коде и понять, что там происходит.
Как называть переменные и функции, чтобы вас уважали бывалые программисты
Если фрагмент кода повторяется больше одного раза, то его чаще всего выносят в отдельную функцию или метод. В этом случае будет легче заменить код в одном месте, чем искать повторяющиеся фрагменты по всей программе.
Ещё программисты обращают внимание на размер функций, методов и классов. Если функция получается слишком большой, чтобы поместиться на одном экране, — её разбивают на две, чтобы упростить читаемость кода.
Иногда, чтобы сделать код проще, разработчики выносят часть функций в отдельный файл и подключают его к основной программе.
Рефакторинг — это не оптимизация кода. При рефакторинге задача программиста — сделать код более понятным, а при оптимизации — более быстрым и эффективным.
А можно без рефакторинга?
Жить можно и без рефакторинга, но чем дальше без него — тем тяжелее работать. Рефакторинг — это как наведение порядка на рабочем месте. Если долго им не заниматься, со временем работать становится неудобно. Регулярный рефакторинг помогает не замедлять дальнейшую разработку в больших командах.
Без рефакторинга можно только в маленьких продуктах, которые развиваются медленно.
Что дальше
В следующей статье попробуем применить эти знания на практике и отрефакторить какой-нибудь из наших старых проектов, чтобы посмотреть, как изменится код и что получится в итоге.
Текст:
Михаил Полянин
Редактор:
Максим Ильяхов
Художник:
Алексей Сухов
Корректор:
Ирина Михеева
Вёрстка:
Кирилл Климентьев
Соцсети:
Виталий Вебер
Что такое рефакторинг? | Agile Alliance
Определение
Рефакторинг заключается в улучшении внутренней структуры исходного кода существующей программы при сохранении ее внешнего поведения.
Существительное «рефакторинг» относится к одному конкретному преобразованию, сохраняющему поведение, такому как «Извлечение метода» или «Введение параметра».
Распространенные ловушки
Рефакторинг «не» означает:
- переписывание кода
- исправление ошибок
- улучшить наблюдаемые аспекты программного обеспечения, такие как его интерфейс
Рефакторинг при отсутствии гарантий от внесения дефектов (т. е. нарушение условия «сохранения поведения») является рискованным. Гарантии включают вспомогательные средства для регрессионного тестирования, включая автоматические модульные тесты или автоматизированные приемочные тесты, а также вспомогательные средства для формальных рассуждений, такие как системы типов.
Ожидаемые преимущества
Ниже перечислены заявленные преимущества рефакторинга:
- рефакторинг улучшает объективные атрибуты кода (длина, дублирование, связанность и связность, цикломатическая сложность), которые коррелируют с простотой обслуживания
- рефакторинг помогает понять код
- побуждает каждого разработчика обдумывать и понимать проектные решения, в частности, в контексте коллективного владения/коллективного владения кодом
- рефакторинг способствует появлению повторно используемых элементов дизайна (таких как шаблоны проектирования) и модулей кода
Рефакторинг
Признаки использования
- Записи контроля версий (такие как журналы CVS или git) включают записи с пометкой «Рефакторинг»
- модификации кода, соответствующие таким записям, могут быть проверены на нейтральность поведения: не вводятся новые модульные или функциональные тесты, например
Уровни навыков
- Новичок
- знает определение «рефакторинга»
- может использовать некоторые автоматизированные рефакторинги из IDE
- может выполнять некоторые рефакторинги вручную
- знает о рисках регресса при ручном и автоматическом рефакторинге
- знает о дублировании кода и может удалить его путем рефакторинга
- Промежуточный уровень
- знает и может устранить более широкий спектр «запахов кода»
- может объединять несколько рефакторингов для выполнения проектного замысла, учитывая взаимосвязь между рефакторингами
- проводит рефакторинг постоянно, а не в виде спорадических и длительных сеансов
- Расширенный
- имеет острое ощущение дублирования кода и связанности
- применяет рефакторинг к элементам, не относящимся к коду, таким как схема базы данных, документы и т. д.
- использует рефакторинг, чтобы направить большие объемы кода к стилям дизайна, намеренно выбранным из широкой палитры: объектно-ориентированный, функциональный или вдохновленный известными шаблонами проектирования
.
Дополнительная литература
- Рефакторинг, Мартин Фаулер
- Метод Микадо Олы Элльнестам и Даниэля Бролунда
Истоки
- 1984: понятие «факторинг», предвосхищение рефакторинга, описано в книге Броди «Размышление о будущем», где оно представлено как «организация кода в полезные фрагменты», которая «происходит во время детального проектирования и реализации». .
- 1990: Билл Опдайк вводит термин «рефакторинг» в статье ACM SIGPLAN с Ральфом Джонсоном «Рефакторинг: помощь в разработке инфраструктур приложений и развитии объектно-ориентированных систем» 9.0014
- 1992: подробное описание «рефакторинга» представлено в диссертации Опдайка «Рефакторинг объектно-ориентированных фреймворков»
- 1999: практика «рефакторинга», включенная несколькими годами ранее в «Экстремальное программирование», популяризируется одноименной книгой Мартина Фаулера
- 2001: рефакторинг «пересекает Рубикон», выражение Мартина Фаулера, описывающее широкую доступность автоматизированных средств рефакторинга в IDE для языка Java
.
.
Academic Publications
Хотя практика рефакторинга стала популярной, строгое определение ее преимуществ в академическом контексте оказалось затруднительным, что свидетельствует о распространенном разрыве между исследованиями и обычной практикой.
- «Изучение эффекта рефакторинга: перспектива показателей сложности», исследование 2010 года, обнаружило на удивление небольшую корреляцию между эпизодами рефакторинга, выявленными в журналах контроля версий, и снижением цикломатической сложности
На такие исследования могут повлиять методологические проблемы, такие как определение того, что считается «рефакторингом» при изучении истории кода постфактум; вышеприведенная статья, например, показывает, что программисты часто называют «рефакторингом» наборы изменений кода, которые также включают дополнительные функции или исправления ошибок.
Рефакторинг
Рефакторинг снижает стоимость улучшений
Когда система программного обеспечения работает успешно, всегда необходимо поддерживать
улучшая его, устраняя проблемы и добавляя новые функции. Ведь это называется
мягкая посуда не просто так! Но природа кодовой базы делает большое
разница в том, насколько легко внести эти изменения. Часто улучшения
накладываются друг на друга таким образом, что становится все труднее
внести изменения. Со временем новая работа замедляется. Для борьбы с этим
изменение, важно провести рефакторинг кода, чтобы добавленные улучшения не
привести к ненужной сложности.
Рефакторинг является частью повседневного программирования
Рефакторинг — это не особая задача, которую можно было бы включить в план проекта. Сделанный
ну, это обычная часть программной деятельности. Когда мне нужно добавить новый
функцию в кодовую базу, я смотрю на существующий код и решаю, подходит ли он
структурирована таким образом, чтобы сделать новое изменение простым. Если это не так,
затем я рефакторинг существующего кода, чтобы упростить это новое дополнение. По
сначала рефакторинг таким образом, я обычно нахожу, что это быстрее, чем если бы я не
провел рефакторинг в первую очередь.
После внесения этого изменения я добавляю новую функцию. Как только я добавил
функцию и заставил ее работать, я часто замечаю, что результирующий код, в то время как он
работает, не так ясно, как могло бы быть. Затем я реорганизую его в лучшую форму
так что, когда я (или кто-то другой) вернусь к этому коду через несколько недель, я
не придется тратить время на то, чтобы понять, как работает этот код.
При изменении программы я часто смотрю в другом месте кода, потому что
многое из того, что мне нужно сделать, может быть уже закодировано в программе. Этот код может
быть функциями, которые я могу легко вызывать, или скрытыми внутри более крупных функций. Если я
изо всех сил пытаюсь понять этот код, я реорганизую его, чтобы мне не пришлось бороться
снова в следующий раз, когда я смотрю на это. Если там зарыта какая-то функциональность
что мне нужно, я рефакторинг, чтобы я мог легко использовать его.
Автоматизированные инструменты полезны, но не обязательны
Когда я написал первое издание «Рефакторинга» в 2000 году,
автоматизированные инструменты, поддерживающие рефакторинг. Теперь многие языки имеют IDE, которые
автоматизировать многие распространенные рефакторинги. Это действительно ценная часть моего
инструментарий, позволяющий мне быстрее проводить рефакторинг. Но такие инструменты не
существенно — я часто работаю с языками программирования без инструментальной поддержки, в
В этом случае я полагаюсь на небольшие шаги и частое тестирование для обнаружения
ошибки.
Каталог
Основным содержанием этого сайта является онлайн-каталог
рефакторинг. Здесь перечислены рефакторинги во втором издании вместе
со сводной информацией о рефакторингах.
Книга
Чтобы узнать больше о
рефакторинга, естественной отправной точкой является мой рефакторинг
книга, уже во втором издании. Я написал оригинальное издание в
2000, когда рефакторинг был малоизвестной техникой. Когда я обновил его
восемнадцать лет спустя рефакторинг стал обычным инструментом для любого
квалифицированный программист. Однако в нашу профессию регулярно приходят новые люди
и нужно узнать о рефакторинге. Эта книга помогает им учиться и
для опытных разработчиков, чтобы передать свои навыки.
Примеры во втором издании написаны на JavaScript, но
рефакторинг применим на любом языке. С оригинальными книгами
(примеры которых были на Java) многие разработчики сочли простым
возьмите примеры и примените их к любым языкам, которые они используют.
Если у вас есть книга, вы можете получить доступ
веб-версия книги, которая является канонической. Это включает в себя
несколько рефакторингов, которых нет в книге, а также развернутый пример. в
В будущем я намерен добавить больше материала в веб-версию.
Как получить доступ к веб-версии?
Определение
В книге я даю следующее определение «рефакторинга»
существительное:
изменение, внесенное в
внутренняя структура программного обеспечения, чтобы сделать его проще для понимания и дешевле
модифицировать без изменения наблюдаемого поведения
глагол:
реструктурировать программное обеспечение
путем применения ряда рефакторингов без изменения его наблюдаемой
поведение.