Jump to content

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

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

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

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

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

Мотивация

[ редактировать ]

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

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

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

[ редактировать ]

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

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

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

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

[ редактировать ]

Есть два возможных варианта рефакторинга.

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

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

Проблемы

[ редактировать ]

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

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

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

[ редактировать ]

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

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

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

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

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

[ редактировать ]

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

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

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

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

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

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

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

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

[ редактировать ]

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

См. также

[ редактировать ]
  1. ^ Jump up to: а б Кериевский, Джошуа (2004). Рефакторинг в шаблоны . Эддисон Уэсли.
  2. ^ Jump up to: а б Фаулер, Мартин (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. ^ Jump up to: а б с Фрайверт, Дов; Лоренц, Дэвид Х. (2022). «Языковая поддержка для предотвращения распада рефакторингов». Материалы 21-й Международной конференции ACM SIGPLAN по генеративному программированию: концепции и опыт : 122–134. дои : 10.1145/3564719.3568688 .
  7. ^ Хендлер, Торстен; Нойманн, Густав (2019). «Схема оценки и обучения компетенций в области рефакторинга программного обеспечения». Материалы 11-й Международной совместной конференции по открытию знаний, инженерии знаний и управлению знаниями . стр. 307–316. дои : 10.5220/0008350803070316 . ISBN  978-989-758-382-7 . S2CID   204754665 .
  8. ^ Нассиф, Матье; Робиллард, Мартин П. (ноябрь 2017 г.). «Возвращение к потере знаний, вызванной текучестью кадров, в проектах по разработке программного обеспечения». Международная конференция IEEE по сопровождению и развитию программного обеспечения (ICSME) , 2017 г. стр. 261–272. дои : 10.1109/ICSME.2017.64 . ISBN  978-1-5386-0992-7 . S2CID   13147063 .
  9. ^ ван Гурп, Джиллес; Бош, Ян (март 2002 г.). «Эрозия дизайна: проблемы и причины». Журнал систем и программного обеспечения . 61 (2): 105–119. дои : 10.1016/S0164-1212(01)00152-2 .
  10. ^ Хасан, Ахмед Э.; Се, Тао (ноябрь 2010 г.). «Программный интеллект: будущее разработки программного обеспечения для добычи данных». В материалах семинара FSE/SDP по будущему исследований в области разработки программного обеспечения (FoSER '10) : 161–166. дои : 10.1145/1882362.1882397 . S2CID   3485526 .
  11. ^ Новаис, Ренато; Сантос, Хосе Амансио; Мендонса, Маноэль (2017). «Экспериментальная оценка комбинации нескольких стратегий визуализации для анализа эволюции программного обеспечения». Журнал систем и программного обеспечения . 128 : 56–71. дои : 10.1016/j.jss.2017.03.006 .
  12. ^ Фаулер, Мартин (1999). Рефакторинг: улучшение дизайна существующего кода . Ридинг, Массачусетс: Аддисон-Уэсли. ISBN  978-0201485677 . OCLC   41017370 .
  13. ^ Смарт, Джон Фергюсон (2008). Электроинструменты Java . «О'Рейли Медиа, Инк.». п. 301. ИСБН  9781491954546 . Проверено 26 июля 2018 г.
  14. ^ Jump up to: а б (однако речь идет только об ООП). Методы рефакторинга на веб-сайте рефакторинга Фаулера
  15. ^ Ферранте, Жанна; Оттенштейн, Карл Дж.; Уоррен, Джо Д. (июль 1987 г.). «Граф зависимости программы и его использование в оптимизации» . Транзакции ACM в языках и системах программирования . 9 (3). АКМ: 319–349. дои : 10.1145/24039.24041 . S2CID   505075 .
  16. ^ Донглин, Линаг; Харролд, MJ (ноябрь 2008 г.). «Нарезка объектов с использованием графов системных зависимостей». Слушания. Международная конференция по сопровождению программного обеспечения (кат. № 98CB36272) . IEEE. стр. 319–349. дои : 10.1109/ICSM.1998.738527 . ISBN  978-0-8186-8779-2 . S2CID   18160599 .
  17. ^ «Замените код проверки типа на Состояние/Стратегию» .
  18. ^ «Замените условное выражение полиморфизмом» .
  19. ^ Брунтинк, Магил и др. « Оценка методов обнаружения клонов для решения сквозных проблем ». Обслуживание программного обеспечения, 2004. Труды. 20-я Международная конференция IEEE. ИИЭР, 2004.
  20. ^ Языки описания оборудования#HDL и языки программирования
  21. ^ Кайпин Цзэн, Сорин А. Хасс, «Усовершенствование архитектуры путем рефакторинга кода поведенческих моделей VHDL-AMS». ИСКАС 2006 г.
  22. ^ М. Китинг: «Сложность, абстракция и проблемы проектирования сложных систем», в учебнике DAC'08 [1]. Архивировано 28 марта 2016 г. на Wayback Machine «Преодоление пробела в проверке: от C ++ до RTL для практического проектирования».
  23. ^ М. Китинг, П. Брико: Руководство по методологии повторного использования для проектирования систем на кристалле , Kluwer Academic Publishers, 1999.
  24. ^ Опдайк, Уильям Ф .; Джонсон, Ральф Э. (сентябрь 1990 г.). «Рефакторинг: помощь в проектировании инфраструктур приложений и развитии объектно-ориентированных систем». Материалы симпозиума по объектно-ориентированному программированию с упором на практические приложения (SOOPPA) . АКМ.
  25. ^ Грисволд, Уильям Дж . (июль 1991 г.). Реструктуризация программы как помощь в обслуживании программного обеспечения (PDF) (кандидатская диссертация). Университет Вашингтона . Проверено 24 декабря 2011 г.
  26. ^ Опдайк, Уильям Ф. (июнь 1992 г.). Рефакторинг объектно-ориентированных фреймворков (кандидатская диссертация). Университет Иллинойса в Урбана-Шампейн. Архивировано из оригинала 16 декабря 2019 г. Проверено 12 февраля 2008 г. {{cite thesis}}: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
  27. ^ «Мартин Фаулер, «МФ Блики: Этимология рефакторинга» » .
  28. ^ Броди, Лео (2004). Мышление вперед . Fig Leaf Press, Форт Интерес. стр. 171–196. ISBN  0-9764587-0-5 . Архивировано из оригинала 16 декабря 2005 года . Проверено 3 мая 2020 г.
  29. ^ Соколов Андрей. «Что такое рефакторинг кода?» .
  30. ^ «Что нового в Xcode 9» .
  31. ^ «Рефакторинг в Qt Creator» .

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

[ редактировать ]
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 725bb5bcd25614dbaa2630a9aafb04ce__1719770820
URL1:https://arc.ask3.ru/arc/aa/72/ce/725bb5bcd25614dbaa2630a9aafb04ce.html
Заголовок, (Title) документа по адресу, URL1:
Code refactoring - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)