v8: Альтернатива стеку - передача параметров контекстом.
Я на практике применяю довольно удачный способ передачи переменных. Такой способ позволяет мне обходиться без глобальных переменных. | Автор статьи: Гений 1С | Редакторы: Последняя редакция №2 от 08.02.07 | |
Ключевые слова: стек,переменная,параметр
Альтернатива стеку
Часто функции 1С обрастают большим числом параметров.
Но ладно бы, если бы только одна функция обрастала такими параметрами, но при вызове из этой функции другой функции, той могут понадобиться параметры первой функции, следовательно, число параметров будет расти во всех функциях.
Альтернативой такой организации передачи данных являются глобальные переменные или передача данных в виде структуры (контекста). Глобальные данные нарушают прозрачность и изолированность кода, поэтому остановимся на втором способе.
Удобнее всего, чтобы функции имели только один параметр П.
Тогда можно передавать весь контекст от функции к функции.
Однако как быть, если в контексте есть уже некий параметр, а нам нужно вычислить функцию с другим значением этого параметра? Причем исходный контекст нам менять нельзя? Такое часто встречается в рекурсивных или сложнозависимых функциях, которые непредсказуемым образом вызывают друг друга.
Предлагаю использовать вот такие простые функции:
Функция НовПрм(П, Стр) Экспорт Стр.Вставить("___Родитель", П); Возврат Стр; КонецФункции //Ищет свойство сначала в структуре П, а затем во всех ее родительских структурах Функция Прм(П, Свойство) Экспорт Перем Р; Если П.Свойство(Свойство, Р) Тогда Возврат Р; КонецЕсли; Если П.Свойство("___Родитель", Р) Тогда Возврат Прм(Р, Свойство); КонецЕсли; Возврат Неопределено; КонецФункции
Вот пример использования:
Функция А(П) Если П.Рост>100 Тогда А(НовПрм(П, Новый Структура("Рост", П.Рост%100))); КонецЕсли; Сообщить("Рост:"+Прм(П, "Рост")); КонецФункции А(Новый Структура("Рост, Вес", 90, 35)); А(Новый Структура("Рост, Вес", 176, 79));
В результате будет выведено:
Рост:90
Рост:76
Рост:176
Как видно из примера, если нам нужно организовать вычисления с перекрывающимся параметром, мы не меняем, а просто расширяем контекст.
Возможен конечно и вариант, когда контекст меняется, а затем восстанавливается, но он чреват ошибками, если забыть восстановить контекст, да и менее элегантен:
Функция А(П) Если П.Рост>100 Тогда _Рост=П.Рост(П.Рост%100); А(П); П.Рост=_Рост; КонецЕсли; Сообщить("Рост:"+Прм(П, "Рост")); КонецФункции А(Новый Структура("Рост, Вес", 90, 35)); А(Новый Структура("Рост, Вес", 176, 79));