gifts2017

TestIB8x - Безопасный код - Option Explicit

Опубликовал brix8x (brix8x) в раздел Программирование - Практика программирования

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

А откуда бы автор этой функции мог догадаться, что мы будем использовать такие же "редкие" идентификаторы как "Валюта", "Индикатор", прочее ... ;-)!?

Желающих приглашаю к обсуждению данного решения, может что важное упущено?


Безопасный код – Option Explicit


Категория: Безопасный код
Название: Option Explicit
GUID: 5c11d53e-1dda-4ccb-9ce2-4ea01a9a142c
Версия: 1 от 26.12.07

Введение

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

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

Пример:
Перем  х;
Функция  Универсальная()   Экспорт

х = 1;
Сообщить("Внутри функции: "+ х);

Возврат "";
КонецФункции 

Функция ИспользуетУниверсальную() 

х = 6;
	
	
Сообщить("До вызова функции: "+ х);
Рез = Универсальная();
Сообщить("После вызова функции: "+ х);

// В этом месте значение х будет равно 1, // а должно быть х = 6 
Возврат "";

КонецФункции 

 


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

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

Реализация

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

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

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

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

Шаг 1 Проверка общих модулей


Для каждой экспортной функции:
1. Создать список объявленных переменных
2. Найти все переменные из операции присваивание
3. Сформировать, при необходимости правильный блок объявлений переменных

Шаг 2 Проверка модулей объектов и модулей формы


1. Создать список реквизитов объекта
2. Создать список объявленных переменных
3. Создать список переменных модуля
4. Найти все переменные из операции присваивание
5. Сформировать, при необходимости правильный блок объявлений переменных

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Сhe Burashka (CheBurator) 27.12.07 15:16
2. VasilyKushnir (vasilykushnir) 27.12.07 16:40
Дык это вроде азы... Как бы основа "правильного" стиля программирования. Честно говоря за конструкцию

Перем х;

Функция Универсальная() Экспорт
х = 1;
Сообщить("Внутри функции: "+х);

Возврат "";
КонецФункции

сразу в дыню надо давать - функция принимает параметры через вызов и отдает результат через Возврат, все остальное д.б. внутри априори.
3. VasilyKushnir (vasilykushnir) 27.12.07 16:45
Хотя ты, пожалуй, прав - каких только "чудачеств" не увидишь...
Поэтому статью считаю полезной для начинающих типа "Я только начал изучать1С, как мне написать конфигурацию с нуля для металлургического завода?". И посему будет +1
4. Михаил Семенов (Shaman100M) 29.12.07 10:59
Каждый раз, по завершении причесывая код, занимаюсь подобной глазоломалкой..., - неплохая идея автоматизировать этот процесс. При окончательном формировании блока объявлений добавил бы к проверяемым спискам еще параметры самой функции и переменные-параметры вызываемых процедур и функций
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа