Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

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

Мотивация [ править ]

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

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

Преимущества [ править ]

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

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

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

Проблемы [ править ]

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

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

Тестирование [ править ]

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

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

Методы [ править ]

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

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

Аппаратный рефакторинг [ править ]

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

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

История [ править ]

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

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


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

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

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

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

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

  • DMS Software Reengineering Toolkit (реализует крупномасштабный рефакторинг для C, C ++, C #, COBOL, Java, PHP и других языков)
  • На основе Eclipse:
    • Eclipse (для Java и, в меньшей степени, C ++, PHP, Ruby и JavaScript)
    • PyDev (для Python )
    • Photran ( плагин Fortran для Eclipse IDE )
  • Embarcadero Delphi
  • На основе IntelliJ:
    • Resharper (для C # )
    • AppCode (для Objective-C , C и C ++)
    • IntelliJ IDEA (для Java )
    • PyCharm (для Python )
    • WebStorm (для JavaScript )
    • PhpStorm (для PHP )
    • Android Studio (для Java )
  • JDeveloper (для Java )
  • NetBeans (для Java )
  • Smalltalk : большинство диалектов включает мощные инструменты рефакторинга. Многие используют оригинальный браузер с рефакторингом, созданный в начале 90-х Ральфом Джонсоном .
  • На основе Visual Studio:
    • Visual Studio (для .NET и C ++)
    • CodeRush (надстройка для Visual Studio)
    • Visual Assist (надстройка для Visual Studio с поддержкой рефакторинга для C # и C ++)
  • Wing IDE (для Python )
  • Xcode (для C, Objective-C и Swift ) [30]
  • Qt Creator (для C ++, Objective-C и QML) [31]

См. Также [ править ]

  • Образец мелиорации
  • Обзор кода
  • Рефакторинг базы данных
  • Декомпозиция (информатика)
  • Модульное программирование
  • Обфусцированный код
  • Префакторинг
  • Разделение проблем
  • Экспертная оценка программного обеспечения
  • Разработка через тестирование

Ссылки [ править ]

  1. ^ a b Кериевский, Джошуа (2004). Рефакторинг под паттерны . Эддисон Уэсли.
  2. ^ a b c Фаулер, Мартин (1999). Рефакторинг. Улучшение дизайна существующего кода . Эддисон-Уэсли. стр.  63 и далее . ISBN 978-0-201-48567-7.
  3. ^ Suryanarayana, Гириш (ноябрь 2014). Рефакторинг для разработки программного обеспечения . Морган Кауфманн. п. 258. ISBN 978-0128013977.
  4. ^ Мартин, Роберт (2009). Чистый код . Прентис Холл.
  5. ^ Leiserson, Чарльз Э .; Томпсон, Нил С .; Emer, Joel S .; Kuszmaul, Bradley C .; Лэмпсон, Батлер У .; Санчес, Даниэль; Шардл, Тао Б. (2020). «Вверху есть много места: что будет стимулировать производительность компьютеров после закона Мура?» . Наука . 368 (6495): eaam9744. DOI : 10.1126 / science.aam9744 . PMID 32499413 . 
  6. ^ Хендлер, Торстен; Нойман, Густав (2019). «Структура для оценки и обучения компетенций в области рефакторинга программного обеспечения» . Proc. 11-й Международной конференции по управлению знаниями и информационным системам (KMIS). : 307–316. DOI : 10.5220 / 0008350803070316 . ISBN 978-989-758-382-7. S2CID  204754665 .
  7. ^ Нассиф, Матье; Робиллард, Мартин П. (ноябрь 2017 г.). «Возвращение к потере знаний, вызванной текучестью в программных проектах». Международная конференция IEEE по сопровождению и развитию программного обеспечения (ICSME) 2017: 261–272. DOI : 10.1109 / ICSME.2017.64 . ISBN 978-1-5386-0992-7. S2CID  13147063 .
  8. ^ ван Гурп, Джиллес; Bosch, январь (март 2002 г.). «Эрозия дизайна: проблемы и причины». Журнал систем и программного обеспечения . 61 (2): 105–119. DOI : 10.1016 / S0164-1212 (01) 00152-2 .
  9. ^ Хасан, Ахмед Э .; Се, Тао (ноябрь 2010 г.). «Программный интеллект: будущее разработки программного обеспечения для добычи данных». В материалах семинара FSE / SDP о будущем исследований в области программной инженерии (FoSER '10) : 161–166. DOI : 10.1145 / 1882362.1882397 . S2CID 3485526 . 
  10. ^ Новаис, Ренато; Сантос, Хосе Амансио; Мендонса, Маноэль (2017). «Экспериментальная оценка комбинации нескольких стратегий визуализации для анализа эволюции программного обеспечения». Журнал систем и программного обеспечения . 128 : 56–71. DOI : 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. ^ a b (однако это касается только ООП). Методы рефакторинга на сайте рефакторинга Фаулера
  14. ^ Ферранте, Жанна; Оттенштейн, Карл Дж .; Уоррен, Джо Д. (июль 1987 г.). «График зависимости программы и его использование в оптимизации». Транзакции ACM по языкам и системам программирования . ACM. 9 (3): 319–349. DOI : 10.1145 / 24039.24041 . S2CID 505075 . 
  15. ^ Донглин, Линаг; Харролд, MJ (ноябрь 2008 г.). «Нарезка объектов по системным графам зависимостей». Ход работы. Международная конференция по сопровождению программного обеспечения . IEEE: 319–349. DOI : 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. ^ Опдайк, Уильям Ф .; Джонсон, Ральф Э. (сентябрь 1990 г.). «Рефакторинг: помощь в разработке фреймворков приложений и развитии объектно-ориентированных систем». Труды симпозиума по объектно-ориентированному программированию с упором на практические приложения (SOOPPA) . ACM.
  24. ^ a b Грисволд, Уильям Джи (июль 1991 г.). Реструктуризация программ как помощь в сопровождении программного обеспечения (PDF) (кандидатская диссертация). Вашингтонский университет . Проверено 24 декабря 2011 .
  25. ^ a b Опдайк, Уильям Ф (июнь 1992 г.). Рефакторинг объектно-ориентированных фреймворков (кандидатская диссертация). Университет Иллинойса в Урбана-Шампейн. Архивировано из оригинального (сжатого Postscript) 16 декабря 2019 года . Проверено 12 февраля 2008 .
  26. ^ a b Мартин Фаулер, "MF Bliki: этимология рефакторинга"
  27. Перейти ↑ Brodie, Leo (2004). Думая дальше . С. 171–196. ISBN 0-9764587-0-5. Архивировано из оригинала 16 декабря 2005 года . Дата обращения 3 мая 2020 .
  28. ^ Weißgerber, Питер; Диль, С. (2006). «Выявление рефакторингов на основе изменений исходного кода» (PDF) . Материалы 21-й Международной конференции IEEE / ACM по автоматизированной разработке программного обеспечения (ASE 2006) . ACM.
  29. ^ Сюань, Цзифэн; Корню, Бенуа; Мартинес, Матиас; Бодри, Бенуа; Сейнтюрье, Лайонел; Монперрус, Мартин (2016). «B-рефакторинг: автоматический рефакторинг тестового кода для улучшения динамического анализа» . Информационные и программные технологии . 76 : 65–80. DOI : 10.1016 / j.infsof.2016.04.016 .
  30. ^ Что нового в Xcode 9
  31. ^ Рефакторинг в Qt Creator

Дальнейшее чтение [ править ]

  • Уэйк, Уильям С. (2003). Рефакторинг Workbook . Эддисон-Уэсли. ISBN 978-0-321-10929-3.
  • Mens, T .; Tourwe, T. (nd). «Обзор рефакторинга программного обеспечения» . IEEE Transactions по разработке программного обеспечения . 30 (2): 126–139. DOI : 10.1109 / tse.2004.1265817 . ISSN  0098-5589 . S2CID  206778272 .
  • Перья, Майкл C (2004). Эффективная работа с устаревшим кодом . Прентис Холл. ISBN 978-0-13-117705-5.
  • Кериевский, Джошуа (2004). Рефакторинг под шаблоны . Эддисон-Уэсли. ISBN 978-0-321-21335-8.
  • Арсеновский, Даниел (2008). Профессиональный рефакторинг в Visual Basic . Wrox. ISBN 978-0-470-17979-6.
  • Арсеновский, Даниел (2009). Профессиональный рефакторинг в C # и ASP.NET . Wrox. ISBN 978-0-470-43452-9.
  • Ричи, Питер (2010). Рефакторинг с помощью Visual Studio 2010 . Packt. ISBN 978-1-84968-010-3.

Внешние ссылки [ править ]

  • Что такое рефакторинг? (статья c2.com)
  • Домашняя страница Мартина Фаулера о рефакторинге
  • Рефакторинг в Curlie