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

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

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

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

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

Мотивация

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

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

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

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

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

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

Вызовы

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

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

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

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

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

Методы

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

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

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

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

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

История

Хотя рефакторинг кода неофициально проводился десятилетиями, Уильям Грисволд доктор философии 1991 г. диссертация[23] является одной из первых крупных научных работ по рефакторингу функциональных и процедурных программ, за которой следует Уильям Опдайк диссертация 1992 г.[24] по рефакторингу объектно-ориентированных программ,[25] хотя вся теория и техника уже давно доступны как преобразование программы системы. Все эти ресурсы предоставляют каталог общих методов рефакторинга; в методе рефакторинга есть описание того, как применять метод и индикаторы того, когда вам следует (или не следует) применять метод.

Мартин Фаулер книга Рефакторинг: улучшение дизайна существующего кода[2] это каноническая ссылка.[согласно кому? ]

Первое известное использование термина «рефакторинг» в опубликованной литературе было в статье, опубликованной в сентябре 1990 г. Уильям Опдайк и Ральф Джонсон.[26]Доктор философии Гризвольда. Тезис,[23]Опдайк Тезис,[24] опубликовано в 1992 г., также использовался этот термин.[25]

Термины «факторинг» и «факторинг» использовались таким образом в Четвертый сообщество по крайней мере с начала 1980-х. Глава шестая Лео Броди книга Думая дальше (1984)[27] посвящен теме.

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

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

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

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

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

Рекомендации

  1. ^ а б Кериевский, Джошуа (2004). Рефакторинг под шаблоны. Эддисон Уэсли.
  2. ^ а б c Фаулер, Мартин (1999). Рефакторинг. Улучшение дизайна существующего кода. Эддисон-Уэсли. стр.63ff. ISBN  978-0-201-48567-7.
  3. ^ Сурьянараяна, Гириш (ноябрь 2014 г.). Рефакторинг для разработки программного обеспечения. Морган Кауфманн. п. 258. ISBN  978-0128013977.
  4. ^ Мартин, Роберт (2009). Чистый код. Прентис Холл.
  5. ^ Leiserson, Charles E .; Томпсон, Нил С .; Emer, Joel S .; Kuszmaul, Bradley C .; Лэмпсон, Батлер У .; Санчес, Даниэль; Шардл, Тао Б. (2020). «Вверху есть много места: что будет стимулировать производительность компьютеров после закона Мура?». Наука. 368 (6495): eaam9744. Дои:10.1126 / science.aam9744. PMID  32499413.
  6. ^ Хендлер, Торстен; Нойман, Густав (2019). «Структура для оценки и обучения компетенций в области рефакторинга программного обеспечения». Proc. 11-й Международной конференции по управлению знаниями и информационным системам (KMIS).: 307–316. Дои:10.5220/0008350803070316. ISBN  978-989-758-382-7. S2CID  204754665.
  7. ^ Нассиф, Матье; Робиллард, Мартин П. (ноябрь 2017 г.). «Возвращаясь к потере знаний, вызванной текучестью, в программных проектах». Международная конференция IEEE по сопровождению и развитию программного обеспечения (ICSME), 2017 г.: 261–272. Дои:10.1109 / ICSME.2017.64. ISBN  978-1-5386-0992-7. S2CID  13147063.
  8. ^ ван Гурп, Джиллес; Бош, янв (март 2002 г.). «Эрозия дизайна: проблемы и причины». Журнал систем и программного обеспечения. 61 (2): 105–119. Дои:10.1016 / S0164-1212 (01) 00152-2.
  9. ^ Hassan, Ahmed E .; Се, Тао (ноябрь 2010 г.). «Программный интеллект: будущее разработки программного обеспечения для добычи данных». В материалах семинара FSE / SDP о будущем исследований в области программной инженерии (FoSER '10): 161–166. Дои:10.1145/1882362.1882397. S2CID  3485526.
  10. ^ Новаис, Ренато; Сантос, Хосе Амансио; Мендонса, Маноэль (2017). «Экспериментальная оценка комбинации нескольких стратегий визуализации для анализа эволюции программного обеспечения». Журнал систем и программного обеспечения. 128: 56–71. Дои:10.1016 / j.jss.2017.03.006.
  11. ^ 1963-, Фаулер, Мартин (1999). Рефакторинг: улучшение дизайна существующего кода. Ридинг, Массачусетс: Эддисон-Уэсли. ISBN  978-0201485677. OCLC  41017370.CS1 maint: числовые имена: список авторов (связь)
  12. ^ Умный, Джон Фергюсон (2008). Java Power Tools. "O'Reilly Media, Inc.". п. 301. ISBN  9781491954546. Получено 26 июля 2018.
  13. ^ а б (однако это касается только ООП).Методы рефакторинга на сайте рефакторинга Фаулера
  14. ^ Ферранте, Жанна; Оттенштейн, Карл Дж .; Уоррен, Джо Д. (июль 1987 г.). «График зависимости программы и его использование в оптимизации». Транзакции ACM по языкам и системам программирования. ACM. 9 (3): 319–349. Дои:10.1145/24039.24041. S2CID  505075.
  15. ^ Донглин, Линаг; Харролд, М. Дж. (Ноябрь 2008 г.). «Нарезка объектов с помощью системных графиков зависимостей». Ход работы. Международная конференция по сопровождению программного обеспечения. IEEE: 319–349. Дои:10.1109 / ICSM.1998.738527. ISBN  978-0-8186-8779-2. S2CID  18160599.
  16. ^ Заменить код проверки типов на состояние / стратегию
  17. ^ Заменить условное выражение на полиморфизм
  18. ^ Брантинк, Мэджил и др. "Оценка методов обнаружения клонов для устранения проблем. "Сопровождение программного обеспечения, 2004. Труды. 20-я Международная конференция IEEE по. IEEE, 2004.
  19. ^ Языки описания оборудования # HDL и языки программирования
  20. ^ Кайпин Цзэн, Сорин А. Хусс, «Усовершенствования архитектуры путем рефакторинга кода поведенческих моделей VHDL-AMS». ISCAS 2006
  21. ^ М. Китинг: «Сложность, абстракция и проблемы проектирования сложных систем», в учебнике DAC'08. [1] «Устранение пробелов в проверке: C ++ на RTL для практического проектирования»
  22. ^ М. Китинг, П. Брико: Руководство по методологии повторного использования для проектов системы на кристалле, Kluwer Academic Publishers, 1999.
  23. ^ а б Грисволд, Уильям Дж. (Июль 1991 г.). Реструктуризация программы как помощь в обслуживании программного обеспечения (PDF) (Кандидатская диссертация). Вашингтонский университет. Получено 2011-12-24.
  24. ^ а б Опдайк, Уильям Ф (Июнь 1992 г.). Рефакторинг объектно-ориентированных фреймворков (Кандидатская диссертация). Иллинойсский университет в Урбане-Шампейн. Архивировано из оригинал (сжатый Postscript) на 2019-12-16. Получено 2008-02-12.
  25. ^ а б Мартин Фаулер, "MF Bliki: этимология рефакторинга"
  26. ^ Опдайк, Уильям Ф.; Джонсон, Ральф Э. (сентябрь 1990 г.). «Рефакторинг: помощь в разработке фреймворков приложений и развитии объектно-ориентированных систем». Материалы симпозиума по объектно-ориентированному программированию с упором на практические приложения (SOOPPA). ACM.
  27. ^ Броди, Лео (2004). Думая дальше. С. 171–196. ISBN  0-9764587-0-5. Архивировано из оригинал 16 декабря 2005 г.. Получено 3 мая 2020.
  28. ^ Вайсгербер, Питер; Диль, С. (2006). «Выявление рефакторинга на основе изменений исходного кода» (PDF). Материалы 21-й Международной конференции IEEE / ACM по автоматизированной разработке программного обеспечения (ASE 2006). ACM.
  29. ^ Сюань, Цзифэн; Корню, Бенуа; Мартинес, Матиас; Бодри, Бенуа; Сейнтюрье, Лайонел; Монперрус, Мартин (2016). «B-Refactoring: автоматический рефакторинг тестового кода для улучшения динамического анализа». Информационные и программные технологии. 76: 65–80. Дои:10.1016 / j.infsof.2016.04.016.
  30. ^ Что нового в Xcode 9
  31. ^ Рефакторинг в Qt Creator

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

внешняя ссылка