Имя: Пароль:
1C
 
процедура или функция?
,
0 program345
 
24.02.15
11:42
Добрый день!
Когда применять процедуру, а когда функцию?
Или без разницы?
Поделитесь опытом...
1 mikecool
 
24.02.15
11:42
без разницы
все процедуры есть функции
2 Рэйв
 
24.02.15
11:43
толсто...
3 vermouth
 
24.02.15
18:57
да не парься..используй всегда функции.. просто когда возвращать нечего - возвращай ноль :)
4 Эмбеддер
 
24.02.15
18:59
орел или решка?
5 Wobland
 
24.02.15
18:59
вот до чего людей делфи доводит
6 VladZ
 
24.02.15
19:24
(0) Если нужно вернуть результат - функция. Если просто что-то сделать - процедура.
7 jsmith82
 
24.02.15
19:51
(5)+1
8 User_Agronom
 
24.02.15
19:58
(5) А при чём тут delphi? Или это на Pascacal наезд?
9 ДенисЧ
 
24.02.15
20:00
(8) В С нет процедур ))
10 jsmith82
 
24.02.15
20:00
(8) да как бы в некоторых языках нет понятия процедуры...
11 User_Agronom
 
24.02.15
20:03
(9) Да, там только функции.
В теории всё это: и процедуры и функции - называются подпрограммы.

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

Хотя, если будет голосувалка выбрал бы ответ как в (1)
12 ДенисЧ
 
24.02.15
20:04
(11)
Функция Моя()
  Возврат 1;
КонецФункции

Процедура Приоткрытии()
  Моя();
КонецПроцедуры

Какая такая переменная?
13 jsmith82
 
24.02.15
20:07
изначально были только процедуры
манипуляции над переменными производились в стеке
отсюда и пошло по ходу
14 User_Agronom
 
24.02.15
20:13
(12) Это 1С. В Паскале бы выскочила ошибка.
15 Torquader
 
24.02.15
20:33
Функция, это когда на входе несколько аргументов (причём предполагается, что аргументы внутри не меняются и передаются по значению), а на выходе - только один - результат.
Всё остальное будут уже процедуры.

Хорошим тоном считается при разработке процедур предусматривать возврат кода успешности выполнения, чтобы не приходилось ставить перехват исключений.
16 Asmody
 
24.02.15
20:39
(15) последнее утверждение спорное. Если что-то надо возвращать - это функция. Процедура должна просто выполниться. Или "упасть" с исключением.
17 GreyK
 
24.02.15
21:01
(15) Первое утверждение спорное, ибо функция может быть и без передачи параметров. ТекущаяДата() - это то-же функция реализованная на движке 1С.
18 Провинциальный 1сник
 
24.02.15
21:23
Я считаю, что если подпрограмма что-то делает с базой или с глобальными переменными - её надо оформлять процедурой. Если же подпрограмма только что-то возвращает в точку вызова, но не производит побочных эффектов - то оформлять функцией. Да, и в функции формальные параметры-переменные или ссылки не менять, ибо нефиг. Если надо вернуть больше, чем одно значение - возвращать структуру, а не портить параметры функции. Тогда всё будет красиво и правильно.
19 ДенисЧ
 
24.02.15
21:26
(18) Бедные писатели на лиспе... Они вообще ничего не могут изменить в базе данных...
20 GreyK
 
24.02.15
21:30
(18) "Провести()" возвращает значение, видимо не процедура...
21 Провинциальный 1сник
 
24.02.15
21:36
(19) Ну так, любое изменение данных в базе - это по сути своей _действие_.. а функция в строго математическом смысле - это не действие, а _отображение_ множества входных параметров на выходные(возвращаемое значение). То есть, чисто функциональный язык с базой работать принципиально не может. Если может - это уже мутант, помесь функциональщины с императивщиной.

(20) Кто говорит об идеальности 1с? Что есть то есть. Много там чего не продумано.
22 Крошка Ру
 
24.02.15
21:37
Короче, идеальная подпрограмма - это такая хрень, которая не только обязательно что-то делает с базой, но и с ц у к о ещё что-то возвращает...
23 Крошка Ру
 
24.02.15
21:39
>>помесь функциональщины с императивщиной

Да чего уж там... Продажная девка империализма эта ваша 1С...
24 Провинциальный 1сник
 
24.02.15
21:50
Метод "Провести()", возвращающий значение - не лучше чем написанная криворуким писателем кода функция "ПроверитьВыполнениеУсловий()", возвращающий булево для проверки какого-то условия где-то далее.. в результате, через год даже сам автор не помнит, истину или ложь возвращает функция, если условия выполняются.. в общем, функция не должна именоваться как процедура.
25 GreyK
 
24.02.15
22:07
(24) "ПроверитьВыполнениеУсловий()" - должно возвращать результат всех условий. Есть обратная функция: "ПроверитьНеВыполнениеУсловий()". В чем проблема в возвращаемом значении?
26 miki
 
24.02.15
22:26
27 miki
 
24.02.15
22:33
28 zulu_mix
 
24.02.15
22:48
на асме формально функций нет. только proc
29 Asmody
 
24.02.15
23:10
(28) а в машине Тьюринга нет ни того, ни другого
30 bolobol
 
24.02.15
23:19
НаСервереБезКонтекста как-то нелепо использовать процедуры, но удобно, когда меняются передаваемые параметры.

При повторном использовании возвращаемых значений как-то нелепо использовать процедуры, ибо суть пропадает.
31 Крошка Ру
 
24.02.15
23:27
Добавьте уже голосовалку. Интеесно же кто кого заборет.
32 Крошка Ру
 
24.02.15
23:27
*интересно
33 Крошка Ру
 
24.02.15
23:28
Клавиатура что-то картавит
34 GreyK
 
24.02.15
23:29
(31) Заборет (30), у него трава более забористая.
35 vermouth
 
25.02.15
03:21
Фигассе обсуждение!!! представляю, что было б, если ТС спросил: нафига нужны циклы если есть условия и Перейти (GOTO)
36 SeraFim
 
25.02.15
03:35
Добрый день!
Когда применять вилку, а когда ложку?
Или без разницы?
Поделитесь опытом...
37 Лодырь
 
25.02.15
05:11
(36) Жидкое - ложкой, твердое - вилкой. Ну или если ты апологет этикета: в левую руку вилку, в правую - ложку.
38 VladZ
 
25.02.15
05:29
(37)  "в левую руку вилку, в правую - ложку.".  Э...  А еще нужно нож куда-то пристроить...  Вопрос: куда?
39 VladZ
 
25.02.15
05:30
(35) А вот это уже розжиг!!!
40 Лодырь
 
25.02.15
05:34
(38) Нож лучше в носок прятать, чтоб мусора не замели.
41 VladZ
 
25.02.15
05:41
(40) Смотря какой нож. Обычный кухонный можно и не прятать в носок. Иначе потом нарезанная колбаса будет пахнуть носками.
42 Лодырь
 
25.02.15
05:44
(41) Смотри на это с другой стороны - носки будут пахнуть колбасой! Да при занюхивании им цены не будет!
43 VladZ
 
25.02.15
05:48
(42) Опять дилемма: носки или колбаса?
44 SeraFim
 
25.02.15
06:47
(37) но ведь котлету можно и ложкой съесть
45 Web00001
 
25.02.15
06:59
(35)1Сники очень занятые люди...
46 Xapac
 
25.02.15
07:01
(44)можно и лопатой
47 Супер король
 
25.02.15
07:51
Это все равно что спорить что использовать, отчет или обработку.
(0) Без разницы вообще.
48 Провинциальный 1сник
 
25.02.15
07:58
(25) Ну и какой результат проверки условий считать положительным? Это плохой стиль кодирования, ибо программист, пишуший обращение к этой функции, вынужден лишний раз лезть в нижестоящий код или в документацию.

Правильно функцию назвать УсловияВыполнены() или соответственно УсловияНеВыполнены(). Та же 1с ведь правильно назвала встроенную функцию ЗначениеЗаполнено().. а не ПроверитьЗаполненность()! Хотя системности подхода им не хватает.. в одном месте правильно, в другом - чушь какая-то. Такое чувство, что язык разрабатывали разные люди, а общее руководство отсутствовало.
49 Провинциальный 1сник
 
25.02.15
07:59
(44) Ложка универсальнее для еды. Ей можно есть и первое и второе и даже компот. Вилка - инструмент узкоспециализированный.
50 User_Agronom
 
25.02.15
12:42
(15) Я думаю стоит обратиться к Pascal, как к языку, предназначенному для обучения программированию.

Описания
function MyFun(a: Real): Integer;
и
function MyFunOne(var a: Real): Integer;

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

Поэтому всё утверждение спорно.

(29) Давай не будем про машину Тьюринга. По моему там есть безусловные переходы, а значит подпрограммы возможны.
51 vermouth
 
25.02.15
20:51
(50) не!!! раз уж вспомнили Тьюринга - давайте вспомним и алгоритмы Маркова!!! а то несправедливо!!!
52 Torquader
 
26.02.15
19:55
(50) Будто бы в 1С нет ключевого слова Знач, которое позволяет передавать параметры по значению.
(48) Правильно написать "УсловияВыполнены(СписокПараметровДляПроверкиУсловий)", иначе программистам потом всё равно будет трудно понять, что выполняется внутри этой чудо функции.

Также очень обидно, что 1С не позволяет создавать в коде константы или перечисления (Enum) как в нормальных языках.
53 GreyK
 
26.02.15
20:26
(47) Это только в клюшках так.
(52) "Также очень обидно, что 1С не позволяет создавать в коде константы или перечисления (Enum) как в нормальных языках." - ссылочку пожалуйста на такие "нормальные языки", работающие с БД.
54 Torquader
 
26.02.15
22:39
(53) Тот же Си, например.
И причём тут БД.
Например, хочется, чтобы в коде некоторые значения были заранее заданы, как например КодВозвратаДиалога.
55 GreyK
 
26.02.15
23:03
(54) Любая функция 1С возвращает "что-то", и это "что-то" легко идентифицируется.
Ты, эта, добавь в Си над "Истиной" ещё одно значение перечисления: "Аксиома".
56 DJ Anthon
 
26.02.15
23:15
всегда функции, ибо букв меньше и можно в отладчике вызывать
57 DJ Anthon
 
26.02.15
23:17
(37) мне все время приносили плов и вилку. вопрос, как вилкой есть рассыпчатый плов? со временем переучил, теперь приносят правильно.
58 Zhuravlik
 
27.02.15
00:59
(0) Разграничение на п. и ф. необходимо для повышения читабельности кода, а также сокращения трудозатрат по его написанию. Ответить более точно на ваш вопрос может лишь личный опыт. Для примера возьмите любой модуль проведения напр. в Ут 10.3, и подумайте: что бы было, если все описать только процедурами? Во-первых будет очень объемный текстовый модуль, сложный для понимания. Во-вторых он будет очень трудозатратен к реализации.
Кстати, где-то слышал что код, реализованный подобным образом называется "лапша", т.е. когда куча разнотипных по смыслу действий, которые можно (нужно!) разбить на подпрограммы написаны все в одной процедуре. Также вспоминается фраза "Разделяй и властвуй": чтобы понять огромный механизм, достаточно его разделить на логические составляющие.

(54) А так?

&НаКлиенте
Перем СтруктураРасширенияИсточника;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ

//================================================================================================[27.02.2015 0:38:38]=
&НаКлиенте
Процедура ПриОткрытии(Отказ)
    СтруктураРасширенияИсточника = Новый Структура("хмл,хлс,дбф", "xml", "xls","dbf");
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ КОМАНД ФОРМЫ

//================================================================================================[27.02.2015 0:40:24]=
&НаКлиенте
Процедура ЧтениеФайла(Команда)
    
    Файл = Новый Файл(АдресФайла);
    
    // Вариант 1:
    Если файл.Расширение = СтруктураРасширенияИсточника.хмл Тогда
        // чтение XML....        
    КонецЕсли;
        
    // Вариант 2:
    Если файл.Расширение = сп_ТипРасширенияИсточника().хмл Тогда
        // чтение XML....    
        ПараметрыХМЛ = сп_ПараметрыОтРасширенияНаСервере(файл.Расширение);
    КонецЕсли;
    
КонецПроцедуры


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// СЛУЖЕБНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

//================================================================================================[27.02.2015 0:44:43]=
&НаСервере
Функция сп_ПараметрыХМЛНаСервере(РасширениеФайла)
    
    Если РасширениеФайла = сп_ТипРасширенияИсточника().хмл Тогда
        //.....
        Возврат Истина;
    КонецЕсли;
    
    Возврат Ложь;
КонецФункции

//================================================================================================[27.02.2015 0:34:55]=
&НаКлиентеНаСервереБезКонтекста
Функция сп_ТипРасширенияИсточника()
    Возврат Новый Структура("хмл,хлс,дбф", "xml", "xls","dbf");    
КонецФункции
59 orefkov
 
27.02.15
01:19
(0)
Применяй функцию тогда, когда не можешь применить процедуру. Так ты постигнешь дао 1С. И да пребудет с тобой Цикл.
60 program345
 
27.02.15
15:18
(59) Применяй функцию тогда, когда не можешь применить процедуру.
А когда нельзя применить процедуру?