stringtranslate.com

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

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

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

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

-  Джошуа Кериевский, Рефакторинг с использованием шаблонов [1]

Мотивация

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

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

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

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

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

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

Проблемы

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

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

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

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

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

Техники

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

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

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

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

История

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

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

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

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

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

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

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

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

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

  1. ^ Аб Кериевский, Джошуа (2004). Рефакторинг в шаблоны . Эддисон Уэсли.
  2. ^ аб Фаулер, Мартин (1999). Рефакторинг. Улучшение дизайна существующего кода. Аддисон-Уэсли. стр. 63 и далее. ISBN 978-0-201-48567-7.
  3. ^ Сурьянараяна, Гириш (ноябрь 2014 г.). Рефакторинг для запахов проектирования программного обеспечения . Морган Кауфманн. п. 258. ИСБН 978-0128013977.
  4. ^ Мартин, Роберт (2009). Чистый код . Прентис Холл.
  5. ^ Лейзерсон, Чарльз Э.; Томпсон, Нил К.; Эмер, Джоэл С.; Кушмаул, Брэдли С.; Лэмпсон, Батлер В.; Санчес, Дэниел; Шардл, Тао Б. (2020). «Наверху много места: что будет влиять на производительность компьютера после закона Мура?». Наука . 368 (6495): eaam9744. дои : 10.1126/science.aam9744 . ПМИД  32499413.
  6. ^ Хендлер, Торстен; Нойманн, Густав (2019). «Схема оценки и обучения компетенций в области рефакторинга программного обеспечения». Материалы 11-й Международной совместной конференции по открытию знаний, инженерии знаний и управлению знаниями . стр. 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. ^ Хасан, Ахмед Э.; Се, Тао (ноябрь 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. ^ Фаулер, Мартин (1999). Рефакторинг: улучшение дизайна существующего кода. Ридинг, Массачусетс: Аддисон-Уэсли. ISBN 978-0201485677. ОСЛК  41017370.
  12. ^ Смарт, Джон Фергюсон (2008). Электроинструменты Java. «О'Рейли Медиа, Инк.». п. 301. ИСБН 9781491954546. Проверено 26 июля 2018 г.
  13. ^ ab (однако это касается только ООП). Методы рефакторинга на веб-сайте рефакторинга Фаулера.
  14. ^ Ферранте, Жанна; Оттенштейн, Карл Дж.; Уоррен, Джо Д. (июль 1987 г.). «Граф зависимости программы и его использование в оптимизации». Транзакции ACM в языках и системах программирования . АКМ. 9 (3): 319–349. дои : 10.1145/24039.24041 . S2CID  505075.
  15. ^ Донглин, Линаг; Харролд, MJ (ноябрь 2008 г.). «Нарезка объектов с использованием графов системных зависимостей». Слушания. Международная конференция по сопровождению программного обеспечения (кат. № 98CB36272) . IEEE. стр. 319–349. дои : 10.1109/ICSM.1998.738527. ISBN 978-0-8186-8779-2. S2CID  18160599.
  16. ^ «Замените код проверки типов на состояние/стратегию» .
  17. ^ «Замените условное выражение полиморфизмом» .
  18. ^ Брунтинк, Магил и др. «Оценка методов обнаружения клонов для решения сквозных проблем». Обслуживание программного обеспечения, 2004. Труды. 20-я Международная конференция IEEE. ИИЭР, 2004.
  19. ^ Языки описания оборудования#HDL и языки программирования
  20. ^ Кайпин Цзэн, Сорин А. Хасс, «Усовершенствование архитектуры путем рефакторинга кода поведенческих моделей VHDL-AMS». ИСКАС 2006 г.
  21. ^ М. Китинг: «Сложность, абстракция и проблемы проектирования сложных систем», в учебнике DAC'08 [1]. Архивировано 28 марта 2016 г. на Wayback Machine «Преодоление пробела в проверке: от C ++ до RTL для практического проектирования».
  22. ^ М. Китинг, П. Брико: Руководство по методологии повторного использования для проектирования систем на кристалле , Kluwer Academic Publishers, 1999.
  23. ^ Опдайк, Уильям Ф .; Джонсон, Ральф Э. (сентябрь 1990 г.). «Рефакторинг: помощь в проектировании инфраструктур приложений и развитии объектно-ориентированных систем». Материалы симпозиума по объектно-ориентированному программированию с упором на практические приложения (SOOPPA) . АКМ.
  24. ^ аб Грисволд, Уильям Дж. (июль 1991 г.). Реструктуризация программы как помощь в обслуживании программного обеспечения (PDF) (кандидатская диссертация). Университет Вашингтона . Проверено 24 декабря 2011 г.
  25. ^ аб Опдайк, Уильям Ф. (июнь 1992 г.). Рефакторинг объектно-ориентированных фреймворков (кандидатская диссертация). Университет Иллинойса в Урбана-Шампейн. Архивировано из оригинала 16 декабря 2019 г. Проверено 12 февраля 2008 г.{{cite thesis}}: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
  26. ^ ab «Мартин Фаулер, «MF Bliki: EtymologyOfRefactoring»».
  27. ^ Броди, Лео (2004). Мышление вперед. Fig Leaf Press, Форт Интерес. стр. 171–196. ISBN 0-9764587-0-5. Архивировано из оригинала 16 декабря 2005 года . Проверено 3 мая 2020 г.
  28. ^ Соколов, Андрей. «Что такое рефакторинг кода?».
  29. ^ «Что нового в Xcode 9» .
  30. ^ «Рефакторинг в Qt Creator».

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

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