Заметки из Зазеркалья

09.12.2013

Инструменты рефакторинга и отказа от модальности

Реализовано в версии 8.3.5.1068.

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

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

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

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

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

Функции рефакторинга позволяют сделать код более понятным и удобным для восприятия. Например, вы можете оформить часть кода в виде отдельной процедуры или функции (команда Выделить фрагмент):

Вы можете сформировать заготовку для описания назначения и параметров процедуры или функции (команда Создать описание процедуры):

А ещё вы можете изменить имя локальной или экспортной переменной, процедуры, функции во всех местах её фактического использования (команда Переименовать):

Кроме этого вы можете просто найти все места, где используется некоторая переменная, функция или процедура. С помощью команды Найти использование:

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

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

Теперь в простых, и в не очень простых, случаях вы можете сделать это автоматически (команда Модальные вызовы - Преобразовать модальный вызов):

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

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

Однако если вы преобразуете код, который находится, например, в модуле управляемого приложения, то полностью автоматическое преобразование вам выполнить не удастся:

Дело в том, что у глобального контекста нет свойства, позволяющего сослаться на него самого (ЭтотОбъект). А значит процедуру, обрабатывающую оповещение, нельзя разместить тут же, в модуле управляемого приложения. Её можно разместить, например, в каком-нибудь общем модуле. Эти действия вам нужно будет выполнить вручную:

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

Например, модальный вызов располагается внутри вызываемой процедуры:

В этом случае модальным будет не только вызов Предупреждение(), но и вызов Цепочка1(). И если для функции Предупреждение() у вас есть во встроенном языке асинхронный аналог ПоказатьПредупреждение(), то для вызова Цепочка1() асинхронный аналог вам нужно придумать самостоятельно. Для этого можно использовать команду Модальные вызовы - Преобразовать в асинхронную процедуру:

А после этого Предупреждение() преобразовать с помощью Модальные вызовы - Преобразовать модальный вызов:

В данном случае последовательность этих двух операций показана лишь для наглядности. На самом деле в этом примере платформа сразу же преобразовала бы Предупреждение() в конечный вариант, известив вас "в процессе" о том, что процедура так же будет преобразована к асинхронному виду:

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

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

А после этого можете уже автоматически преобразовать Предупреждение(). И, естественно, платформа известит вас о том, что процедуру она также преобразует к асинхронному виду.

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

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

Например, с помощью команды Найти модальные вызовы модуля вы можете получить список всех строк и операторов модуля, которые требуют преобразования:

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

Проанализировать и преобразовать модальные вызовы во всей конфигурации целиком вы можете с помощью команды Конфигурация - Рефакторинг - Анализ модальных вызовов конфигурации:

В этом случае перед началом вы можете выбрать только анализ или сразу же и преобразование, а также можете задать некоторые параметры этих действий.

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

Теги: UI  разработка  8.3.5