Имя: Пароль:
1C
1С v8
Переменная модуля vs параметр
,
0 Jokero
 
18.05.15
10:10
1. Передавать параметром 67% (4)
2. Сделать глобальной 33% (2)
3. Свой вариант 0% (0)
Всего мнений: 6

Если у меня в модуле внешней обработки большое количество методов работают с одной ТЗ и многие меняют в ней данные, то как лучше, объявить эту ТЗ глобальной переменной или инициализировать ее в главной процедуре и передавать остальным в качестве параметра?
1 DirecTwiX
 
18.05.15
10:12
Параметр с дефолтным значением в виде глобальной переменной?)
2 vudo
 
18.05.15
10:12
Глобальные переменные зло - трудно разруливать асинхронные вызовы и работу в многопользовательском режиме.
Лучше использовать параметры сеанса, но и вэтом случае с асинхронными вызовами грустно...
3 Jokero
 
18.05.15
10:18
Нет, имею ввиду сделать глобальной переменной модуля. Объявить в шапке. И значение не дефолтное, обычная ТЗ, обычная переменная. просто вопрос где ее объявить. Если в шляпе, то любой метод может к ней обратиться, если в основной процедуре, то ее надо передавать в качестве параметра.
4 mehfk
 
18.05.15
10:19
(0) Планируется ли в дальнейшем вызывать эти функции с передачей в них других экземпляров ТЗ ?
5 фобка
 
18.05.15
10:20
Использовать рег св или спр
6 Jokero
 
18.05.15
10:25
(4) не, других экземпляров этой переменной или ТЗ нет. (иначе понятно, что лучше использовать функцию с возвратом результата обработки этой переменной или ТЗ).
7 Garykom
 
гуру
18.05.15
10:28
Всегда (обычно) лучше использовать изоляцию.

Т.е. все что нужно передавать в функцию в параметрах, а получать от нее в результате.

Удобнее потом повторно код использовать, да и просто изменять/переписывать.
8 Jokero
 
18.05.15
10:33
Чтобы было понятно, как лучше писать так или так:

вариант 1

Перем Переменная1;
Перем КакаятоТЗ;

Процедура Основная()
    //блаблабла
    КакаятоПроцедура1();
    КакаятоПроцедура2();
    //блаблабла
КонецПроцедуры

Процедура КакаятоПроцедура1()
    Переменная1 = Переменная1 - 1+1;    
    //Тз тож как то изменили
КонецПроцедуры

Процедура КакаятоПроцедура2()
    Переменная1 = Переменная1 + 1+1;    
    //Тз тож как то изменили    
КонецПроцедуры


,
Вариант 2

Процедура Основная()
    Переменная1 = 1;
    ТЗ = Новый ТаблицаЗначений;
    //блаблабла
    КакаятоПроцедура1(Переменная1,ТЗ);
    КакаятоПроцедура2(Переменная1,ТЗ);
    //блаблабла
КонецПроцедуры

Процедура КакаятоПроцедура1(Переменная1,ТЗ)
    Переменная1 = Переменная1 - 1+1;    
    //Тз тож как то изменили
КонецПроцедуры

Процедура КакаятоПроцедура2(Переменная1,ТЗ)
    Переменная1 = Переменная1 + 1+1;    
    //Тз тож как то изменили    
КонецПроцедуры
9 Jokero
 
18.05.15
10:37
(7) то есть, вариант 3 вот так?

Процедура Основная()
    Переменная1 = 1;
    ТЗ = Новый ТаблицаЗначений;
    //блаблабла
    Переменная1 = КакаятоПроцедура1(знач Переменная1);
    ТЗ = КакаятоПроцедура2(знач ТЗ);
    //блаблабла
КонецПроцедуры

функция КакаятоПроцедура1(Переменная1)
    Переменная1 = Переменная1 - 1+1;
    Возврат Переменная1;
КонецФункции

функция КакаятоПроцедура2(ТЗ)
    //ТЗ как то изменили;
    Возврат ТЗ;
КонецФункции
10 Jokero
 
18.05.15
10:39
(9) ой, "знач" не там написал), ну вы поняли в общем
11 Зеленый пень
 
18.05.15
10:43
Главное - в том месте функций, где начинаешь работать с ТЗ - перечислить её колонки. Потом проще разбираться.
В случае передачи как параметра - это можно сделать в комментах перед процедурой.
12 DirecTwiX
 
18.05.15
10:44
(10) По-моему, Знач не очень целесообразно использовать для больших объектов. Это же копию каждый раз будет создаваться..
13 fisher
 
18.05.15
10:50
(0) Параметром, конечно. В идеале, функции ВСЕГДА должны весь контекст выполнения получать из параметров. Не всегда это возможно, но к этому нужно стремиться. Это упрощает и понимание и переиспользование кода и рефакторинг и страхует от сайд-эффектов.
Если параметров контекста выполнения много, то можно группировать их в структуры по смыслу. Главное - в заголовке всё описать.
Тогда всё всем понятно и никаких проблем.
14 Лефмихалыч
 
18.05.15
10:52
(0) передавать параметром
15 fisher
 
18.05.15
10:52
Не говоря уже о том, что глобальная переменная модуля в модуле внешней обработки на УФ - бесполезна.
16 bolder
 
18.05.15
10:53
(0) кг/ам Один объект на модуль- нормально.
17 Лефмихалыч
 
18.05.15
10:55
Глобальная переменная в данном случае - такую же бкду причинит, как и goto. Она будет ломать контекст в голове при отладке и чтении кода.

Передавать параметром
18 Лефмихалыч
 
18.05.15
10:57
(17) не говоря уже о том, что глобальная:
1. будет ставить внутреннюю реализацию функицй в зависимость от окружения
2. надежно похоронит любые возможности для повторного использования кода
19 fisher
 
18.05.15
10:59
(16) Может быть. А вот использование глобальных переменных без ОЧЕНЬ веских оснований - ненормально. Даже если один объект.
20 Гёдза
 
18.05.15
11:00
Если это модуль обработки, то можно глобальную.
Иначе только через параметр
21 fisher
 
18.05.15
11:05
(20) Никаких исключений тут быть не может. Это самообман из кучи "если" - если модуль всегда останется простым как пробка, если не потребуется переиспользование этого функционала и т.д. - тогда типа "не страшно". А ради чего? Руки отвалятся "лишний" параметр прописать и спать спокойно? Это из той серии, когда соломки подстелить абсолютно ничего не стоит, а поблагодарить себя в будущем сможешь неоднократно.

Передавать параметром
22 Гёдза
 
18.05.15
11:08
Глобальная переменная в обработке аналогична реквизиту. Ты не не запрещаешь юзать реквизиты?
23 EugeniaK
 
18.05.15
11:09
Я за

Передавать параметром
24 fisher
 
18.05.15
11:10
(22) Запрещаю, если без них можно обойтись. Иногда переменные модуля нужны. Например, для огранизации локального кэша на клиенте. Тут никуда не денешься. Но всегда, когда можно функционал изолировать от окружения - надо изолировать.
25 fisher
 
18.05.15
11:17
Даже в тех же функциях работы с локальным кэшем передачу кэша надо делать через параметр. Это сразу даёт кучу плюшек. Сразу понятно, с чем работает функция. Элементарно перенести её в общий модуль при необходимости и т.д. и т.п.
26 fisher
 
18.05.15
11:21
По-хорошему, это азы программирования, которые поколения мэтров разжевывали в километровых полках учебников.
27 Гёдза
 
18.05.15
11:23
(24) Посмотри типовые обработки, а ля Универсальный обмен XML
и "ужаснись" количеству глобальных переменных
28 Jokero
 
18.05.15
11:34
(26) да, это азы программирования, но мы же говорим про 1с) здесь есть свои нюансы. Например, если использовать параметры, то автоподстановка перестает работать, а это уже неудобно.
29 fisher
 
18.05.15
11:50
(27) И что? Всем срочно скакать? Само по себе количество переменных может быть обусловлено банальной сложностью обработки. Но параметрами они их тоже не передают. Это их выбор. Если тебе кажется, что это правильно, попробуй "выдернуть" оттуда функцию с их использованием с наскоку понять, от чего зависит результат работы этой функции и на что он влияет. Такие же добрые слова получишь в свой адрес от твоего преемника.
(28) Подсказку по ним сделали - уже хорошо. ИМХО, это не повод портить себе и другим жизнь.
30 koreav
 
18.05.15
12:15
однозначно не 2

Передавать параметром
31 Jokero
 
19.05.15
10:57
тогда как вам идея использовать глобальные переменные модуля в качестве констант?(Не констант объектов как у 1с, а именно констант переменных)  
Например: путь к файлу.
32 Гёдза
 
19.05.15
11:04
(29) Реквизиты - нормально, а переменные  - нет?
33 Рэйв
 
19.05.15
11:11
Что так все ополчились против глобальных переменных?
Это же просто область видимости.
Лежит себе переменная, никого не трогает и ее отовсюду видно:-)

Сделать глобальной
34 GROOVY
 
19.05.15
11:13
Я чутка тему переименовал, чтоб в заблуждение не вводить людей.
35 GROOVY
 
19.05.15
11:15
По теме: если это не модуль УФ, то я не вижу ничего плохого в переменной модуля.

Сделать глобальной
36 fisher
 
19.05.15
12:07
Давайте не путать. Речь не против переменных модуля, как таковых.
А против переменных модуля исключительно как способа сократить количество параметров функций. Чувствуете разницу? Вы реально за это поднимаете руки? Тогда я их умываю.
Программист всегда исправляет последнюю ошибку.