|
Как выбрать что использовать: процедуру или функцию? 🠗 (Волшебник 18.03.2025 11:24) | ☑ | ||
---|---|---|---|---|
0
program345
18.03.25
✎
11:13
|
Как я понимаю разница между функцией и процедурой в том, что функция возращает значение, а процедура нет.
Как вы выбираете что использовать? Где кода будет мешьше, то и берем? фукция: &НаКлиенте Процедура ТоварыНоменклатураПриИзменении(Элемент) Элементы.Товары.ТекущиеДанные.Скидка = ПолучитьСкидкуНоменклатуры(Элементы.Товары.ТекущиеДанные.Номенклатура); КонецПроцедуры &НаСервере Функция ПолучитьСкидкуНоменклатуры(Номенклатура) Возврат Номенклатура.ОсновнаяСкидка; КонецФункции проц: &НаКлиенте Процедура ТоварыНоменклатураПриИзменении(Элемент) Номенклатура = Элементы.Товары.ТекущиеДанные.Номенклатура; ПолучитьСкидкуНоменклатуры(Номенклатура); Элементы.Товары.ТекущиеДанные.Скидка = Номенклатура; КонецПроцедуры &НаСервере Процедура ПолучитьСкидкуНоменклатуры(Номенклатура) Номенклатура = Номенклатура.ОсновнаяСкидка; КонецПроцедуры |
|||
1
Мультук
гуру
18.03.25
✎
11:18
|
(0)
1) За второй вариант, когда номенклатура была "номенклатура", а стала "Число" я бы {здесь очень нехорошее слово} 2) Выучите уже разницу между &НаСервере и &НаСервереБезКонтекста |
|||
2
Мультук
гуру
18.03.25
✎
11:24
|
(0)
P.S. Пару вопросов (можете не отвечать, но мне любопытно): 1) Сколько вам годиков ? 2) На каком языке вы учились программировать и в каком году ? P.S. Чтобы было честно Мне 50 лет Начал в 1983 -- с Basic (для БК-0010) Потом было много чего Си, pascal, Delphi Писал на asm для AVR-Atmega И всякое "по мелочи" |
|||
3
Волшебник
18.03.25
✎
11:24
|
О, на форуме завёлся новый тролль
|
|||
4
Волшебник
18.03.25
✎
11:52
|
(2) О, давайте померяемся!
Мне 44 года. Программировать начал в 1989 году. БК-0010, Spectrum (Basic), потом ассемблер, С, С++, Pascal, Delphi, 1С v7 с 1997 года, 1С v8 с 2002 года, PHP с 2003 года, JavaScript + jQuery |
|||
5
H A D G E H O G s
18.03.25
✎
11:58
|
Любая процедура сложнее 3-х строк должна быть функцией, возвращающей объект Структуры с полями
СтруктураРезультата=Новый Структура("Результат,ОписаниеОшибки,КодОшибки,Данные",Истина,"",0,Неопределено); |
|||
6
H A D G E H O G s
18.03.25
✎
12:00
|
КодОшибки - опционален, для внешних обработок сложных ситуаций (так как нет своих объектов к ВызватьИсключение, а ориентироваться на строку - ну такое, да и вызывание исключений должно быть только на этапе внедрения при отладке сложных случаев, а не в промэксплуатации), либо для проброса кодов ошибок ОС.
|
|||
7
Климов Сергей
18.03.25
✎
12:12
|
В юности читал книжку про язык С. Страуструпа, кажется. Запомнились оттуда два пассажа:
1. Нет никаких разумных причин не инициализировать переменные; 2. Нет никаких разумных причин, чтобы ваша процедура не возвращала результат своей работы. Не цитата, но смысл такой. |
|||
8
Галахад
гуру
18.03.25
✎
12:12
|
Хм. В второй код не должен очистить "Номенклатуру" в строке?
|
|||
9
Kigo_Kigo
18.03.25
✎
12:29
|
Второй вариант не лицеприятен, нужно передать и номенклатуру и ожидаемую переменную скидка, не мешать мух с котлетами, на выходе из процедуры придется обращаться к номенклатуре через всю портянку, Номенклатура = Элементы.Товары.ТекущиеДанные.Номенклатура, а это как говорится - насрать в код, код становится не читаем, по этому предпочтительней первый
|
|||
10
Kigo_Kigo
18.03.25
✎
12:28
|
(8) Там же не строка передается, а ссылка справочника номенклатура
|
|||
11
Fedor-1971
18.03.25
✎
12:38
|
(4) Ну, раз уже взялись меряться
Мне 53 года, начало программирования 1987 ЕС 1022, 1032 (PL/1L) PDP-11 (Basic) Изот, Нейрон, ДВК-1 (Basic, Pascal) ЕС 1841 (дальше IBM 286 и по порядку) - Basic, C, C++ 1С v 6, 7.5, 7.7, 8.х с 1997 и по мере выхода WSH скрипты и прочее системное (bat,cmd) |
|||
12
Irbis
18.03.25
✎
12:43
|
(4), (11) Вы ещё про микрокалькуляторы программируемые детям расскажите.
|
|||
13
Fedor-1971
18.03.25
✎
12:52
|
(12) очень удобная штука МК-61
лабы делать и так, по мелочи, замечтательно (ностальгия, блин) |
|||
14
Волшебник
18.03.25
✎
12:56
|
(12) У меня был МК-61, а на нём написал "Морской бой"
|
|||
15
Irbis
18.03.25
✎
13:17
|
Мне достался МК-52, я на него что-то из программок для Б3-34 и МК-54 адаптировал, не все команды совпадали. Ну, а про тривиальные численные методы (решение уравнений, интегрирование) и писать стыдно, целая книжка на полке стояла, ЕМНИП Чернов автором был. но там тоже было всё для МК61.
Потом уже в школу привезли два компьтера Башкирия-2м, там был бейсик и калькулятор стал не актуален. В то время на заводе в штабе были Роботроны-1715, тоже с бейсиком но уже с 5.25" дисководом и дальше всё понеслось с какой-то дикой скоростью |
|||
16
Волшебник
18.03.25
✎
13:26
|
Расскажите, когда лучше использовать функции, а когда лямбда-выражения?
|
|||
17
Eiffil123
18.03.25
✎
13:30
|
Почему в языках программирования так принято, что функция возвращает только один результат?
Пора уже отходить от этих традиций. |
|||
18
skafandr
18.03.25
✎
13:34
|
(4) Эх молодо-зелено
Мне 64 года, начало программирования 1977 Минск-22,32 (машинный код, ассемблер, Фортран) ЕС 1022, 1032 (ассемблер,PL/1L) ZX Spectrum (Basic) ;-) ДВК-1 (Basic) Эльбрус 2 (Эль-76) 286 и далее ) - Basic, C 1С v7.7, 8.х с 2004 |
|||
19
novichok79
18.03.25
✎
13:36
|
мне 37.
начал программировать где-то в 9 лет. переписывал на спектрумовский бейсик программы, которые брат приносил со школы, где они на каком-то БК программировали. потом Pascal, Delphi, 1С. далее Java, Golang. а, ну sh скрипты и все такое прочее не считаю даже. powershell - это вообще отрыжка какого-то злого гения. |
|||
20
novichok79
18.03.25
✎
13:37
|
(0) по теме.
лучше явное чем неявное - так что функция выглядит лучше, она не обновляет скрытно внутри себя значение. процедура - это если что-то сложное, куда придется занырнуть. да и то, под вопросом. |
|||
21
Волшебник
18.03.25
✎
13:38
|
(17) в Python можно вернуть кортеж, например
def f(): return (1, 2) (a, b) = f() print (a,b) |
|||
22
Irbis
18.03.25
✎
13:40
|
(17) Тут главнее что процедура не повинна вообще что-то возвращать, а функция такого права лишена. Хоть херню, но вернуть взад что-то надо.
|
|||
23
Волшебник
18.03.25
✎
13:43
|
(22) В языке С/С++ вообще нет процедур, только функции, которые могут возвращать void (пустота)
|
|||
24
Garykom
гуру
18.03.25
✎
13:52
|
Осторожней с разделением на Процедуры/Функции
А то так доберетесь что искусственное разделение на Структура/Соответствие/Массив/СписокЗначений/ТаблицаЗначений не обязательны... Можно всего одним универсальным объектом обойтись, реализующим весь функционал перечисленных |
|||
25
Garykom
гуру
18.03.25
✎
13:58
|
(24)+ Начать можно с того что СписокЗначений это фактически урезанная ТаблицаЗначений с фиксированными колонками
А уж разделение на Структура и Соответствие - ну нахрена??? Чем так важно обращение через точку: Структура.ИмяСвойства Что нельзя было обойтись квадратными скобками: Структура["Имя Свойства"] ? Или если уж очень хотите через точку то: Структура."Имя Свойства" |
|||
26
vbus
18.03.25
✎
14:01
|
(22) А если так?
&НаКлиенте Процедура МояПроцедура() Перем Выход1,Выход2, Выход3; МояПроцедураНаСервере(Выход1,Выход2, Выход3); Сообщить(""+Выход1+Выход2+ Выход3); КонецПроцедуры &НаСервере Процедура МояПроцедураНаСервере(Выход1,Выход2, Выход3) Выход1 = 10; Выход2 = 10; Выход3 = 10; КонецПроцедуры |
|||
27
Irbis
18.03.25
✎
14:07
|
(26) Да хоть как
|
|||
28
H A D G E H O G s
18.03.25
✎
14:19
|
(26) Для авторов возврата результата через параметры - уже разогревают котел.
|
|||
29
Fedor-1971
18.03.25
✎
14:24
|
(28) Давно варят (или что там) - в С параметры передаются ссылкой и можно было уконтропупить данные тупо,
присвоив новое значение параметру |
|||
30
Eiffil123
18.03.25
✎
14:41
|
(21) вот вот. вполне удобный синтаксис:
(а, б, в) = ф(); а то в 1С всё в параметры напихают, а потом гадай, процедура их поменяла или нет |
|||
31
H A D G E H O G s
18.03.25
✎
14:27
|
(29) Для защиты от таких ребят использую ЗНАЧ, ну кроме опасных объектов типа больших Массивов(Таблиц,списков), если только это не серверный вызов.
|
|||
32
vbus
18.03.25
✎
14:59
|
(16)
Рекомендация в PEP-8 Всегда используйте оператор def вместо оператора присваивания, который привязывает лямбда-выражение непосредственно к имени.
https://peps.python.org/pep-0008/#public-and-internal-interfaces Законный случай использования лямбды - это когда вы хотите использовать функцию без присвоения ей имени. |
|||
33
Волшебник
18.03.25
✎
15:13
|
(32) 👍
|
|||
34
Волшебник
18.03.25
✎
15:14
|
Что лучше: цикл или рекурсия?
|
|||
35
Волшебник
18.03.25
✎
15:14
|
Почему константа в 1С называется константой, хотя её значение может быть изменено?
|
|||
36
Волшебник
18.03.25
✎
15:23
|
Зачем в языке нужен унарный плюс, если он ничего не делает?
|
|||
37
Волшебник
18.03.25
✎
15:30
|
Почему следующий рабочий запрос не открывается конструктором?
Выбрать (&Док).Номер |
|||
38
Garykom
гуру
18.03.25
✎
16:08
|
(37) Запрос не всегда рабочий ибо зависит от типа параметра &Док
Правильно все же соединить с нужными документами |
|||
39
Eiffil123
19.03.25
✎
09:41
|
(22)
Приведенный код показывает, что отличий между процедурами и функциями практически нет. Два разных ключевых слова - просто синтаксический сахар (впрочем, не упрощающий жизнь никому).
|
|||
40
Eiffil123
19.03.25
✎
09:44
|
(31) это практически ни от чего не защищает, кроме примитивных типов. Ну и для того, чтобы написать Знач, вам надо быть разработчиком вызываемого метода. А в этом случае вы и так знаете, меняет ли он значение переменной или нет
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |