|
процедура или функция? | ☑ | ||
---|---|---|---|---|
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) Применяй функцию тогда, когда не можешь применить процедуру.
А когда нельзя применить процедуру? |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |