stringtranslate.com

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

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

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

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

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

Мотивация

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

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

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

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

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

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

Сроки и ответственность

Рефакторинг может быть выполнен двумя способами.

  1. Превентивный рефакторинг – первоначальный разработчик кода делает код более надежным, когда он еще свободен от запахов , чтобы предотвратить образование запахов в будущем. [6]
  2. Корректирующий рефакторинг – последующий разработчик выполняет рефакторинг для исправления ошибок кода по мере их возникновения. [6]

Метод, который уравновешивает профилактический и корректирующий рефакторинг, — это «разделенная ответственность за рефакторинг». Этот подход разделяет действие рефакторинга на два этапа и две роли. Первоначальный разработчик кода просто подготавливает код для рефакторинга, и когда код начинает пахнуть , последующий разработчик выполняет фактическое действие рефакторинга. [6]

Вызовы

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

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

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

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

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

Методы

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

Рефакторинг оборудования

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

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

История

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

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

Термины «факторинг» и «факторинг» использовались таким образом в сообществе Форта по крайней мере с начала 1980-х годов. Шестая глава книги Лео Броди «Thinking Forth» (1984) [28] посвящена этой теме.

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

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

Автоматизированный рефакторинг кода

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

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

Ссылки

  1. ^ ab Кериевски, Джошуа (2004). Рефакторинг в шаблоны . Эддисон Уэсли.
  2. ^ ab Fowler, Martin (1999). Рефакторинг. Улучшение дизайна существующего кода. Addison-Wesley. стр. 63 и далее. ISBN 978-0-201-48567-7.
  3. ^ Suryanarayana, Girish (ноябрь 2014). Рефакторинг для Software Design Smells . Морган Кауфманн. стр. 258. ISBN 978-0128013977.
  4. ^ Мартин, Роберт (2009). Чистый код . Prentice Hall.
  5. ^ Лейзерсон, Чарльз Э.; Томпсон, Нил К.; Эмер, Джоэл С.; Кушмаул, Брэдли К.; Лэмпсон, Батлер В.; Санчес, Дэниел; Шардл, Тао Б. (2020). «Наверху много места: что будет стимулировать производительность компьютеров после закона Мура?». Science . 368 (6495): eaam9744. doi : 10.1126/science.aam9744 . PMID  32499413.
  6. ^ abc Fraivert, Dov; Lorenz, David H. (2022). «Language Support for Refactorability Decay Prevention». Труды 21-й Международной конференции ACM SIGPLAN по генеративному программированию: концепции и опыт . стр. 122–134. doi :10.1145/3564719.3568688. ISBN 978-1-4503-9920-3.
  7. ^ Хендлер, Торстен; Нойманн, Густав (2019). «Структура оценки и обучения компетенциям в области рефакторинга программного обеспечения». Труды 11-й Международной совместной конференции по обнаружению знаний, инженерии знаний и управлению знаниями . стр. 307–316. doi : 10.5220/0008350803070316 . ISBN 978-989-758-382-7. S2CID  204754665.
  8. ^ Нассиф, Матье; Робиллард, Мартин П. (ноябрь 2017 г.). Возвращаясь к потере знаний, вызванной текучестью кадров в программных проектах . Международная конференция IEEE по сопровождению и развитию программного обеспечения (ICSME) 2017 г. стр. 261–272. doi :10.1109/ICSME.2017.64. ISBN 978-1-5386-0992-7. S2CID  13147063.
  9. ^ Ван Гурп, Джиллс; Бош, Ян (март 2002 г.). «Эрозия дизайна: проблемы и причины». Журнал систем и программного обеспечения . 61 (2): 105–119. doi :10.1016/S0164-1212(01)00152-2.
  10. ^ Хассан, Ахмед Э.; Кси, Тао (ноябрь 2010 г.). «Программный интеллект: будущее интеллектуального анализа данных программной инженерии». Труды семинара FSE/SDP по будущему исследований программной инженерии (FoSER '10) . стр. 161–166. doi :10.1145/1882362.1882397. S2CID  3485526.
  11. ^ Новаис, Ренато; Сантос, Хосе Амансио; Мендонса, Маноэль (2017). «Экспериментальная оценка комбинации нескольких стратегий визуализации для анализа эволюции программного обеспечения». Журнал систем и программного обеспечения . 128 : 56–71. doi :10.1016/j.jss.2017.03.006.
  12. ^ Фаулер, Мартин (1999). Рефакторинг: улучшение дизайна существующего кода. Reading, MA: Addison-Wesley. ISBN 978-0201485677. OCLC  41017370.
  13. ^ Смарт, Джон Фергюсон (2008). Java Power Tools. "O'Reilly Media, Inc.". стр. 301. ISBN 9781491954546. Получено 26 июля 2018 г.
  14. ^ ab (однако речь идет только об ООП). Методы рефакторинга на сайте рефакторинга Фаулера
  15. ^ Ферранте, Жанна; Оттенштейн, Карл Дж.; Уоррен, Джо Д. (июль 1987 г.). «Граф зависимости программ и его использование в оптимизации». Труды ACM по языкам и системам программирования . 9 (3). ACM: 319–349. doi : 10.1145/24039.24041 . S2CID  505075.
  16. ^ Donglin, Linag; Harrold, MJ (ноябрь 2008 г.). "Нарезка объектов с использованием графов зависимости системы". Труды Международной конференции по обслуживанию программного обеспечения (Кат. № 98CB36272) . IEEE. стр. 319–349. doi :10.1109/ICSM.1998.738527. ISBN 978-0-8186-8779-2. S2CID  18160599.
  17. ^ «Заменить код проверки типа на Состояние/Стратегию».
  18. ^ «Заменить условное выражение полиморфизмом».
  19. ^ Bruntink, M.; van Deursen, A.; Tourwe, T.; van Engelen, R. (2004). «Оценка методов обнаружения клонов для сквозных проблем». Труды 20-й Международной конференции IEEE по обслуживанию программного обеспечения . IEEE. doi :10.1109/ICSM.2004.1357804.
  20. ^ Языки описания оборудования#HDL и языки программирования
  21. ^ Кайпинг Цзэн, Сорин А. Хасс, «Усовершенствования архитектуры путем рефакторинга кода поведенческих моделей VHDL-AMS». ISCAS 2006
  22. ^ М. Китинг: «Сложность, абстракция и проблемы проектирования сложных систем», в учебнике DAC'08 [1] Архивировано 28.03.2016 на Wayback Machine «Преодоление пробела в верификации: от C++ к RTL для практического проектирования»
  23. ^ М. Китинг, П. Брико: Руководство по методологии повторного использования для проектов систем на кристалле , Kluwer Academic Publishers, 1999.
  24. ^ Опдайк, Уильям Ф .; Джонсон, Ральф Э. (сентябрь 1990 г.). «Рефакторинг: помощь в проектировании фреймворков приложений и развитии объектно-ориентированных систем». Труды симпозиума по объектно-ориентированному программированию с упором на практические приложения (SOOPPA) . ACM.
  25. ^ Грисволд, Уильям Г. (июль 1991 г.). Реструктуризация программ как средство поддержки программного обеспечения (PDF) (диссертация). Вашингтонский университет . Получено 24.12.2011 .
  26. ^ Opdyke, William F (июнь 1992 г.). Рефакторинг объектно-ориентированных фреймворков (диссертация на степень доктора философии). Иллинойсский университет в Урбане-Шампейне. Архивировано из оригинала 16.12.2019 . Получено 12.02.2008 .{{cite thesis}}: CS1 maint: бот: исходный статус URL неизвестен ( ссылка )
  27. ^ "Мартин Фаулер, "MF Bliki: ЭтимологияРефакторинга"".
  28. ^ Броди, Лео (2004). Thinking Forth. Fig Leaf Press, Forth Interest. С. 171–196. ISBN 0-9764587-0-5. Архивировано из оригинала 16 декабря 2005 . Получено 3 мая 2020 .
  29. ^ Соколов, Андрей. «Что такое рефакторинг кода?».
  30. ^ «Что нового в Xcode 9».
  31. ^ «Обзор | Документация Qt Creator».

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

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