Рефакторинг кода - Code refactoring

В компьютерном программировании и разработке программного обеспечения , рефакторинг кода является процесс реструктуризации существующего компьютерного кода -Изменение на факторинг -без изменения его внешнего поведения. Рефакторинг предназначен для улучшения дизайна, структуры и / или реализации программного обеспечения (его нефункциональных атрибутов) при сохранении его функциональности . Потенциальные преимущества рефакторинга могут включать улучшенную читаемость кода и меньшую сложность ; это может улучшить исходный код ' сек ремонтопригодностьи создать более простую, понятную или более выразительную внутреннюю архитектуру или объектную модель для улучшения расширяемости . Еще одна потенциальная цель рефакторинга - повышение производительности; Разработчики программного обеспечения постоянно сталкиваются с проблемой создания программ, которые работают быстрее или используют меньше памяти.

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

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

-  Джошуа Кериевский, Рефакторинг под шаблоны

Мотивация

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

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

Преимущества

Есть две основные категории преимуществ рефакторинга.

  1. Ремонтопригодность. Ошибки исправлять легче, потому что исходный код легко читать, а замыслы его автора легко понять. Этого можно достичь, сведя большие монолитные процедуры к набору индивидуально кратких, хорошо названных одноцелевых методов. Этого можно добиться, переместив метод в более подходящий класс или удалив вводящие в заблуждение комментарии.
  2. Расширяемость. Легче расширить возможности приложения, если оно использует узнаваемые шаблоны проектирования и обеспечивает некоторую гибкость там, где их раньше не было.

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

Вызовы

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

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

Тестирование

Перед рефакторингом следует настроить автоматические модульные тесты, чтобы гарантировать, что процедуры по-прежнему работают должным образом. Модульные тесты могут обеспечить стабильность даже крупным рефакторам, если они выполняются с одной атомарной фиксацией . Распространенной стратегией, позволяющей безопасным и атомарным рефакторам, охватывающим несколько проектов, является хранение всех проектов в одном репозитории , известном как монорепозиторий .

При модульном тестировании рефакторинг представляет собой итеративный цикл, в котором выполняется небольшое преобразование программы , проверяется ее правильность и выполняется еще одно небольшое преобразование. Если в какой-то момент тест не проходит, последнее небольшое изменение отменяется и повторяется другим способом. Пройдя множество небольших шагов, программа перемещается от того места, где она была, к тому месту, где вы хотите. Чтобы этот итеративный процесс был практичным, тесты должны выполняться очень быстро, иначе программисту придется тратить большую часть своего времени на ожидание завершения тестов. Сторонники экстремального программирования и другой гибкой разработки программного обеспечения описывают эту деятельность как неотъемлемую часть цикла разработки программного обеспечения .

Техники

Вот несколько примеров микрорефакторинга; некоторые из них могут относиться только к определенным языкам или типам языков. Более длинный список можно найти в книге и на сайте Мартина Фаулера по рефакторингу. Многие среды разработки обеспечивают автоматическую поддержку этих микрорефакторингов. Например, программист может щелкнуть имя переменной и затем выбрать рефакторинг «Инкапсулировать поле» из контекстного меню . Затем IDE запросит дополнительные сведения, обычно с разумными значениями по умолчанию и предварительным просмотром изменений кода. После подтверждения программистом он будет выполнять необходимые изменения по всему коду.

  • Методы, позволяющие лучше понять
    • График зависимости программы - явное представление зависимостей данных и управления
    • График зависимости системы - представление вызовов процедур между PDG
    • Программный интеллект - обратное проектирование исходного состояния для понимания существующих зависимостей внутри приложения
  • Методы, позволяющие добиться большей абстракции
  • Методы разбиения кода на более логичные части
    • Компонентизация разбивает код на повторно используемые семантические единицы, которые представляют понятные, четко определенные и простые в использовании интерфейсы.
    • Извлечь класс перемещает часть кода из существующего класса в новый класс.
    • Извлечь метод, чтобы превратить часть более крупного метода в новый метод. Разбивая код на более мелкие части, он становится более понятным. Это также применимо к функциям .
  • Методы улучшения имен и местоположения кода
  • Автоматическое обнаружение клонов

Аппаратный рефакторинг

Хотя термин « рефакторинг» первоначально относился исключительно к рефакторингу программного кода, в последние годы код, написанный на языках описания оборудования (HDL), также подвергся рефакторингу. Термин аппаратный рефакторинг используется как сокращенное обозначение рефакторинга кода на языках описания оборудования. Поскольку большинство инженеров по аппаратному обеспечению не считают HDL языками программирования , аппаратный рефакторинг следует рассматривать как отдельную область от традиционного рефакторинга кода.

Автоматический рефакторинг аналоговых описаний оборудования (в VHDL-AMS ) был предложен Зенгом и Хусом. В их подходе рефакторинг сохраняет смоделированное поведение конструкции оборудования. Нефункциональное измерение, которое улучшается, заключается в том, что реорганизованный код может обрабатываться стандартными инструментами синтеза, в то время как исходный код - нет. Рефакторинг цифровых HDL, хотя и ручной рефакторинг, также исследовался коллегой Synopsys Майком Китингом. Его цель - облегчить понимание сложных систем, что повысит продуктивность дизайнеров.

История

Первое известное использование термина «рефакторинг» в опубликованной литературе было в статье Уильяма Опдайка и Ральфа Джонсона в сентябре 1990 года . Доктор философии Гризвольда. кандидатскую диссертацию Опдык. В диссертации, опубликованной в 1992 году, также использовался этот термин. Хотя рефакторинг кода неофициально проводился на протяжении десятилетий, доктор философии Уильяма Грисволда 1991 г. Диссертация является одной из первых крупных академических работ по рефакторингу функциональных и процедурных программ, за которой следует диссертация Уильяма Опдайка 1992 года по рефакторингу объектно-ориентированных программ, хотя вся теория и механизмы уже давно доступны в виде систем преобразования программ . Все эти ресурсы предоставляют каталог общих методов рефакторинга; Метод рефакторинга содержит описание того, как применять метод, и индикаторы того, когда вам следует (или не следует) применять метод.

Книга Мартина Фаулера « Рефакторинг: улучшение дизайна существующего кода» является каноническим справочником.

Термины «факторинг» и «факторинг» использовались таким образом в сообществе Форт, по крайней мере, с начала 1980-х годов. Этому предмету посвящена шестая глава книги Лео Броди « Размышляя вперед» (1984).

В экстремальном программировании техника рефакторинга Extract Method имеет, по сути, то же значение, что и факторинг в Forth; чтобы разбить «слово» (или функцию ) на более мелкие, более простые в обслуживании функции.

Рефакторинги также можно реконструировать posthoc для получения кратких описаний сложных изменений программного обеспечения, записанных в программных репозиториях, таких как CVS или SVN.

Автоматический рефакторинг кода

Многие редакторы программного обеспечения и IDE поддерживают автоматический рефакторинг. Код приложения можно рефакторировать так же, как и тестировать код. Вот список некоторых из этих редакторов или так называемых рефакторинговых браузеров .

Смотрите также

использованная литература

дальнейшее чтение

внешние ссылки