1 апреля 2024

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

Рефакторингом называют процесс переработки исходного кода программы для облегчения его понимания и удобочитаемости. Рефакторинг не должен менять результат действия программы, он направлен только на упрощение и структурирование кода. Существует порядка 20-ти методов рефакторинга, разработаны средства для его автоматизации. В статье расскажем подробнее, что из себя представляет рефакторинг кода, какие существуют инструменты и способы рефакторинга, и когда он необходим.


Рефакторинг кода — определение понятия

Рефакторинг (в переводе «переработка») кода — это процедура «чистки», совершенствования кода и устранения его недостатков, целью которой является оптимизация качества написанной на нем программы. В процессе рефакторинга код становится более понятным, поддерживаемым и структурированным. Это приводит к возрастанию производительности программы и уменьшению ее сложности без изменения функционального поведения, работоспособности и стабильности.

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

Важно не путать рефакторинг с оптимизацией программы или дебаггингом. У этих процессов разные цели. Оптимизация проводится ради улучшения производительности программы, а дебаггинг — для устранения ошибок в ее работе. При этом код может стать еще более громоздким, хаотичным и нечитаемым — поскольку его улучшение не является приоритетным при оптимизации и дебаггинге. Все эти процедуры можно совмещать и выполнять параллельно, однако практика показывает, что для достижения приемлемого качества требуется уделить внимание каждому из процессов отдельно.

Функции и цели рефакторинга

Основная цель рефакторинга — улучшение качества программы и оптимизация трудозатрат на ее разработку и поддержку при неизменности функциональности за счет минимизации и очистки кода. Успешным результатом рефакторинга считается лаконичный и понятный для всех участников команды код.

Выделим основные задачи рефакторинга:

  1. Улучшение структурированности и читаемости кода. Наведение порядка в коде важно и для текущего изучения кода разработчиками в ходе написания программы, и впоследствии, при возникновении необходимости в ее развитии и поддержке.
  2. Ускорение поиска ошибок в коде.
  3. Облегчение разработки автоматических тестов людьми без знания языка, на котором написана программа.
  4. Устранение недостатков в коде, накопление которых может замедлять разработку и усложнять поддержку программы — в частности, дублирования фрагментов кода, большой вложенности операторов и конструкций.
  5. Соблюдение стандартов разработки.
  6. Рост эффективности разработчиков — они тратят меньше времени на поддержку программы и внедрение новых функций, библиотек, операторов без риска негативного влияния на другие части ПО.
  7. Оптимизация архитектуры программы, увеличение гибкости и адаптируемости.
  8. Улучшение производительности. Несмотря на то, что рефакторинг и оптимизация — это разные процессы, в некоторых случаях результатом рефакторинга становится возрастание скорости работы программы.

Может возникнуть вопрос: почему нельзя сразу писать код так, чтобы он оставался читабельным и систематизированным? В теории это возможно, но на практике зачастую разработчикам нужно вносить срочные правки, исправляя баги или следуя изменениям в задаче, и им «не до красоты» в коде. У каждого разработчика свой стиль написания кода, и когда над комплексным ПО работает несколько программистов, общий результат может выглядеть очень разнородным и беспорядочным.

Рефакторинг — процедура, требующая регулярности. Технологии совершенствуются, в программу вносятся обновления, дополнения и исправления, она масштабируется, к проекту подключаются новые разработчики. В идеале рефакторинг нужно осуществлять после каждого существенного изменения кода. Также желательно наличие регламента разработки, которому будут следовать и штатные, и привлеченные специалисты.

Отказ от модальности

Под отказом от модальности подразумевается функция автоматического преобразования модальных методов и участков кода на асинхронные аналоги.

В ранних версиях программ на платформе «1С:Предприятие» использовались модальные окна для ввода пользователем информации с целью запуска дальнейшей цепочки действий. При отображении модального окна и вплоть до его закрытия блокировался весь остальной интерфейс программы. С появлением веб-клиента и переходом на мобильные платформы выяснилось, что модальные окна вызывают множество проблем и неудобств, зачастую неразрешимых — в частности, отсутствие поддержки модальных окон и их блокировка в браузерах. В результате был разработан механизм, позволяющий преобразовывать модальные вызовы в асинхронные процедуры как автоматически, так и вручную.

Выделение модального вызова в асинхронную процедуру
Рис.1. Выделение модального вызова в асинхронную процедуру

В конфигураторе 1С механизм преобразования модальных фрагментов кода был объединен с функцией рефакторинга исходя из тех соображений, что без рефакторинга отказ от модальности недостаточно эффективен. 

Предусмотрена возможность проанализировать и преобразовать модальные вызовы не только отдельно, но и во всей конфигурации целиком.


Анализ модальных вызовов во всей конфигурации
Рис.2. Анализ модальных вызовов во всей конфигурации

Общие средства рефакторинга

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

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

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

  1. Методология непрерывной интеграции и поставки (CI/CD — Continuous Integration/Continuous Deployment) включает в себя средства автоматизации, позволяющие настроить алгоритм автоматической проверки форматирования кода и на любом этапе разработки запускать линтеры — инструменты анализа кода, позволяющие выявить недочеты, ошибки в структуре, нарушения стиля.
  2. Выделение метода (Extract method) работает таким образом: из длинного кода выделяются фрагменты и преобразуются в отдельные методы с подстановкой подходящих вызовов в местах использования. Один метод не может занимать более одного экрана строк и не должен сопровождаться комментарием о своей функциональности. Целью является упрощение кода внутри метода класса для выделения основной задачи, которую метод должен решить.
  3. Технология разработки через тестирование (TDD — Test-Driven Development) устроена так, что процесс разработки разделен на короткие циклы. Тесты пишутся перед разработкой кода, после чего проводится рефакторинг нового кода на соответствие необходимым критериям.
  4. Метод Red-Green-Refactor, суть которого сводится к циклической разработке — попеременном написании тестов, функциональной части кода и рефакторинге.
  5. Абстракция, при которой происходит уменьшение дублирования кода. Разработчики используют новые абстракции для объединения одинаковых методов и полей или, наоборот, вынесения их в специфичные классы.
  6. Замена условного оператора полиморфизмом (Replace conditional with polymorphism). Это актуально при наличии в коде условных операторов, выполняющих различную работу в зависимости от класса объекта или интерфейса, который он реализует. Польза увеличивается, если условных операторов больше одного и они находятся во всех методах объекта.
  7. Изменение сигнатуры метода (Change method signature) — изменение порядка, добавление, модификация или удаление параметра метода с дальнейшей корректировкой обращения к нему в коде всех клиентов.

Рефакторинг стал неотъемлемым элементом процесса разработки структуры приложений (Framework development) при создании иерархии классов и сокращении кодов.

Рефакторинг синхронных вызовов

Большая часть кода 1С — синхронная, выполняемая последовательно. Однако, когда с кодом 1С взаимодействуют извне — например, пользователь, веб-сервис, файловая подсистема, операционная система — платформа приостанавливает выполнение кода до завершения внешнего действия. Для повышения скорости работы появились асинхронные аналоги, не блокирующие выполнение кода.

Посредством рефакторинга можно быстро преобразовать синхронные вызовы в асинхронные. Так выглядит процедура с использованием синхронных методов в конфигураторе:

Процедура с использованием синхронных вызовов
Рис.3. Процедура с использованием синхронных вызовов

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

Цепочка процедур обработчиков ожидания (фрагмент)
Рис.4. Цепочка процедур обработчиков ожидания (фрагмент)

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

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

Для оформления комментариев к методу достаточно воспользоваться пунктом меню «Рефакторинг → СоздатьОписаниеПроцедуры» или «СоздатьОписаниеФункции». Получится заготовка комментария, которую можно заполнить, дополнив описание и прописав типы параметров, и он корректно отобразится в контекстной подсказке при вызове метода:

Заготовка для комментария
Рис.5. Заготовка для комментария

Когда стоит заниматься рефакторингом

Рефакторинг может быть ситуативным или запланированным. В первом случае его проводят в определенных обстоятельствах: после добавления внушительного фрагмента кода, перед включением в проект нового разработчика, по результатам тестирования или из-за увеличившихся трудозатрат программистов.

Остановимся на варианте, когда рефакторинг включен в план работы над проектом. Практика показывает, что плановый рефакторинг проводится более комплексно и качественно, чем спонтанный и вынужденный. Это объясняется, в первую очередь, тем, что под него выделено время и другие ресурсы.

Итак, когда целесообразно произвести рефакторинг:

  • Перед стартом нового спринта в период проведения регрессионного тестирования.

  • Перед добавлением новой функциональности.

  • По заранее утвержденному плану — например, после каждых трех спринтов.

  • В периоды низкой активности на проекте, когда у команды есть ресурсы внимательно отнестись к процессу рефакторинга, уделив время изучению кода, написанию тестов и документированию внесенных изменений.

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

Плановый процесс рефакторинга проходит через несколько этапов:

  1. Определение участков кода, требующих проверки и структуризации, посредством тестирования, код-ревью или использования статических анализаторов.
  2. Обеспечение кода набором модульных, функциональных или интеграционных тестов, позволяющих контролировать отсутствие изменения функциональности и других нарушений в ходе рефакторинга.
  3. Последовательный процесс рефакторинга, осуществляемый небольшими «порциями»: удаление дубликатов, «мёртвого» кода, избыточных комментариев, переименование переменных, разбиение больших функций на меньшие, улучшение структуры условных операторов, применение принципов SOLID.
  4. Тестирование после каждого изменения для подтверждения корректности работы кода.
  5. Документирование существенных изменений в системе контроля версий.
  6. Код-ревью с другими участниками команды.
  7. Слияние прошедшего рефакторинг кода с основной веткой.
  8. Мониторинг поведения программы на предмет соблюдения функциональности, производительности, стабильности и других ключевых метрик ее работы.

Если не выполнять рефакторинг регулярно, велики риски откладывания «на потом», в результате чего замусоренность и нелогичность кода могут вырасти как снежный ком.

Снижение качества кода неизбежно приведет к дополнительным трудозатратам в будущем и, как это часто бывает, срочно перерабатывать код придется в самый неподходящий момент — например, при возникновении проблемы совместимости программы с внешними компонентами или сторонними системами.

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

Помощь в рефакторинге кода от специалистов компании Первый Бит

Специалисты компании «Первый Бит» окажут необходимую помощь в рефакторинге кода как на регулярной основе, так и разово. Мы используем весь спектр современных технологий автоматизации, при этом осуществляя контроль и анализ вручную, отслеживая и обеспечивая соблюдение качества выполнения всех процессов. 

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



Обратитесь к нам сегодня!
Мы подберём решение специально для вашего бизнеса

Отзывы клиентов

«Пришел, чтобы разобраться с СППР. Структура курса понравилась.
Трудностей в обучении не испытывал. Разобрался в том, что представляет из себя СППР, освоил базовый функционал. Хотелось бы более глубоких знаний по результатам курса. Порекомендую курс РП, ФА».
Сергей Ермолаев
Руководитель проектов, г. Красноярск
«„БИТ.ФИНАНС“ является полнофункциональным решением, предназначенным для решения задач финансово-экономического блока. „Первый БИТ“ обладает многолетним опытом внедрения подобных систем, что и обусловило выбор нашей команды для реализации проекта».
С. А. Кириленко
финансовый директор АО "ПромКапитал"
«Руководство компании получило прозрачный инструмент контроля и оперативную информацию для принятия управленческих решений».
Ольга Филипенкова
директор департамента маркетинга и продаж «Розы Хутор»