Рефакторинг кода
В компьютерном программировании и проектировании программного обеспечения рефакторинг кода — это процесс реструктуризации существующего исходного кода (изменение факторинга ) без изменения его внешнего поведения. Рефакторинг предназначен для улучшения дизайна, структуры и/или реализации программного обеспечения (его нефункциональных атрибутов) при сохранении его функциональности . Потенциальные преимущества рефакторинга могут включать улучшенную читаемость кода и снижение сложности ; они могут улучшить кода и исходного удобство сопровождения создать более простую, чистую или более выразительную внутреннюю архитектуру или объектную модель для улучшения расширяемости . Другая потенциальная цель рефакторинга — повышение производительности; Инженеры-программисты сталкиваются с постоянной проблемой написания программ, которые работают быстрее или используют меньше памяти.
Обычно при рефакторинге применяется серия стандартизированных базовых микрорефакторингов , каждый из которых (обычно) представляет собой небольшое изменение в исходном коде компьютерной программы, которое либо сохраняет поведение программного обеспечения, либо, по крайней мере, не изменяет его соответствие функциональным требованиям. Многие среды разработки предоставляют автоматизированную поддержку выполнения механических аспектов базового рефакторинга. Если все сделано правильно, рефакторинг кода может помочь разработчикам программного обеспечения обнаружить и исправить скрытые или латентные ошибки или уязвимости в системе за счет упрощения базовой логики и устранения ненужных уровней сложности. Если все сделано плохо, это может не выполнить требование о неизменности внешней функциональности и, таким образом, может привести к появлению новых ошибок.
Постоянно совершенствуя дизайн кода, мы делаем работу с ним все проще и проще. Это резко контрастирует с тем, что обычно происходит: небольшой рефакторинг и большое внимание уделяется целесообразному добавлению новых функций. Если вы выработаете гигиеничную привычку непрерывного рефакторинга, вы обнаружите, что расширять и поддерживать код стало проще.
— Джошуа Кериевски, Рефакторинг с использованием шаблонов [1]
Мотивация
[ редактировать ]Рефакторинг обычно мотивируется обнаружением запаха кода . [2] Например, рассматриваемый метод может быть очень длинным или быть почти дубликатом другого близлежащего метода. После обнаружения такие проблемы можно решить путем рефакторинга исходного кода или преобразования его в новую форму, которая ведет себя так же, как и раньше, но больше не «пахнет».
Для длинной процедуры можно выделить одну или несколько подпрограмм меньшего размера; или в случае дублирующихся процедур дублирование можно удалить и заменить одной общей функцией. Невыполнение рефакторинга может привести к накоплению технического долга ; с другой стороны, рефакторинг — один из основных способов погашения технического долга. [3]
Преимущества
[ редактировать ]Есть две основные категории преимуществ рефакторинга.
- Ремонтопригодность . Исправлять ошибки легче, поскольку исходный код легко читается и легко понять намерения его автора. [4] Этого можно достичь, сведя большие монолитные процедуры к набору индивидуально кратких, хорошо названных и одноцелевых методов. Этого можно достичь, переместив метод в более подходящий класс или удалив вводящие в заблуждение комментарии.
- Расширяемость . Возможности приложения легче расширить, если оно использует узнаваемые шаблоны проектирования и обеспечивает некоторую гибкость там, где раньше ее не существовало. [1]
Проектирование производительности может устранить неэффективность программ, известную как раздувание программного обеспечения, возникающую из-за традиционных стратегий разработки программного обеспечения, целью которых является минимизация времени разработки приложения, а не времени, необходимого для его запуска. Проектирование производительности также может адаптировать программное обеспечение к аппаратному обеспечению, на котором оно работает, например, чтобы использовать преимущества параллельных процессоров и векторных модулей. [5]
Сроки и ответственность
[ редактировать ]Существует два возможных варианта рефакторинга.
- Превентивный рефакторинг — первоначальный разработчик кода делает код более надежным, когда в нем еще нет запахов , чтобы предотвратить образование запахов в будущем. [6]
- Корректирующий рефакторинг — последующий разработчик выполняет рефакторинг, чтобы исправить запахи кода по мере их возникновения. [6]
Метод, который сочетает в себе профилактический и корректирующий рефакторинг, - это «общая ответственность за рефакторинг». Этот подход разбивает действие рефакторинга на два этапа и два этапа. роли. Первоначальный разработчик кода просто готовит код к рефакторингу, а когда код обретает форму, последующий разработчик выполняет фактическое действие по рефакторингу. [6]
Проблемы
[ редактировать ]Рефакторинг требует извлечения структуры программной системы, моделей данных и зависимостей внутри приложения, чтобы получить обратно знания о существующей программной системе. [7] Смена команд подразумевает отсутствие или неточное знание текущего состояния системы и проектных решений, принятых уходящими разработчиками. Дальнейшие действия по рефакторингу кода могут потребовать дополнительных усилий для восстановления этих знаний. [8] Действия по рефакторингу приводят к архитектурным изменениям, которые ухудшают структурную архитектуру программной системы. Такое ухудшение влияет на архитектурные свойства, такие как удобство сопровождения и понятность, что может привести к полной переработке программных систем. [9]
Действия по рефакторингу кода обеспечиваются программным интеллектом при использовании инструментов и методов, предоставляющих данные об алгоритмах и последовательностях выполнения кода. [10] Предоставление понятного формата внутреннего состояния структуры программной системы, моделей данных и внутрикомпонентных зависимостей является критически важным элементом для формирования высокого уровня понимания, а затем уточнения представлений о том, что и как необходимо изменить. [11]
Тестирование
[ редактировать ]автоматические модульные тесты , чтобы гарантировать, что подпрограммы по-прежнему ведут себя должным образом. Перед рефакторингом следует настроить [12] Модульные тесты могут обеспечить стабильность даже крупных рефакторингов, если они выполняются с помощью одного атомарного коммита . Общая стратегия, позволяющая проводить безопасные и атомарные рефакторинги, охватывающие несколько проектов, заключается в хранении всех проектов в одном репозитории , известном как монорепо . [13]
При наличии модульного тестирования рефакторинг представляет собой итерационный цикл выполнения небольшого преобразования программы , его проверки на корректность и выполнения еще одного небольшого преобразования. Если в какой-то момент тест не пройден, последнее небольшое изменение отменяется и повторяется другим способом. С помощью множества маленьких шагов программа движется от того места, где она была, туда, где вы хотите. Чтобы этот итеративный процесс был практичным, тесты должны выполняться очень быстро, иначе программисту придется тратить значительную часть своего времени на ожидание завершения тестов. Сторонники экстремального программирования и другой гибкой разработки программного обеспечения описывают эту деятельность как неотъемлемую часть цикла разработки программного обеспечения .
Техники
[ редактировать ]Вот несколько примеров микрорефакторинга; некоторые из них могут применяться только к определенным языкам или типам языков. Более длинный список можно найти в Мартина Фаулера по рефакторингу. книге [2] [ нужна страница ] и веб-сайт. [14] Многие среды разработки обеспечивают автоматическую поддержку этих микрорефакторингов. Например, программист может щелкнуть имя переменной, а затем выбрать рефакторинг «Инкапсулировать поле» из контекстного меню . Затем IDE запросит дополнительную информацию, обычно с разумными значениями по умолчанию и предварительным просмотром изменений кода. После подтверждения программистом он внесет необходимые изменения во весь код.
- Техники, которые позволяют лучше понять
- График зависимости программы — явное представление зависимостей данных и элементов управления. [15]
- График системных зависимостей — представление вызовов процедур между PDG [16]
- Интеллект программного обеспечения — реконструирует исходное состояние, чтобы понять существующие зависимости внутри приложения.
- Методы, позволяющие добиться большей абстракции
- Инкапсулировать поле — заставить код получить доступ к полю с помощью методов получения и установки.
- Обобщить тип — создавайте более общие типы, чтобы обеспечить более широкое совместное использование кода.
- Замените код проверки типов на состояние/стратегию. [17]
- Замените условное выражение полиморфизмом [18]
- Методы разбиения кода на более логичные части
- Компонентизация разбивает код на повторно используемые семантические единицы, которые предоставляют ясные, четко определенные и простые в использовании интерфейсы.
- Извлечение класса перемещает часть кода из существующего класса в новый класс.
- Извлечь метод, чтобы превратить часть более крупного метода в новый метод. Разбивая код на более мелкие части, его становится легче понять. Это также применимо к функциям .
- Методы улучшения названий и расположения кода
- Переместить метод или переместить поле — перейти к более подходящему классу или исходному файлу.
- Переименовать метод или переименовать поле – изменение имени на новое, которое лучше раскрывает его назначение.
- Поднимитесь – в объектно-ориентированном программировании (ООП) перейдите в суперкласс.
- Нажать вниз – в ООП перейти в подкласс [14]
- Автоматическое обнаружение клонов [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.
Автоматический рефакторинг кода
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( июль 2018 г. ) |
Многие редакторы программного обеспечения и IDE имеют поддержку автоматического рефакторинга. Вот список некоторых из этих редакторов или так называемых рефакторинговых браузеров .
- Набор инструментов для реинжиниринга программного обеспечения DMS (реализует крупномасштабный рефакторинг для C, C++, C#, COBOL, Java, PHP и других языков)
- На основе затмения:
- Eclipse (для Java и, в меньшей степени, C++, PHP, Ruby и JavaScript)
- PyDev (для Python )
- Photran ( плагин Fortran для Eclipse IDE )
- Эмбаркадеро Дельфи
- На базе IntelliJ:
- Решарпер (для C# )
- AppCode (для Objective-C , C и C++)
- IntelliJ IDEA (для Java )
- PyCharm (для Python )
- WebStorm (для JavaScript )
- PhpStorm (для PHP )
- Android Studio (для Java и C++)
- JDeveloper (для Java )
- NetBeans (для Java )
- Smalltalk : Большинство диалектов включают в себя мощные инструменты рефакторинга. Многие используют оригинальный браузер рефакторинга, созданный в начале 90-х годов Ральфом Джонсоном .
- На основе Visual Studio:
- Visual Studio (для .NET и C++)
- Visual Assist (надстройка для Visual Studio с поддержкой рефакторинга для C# и C++)
- Wing IDE (для Python )
- Xcode (для C, Objective-C и Swift ) [30]
- Qt Creator (для C++, Objective-C и QML) [31]
См. также
[ редактировать ]- Схема мелиорации
- Обзор кода
- Рефакторинг базы данных
- Декомпозиция (информатика)
- Модульное программирование
- Запутанный код
- Префакторинг
- Переписать (программирование)
- Разделение интересов
- Экспертная оценка программного обеспечения
- Разработка через тестирование
Ссылки
[ редактировать ]- ^ Перейти обратно: а б Кериевский, Джошуа (2004). Рефакторинг в шаблоны . Эддисон Уэсли.
- ^ Перейти обратно: а б Фаулер, Мартин (1999). Рефакторинг. Улучшение дизайна существующего кода . Аддисон-Уэсли. стр. 63 и далее . ISBN 978-0-201-48567-7 .
- ^ Сурьянараяна, Гириш (ноябрь 2014 г.). Рефакторинг для запахов проектирования программного обеспечения . Морган Кауфманн. п. 258. ИСБН 978-0128013977 .
- ^ Мартин, Роберт (2009). Чистый код . Прентис Холл.
- ^ Лейзерсон, Чарльз Э.; Томпсон, Нил К.; Эмер, Джоэл С.; Кушмаул, Брэдли С.; Лэмпсон, Батлер В.; Санчес, Дэниел; Шардл, Тао Б. (2020). «Наверху достаточно места: что будет влиять на производительность компьютера после закона Мура?» . Наука . 368 (6495): eaam9744. дои : 10.1126/science.aam9744 . ПМИД 32499413 .
- ^ Перейти обратно: а б с Фрайвер, Дов; Лоренц, Дэвид Х. (2022). «Языковая поддержка для предотвращения распада рефакторингов». Материалы 21-й Международной конференции ACM SIGPLAN по генеративному программированию: концепции и опыт : 122–134. дои : 10.1145/3564719.3568688 .
- ^ Хендлер, Торстен; Нойманн, Густав (2019). «Схема оценки и обучения компетенций в области рефакторинга программного обеспечения». Материалы 11-й Международной совместной конференции по открытию знаний, инженерии знаний и управлению знаниями . стр. 307–316. дои : 10.5220/0008350803070316 . ISBN 978-989-758-382-7 . S2CID 204754665 .
- ^ Нассиф, Матье; Робиллард, Мартин П. (ноябрь 2017 г.). «Возвращение к потере знаний, вызванной текучестью кадров, в проектах по разработке программного обеспечения». Международная конференция IEEE по сопровождению и развитию программного обеспечения (ICSME) , 2017 г. стр. 261–272. дои : 10.1109/ICSME.2017.64 . ISBN 978-1-5386-0992-7 . S2CID 13147063 .
- ^ ван Гурп, Джиллес; Бош, Ян (март 2002 г.). «Эрозия дизайна: проблемы и причины». Журнал систем и программного обеспечения . 61 (2): 105–119. дои : 10.1016/S0164-1212(01)00152-2 .
- ^ Хасан, Ахмед Э.; Се, Тао (ноябрь 2010 г.). «Программный интеллект: будущее разработки программного обеспечения для добычи данных». В материалах семинара FSE/SDP по будущему исследований в области разработки программного обеспечения (FoSER '10) : 161–166. дои : 10.1145/1882362.1882397 . S2CID 3485526 .
- ^ Новаис, Ренато; Сантос, Хосе Амансио; Мендонса, Маноэль (2017). «Экспериментальная оценка комбинации нескольких стратегий визуализации для анализа эволюции программного обеспечения». Журнал систем и программного обеспечения . 128 : 56–71. дои : 10.1016/j.jss.2017.03.006 .
- ^ Фаулер, Мартин (1999). Рефакторинг: улучшение дизайна существующего кода . Ридинг, Массачусетс: Аддисон-Уэсли. ISBN 978-0201485677 . OCLC 41017370 .
- ^ Смарт, Джон Фергюсон (2008). Электроинструменты Java . «О'Рейли Медиа, Инк.». п. 301. ИСБН 9781491954546 . Проверено 26 июля 2018 г.
- ^ Перейти обратно: а б (однако речь идет только об ООП). Методы рефакторинга на веб-сайте рефакторинга Фаулера
- ^ Ферранте, Жанна; Оттенштейн, Карл Дж.; Уоррен, Джо Д. (июль 1987 г.). «Граф зависимости программы и его использование в оптимизации» . Транзакции ACM в языках и системах программирования . 9 (3). АКМ: 319–349. дои : 10.1145/24039.24041 . S2CID 505075 .
- ^ Донглин, Линаг; Харролд, MJ (ноябрь 2008 г.). «Нарезка объектов с использованием графов системных зависимостей». Слушания. Международная конференция по сопровождению программного обеспечения (кат. № 98CB36272) . IEEE. стр. 319–349. дои : 10.1109/ICSM.1998.738527 . ISBN 978-0-8186-8779-2 . S2CID 18160599 .
- ^ «Замените код проверки типа на Состояние/Стратегию» .
- ^ «Замените условное выражение полиморфизмом» .
- ^ Брунтинк, Магил и др. « Оценка методов обнаружения клонов для решения сквозных проблем ». Обслуживание программного обеспечения, 2004. Труды. 20-я Международная конференция IEEE. ИИЭР, 2004.
- ^ Языки описания оборудования#HDL и языки программирования
- ^ Кайпин Цзэн, Сорин А. Хасс, «Усовершенствование архитектуры путем рефакторинга кода поведенческих моделей VHDL-AMS». ИСКАС 2006 г.
- ^ М. Китинг: «Сложность, абстракция и проблемы проектирования сложных систем», в учебнике DAC'08 [1]. Архивировано 28 марта 2016 г. на Wayback Machine «Преодоление пробела в проверке: от C ++ до RTL для практического проектирования».
- ^ М. Китинг, П. Брико: Руководство по методологии повторного использования для проектирования систем на кристалле , Kluwer Academic Publishers, 1999.
- ^ Опдайк, Уильям Ф .; Джонсон, Ральф Э. (сентябрь 1990 г.). «Рефакторинг: помощь в проектировании инфраструктур приложений и развитии объектно-ориентированных систем». Материалы симпозиума по объектно-ориентированному программированию с упором на практические приложения (SOOPPA) . АКМ.
- ^ Грисволд, Уильям Дж . (июль 1991 г.). Реструктуризация программы как помощь в обслуживании программного обеспечения (PDF) (кандидатская диссертация). Университет Вашингтона . Проверено 24 декабря 2011 г.
- ^ Опдайк, Уильям Ф. (июнь 1992 г.). Рефакторинг объектно-ориентированных фреймворков (кандидатская диссертация). Университет Иллинойса в Урбана-Шампейн. Архивировано из оригинала 16 декабря 2019 г. Проверено 12 февраля 2008 г.
{{cite thesis}}
: CS1 maint: bot: исходный статус URL неизвестен ( ссылка ) - ^ «Мартин Фаулер, «MF Glitter: этимология рефакторинга» » .
- ^ Броди, Лео (2004). Мышление вперед . Fig Leaf Press, Форт Интерес. стр. 171–196. ISBN 0-9764587-0-5 . Архивировано из оригинала 16 декабря 2005 года . Проверено 3 мая 2020 г.
- ^ Соколов Андрей. «Что такое рефакторинг кода?» .
- ^ «Что нового в Xcode 9» .
- ^ «Рефакторинг в Qt Creator» .
Дальнейшее чтение
[ редактировать ]- Уэйк, Уильям К. (2003). Рабочая тетрадь по рефакторингу . Аддисон-Уэсли. ISBN 978-0-321-10929-3 .
- Менс, Т.; Турве, Т. (февраль 2004 г.). «Обзор рефакторинга программного обеспечения» . Транзакции IEEE по разработке программного обеспечения . 30 (2): 126–139. дои : 10.1109/tse.2004.1265817 . ISSN 0098-5589 . S2CID 206778272 .
- Перья, Майкл С. (2004). Эффективная работа с устаревшим кодом . Прентис Холл. ISBN 978-0-13-117705-5 .
- Кериевский, Джошуа (2004). Рефакторинг в шаблоны . Аддисон-Уэсли. ISBN 978-0-321-21335-8 .
- Арсеновский, Даниэль (2008). Профессиональный рефакторинг в Visual Basic . Врокс. ISBN 978-0-470-17979-6 .
- Арсеновский, Даниэль (2009). Профессиональный рефакторинг в C# и ASP.NET . Врокс. ISBN 978-0-470-43452-9 .
- Ричи, Питер (2010). Рефакторинг с помощью Visual Studio 2010 . Пакет. ISBN 978-1-84968-010-3 .
Внешние ссылки
[ редактировать ]- Что такое рефакторинг? (статья на c2.com)
- Домашняя страница Мартина Фаулера о рефакторинге
- Рефакторинг в Curlie