|
Зачем нужна процедура? | ☑ | ||
---|---|---|---|---|
0
Zaid
07.05.10
✎
11:47
|
Собственно сабж :)
|
|||
1
VasiL-V
07.05.10
✎
11:51
|
Процедура чего Вас интересует? :)
|
|||
2
zelenii
07.05.10
✎
11:52
|
Наверное он про процедуру в языке 1с спрашивает.
|
|||
3
Ненавижу 1С
гуру
07.05.10
✎
11:52
|
(0) в смысле можно всегда функциями обойтись? ответ: в принципе, да
|
|||
4
Hazer79
07.05.10
✎
11:53
|
(0) Чтобы была
|
|||
5
VasiL-V
07.05.10
✎
11:53
|
(3) а всегда процедурами обойтись нельзя? :)
|
|||
6
Zaid
07.05.10
✎
11:55
|
(3) В том-то и дело, функция может все, что может процедура и даже чуть больше: возвращает значение, может прерваться в любом месте. И собственно вопрос, для чего вообще писать в коде слов "процедура"? Зачем придумали этот обрезанный по функционалу оператор?
|
|||
7
Hazer79
07.05.10
✎
11:55
|
(5) Возвращать значения через опу тогда ?
|
|||
8
Zaid
07.05.10
✎
11:56
|
(5) это извращение
|
|||
9
VasiL-V
07.05.10
✎
11:58
|
(7) Через переменные, ну в общем-то можно это назвать и через опу ))
|
|||
10
Jstunner
07.05.10
✎
11:58
|
везде есть процедуры. Например в Си они называются функциями не возвращающими значение :)
|
|||
11
Zaid
07.05.10
✎
12:00
|
(10) в Си есть только функции. Они могут ничего не возвращать. В 1сv8 кстати тоже. Так что в Си глупой непонятной процедуры нет. А в 1с она зачем-то есть. Портит внешний вид модуля, вносит хаос и неразбериху :))
|
|||
12
dk
07.05.10
✎
12:01
|
еще один Сишник прирерся ))
|
|||
13
Jstunner
07.05.10
✎
12:02
|
(11) в Си есть только скобочки, там нет не функций не процедур ))
|
|||
14
Jolly Roger
07.05.10
✎
12:02
|
(11) а о том, что функция ничего не возвращает, ты пишешь в комментариях?
|
|||
15
Лефмихалыч
07.05.10
✎
12:02
|
(14) нет, указывает тип возвращаемого значения void
|
|||
16
Jstunner
07.05.10
✎
12:03
|
(15) что читается, как "функция не возвращающая значение", кратко - процедура )
|
|||
17
Jolly Roger
07.05.10
✎
12:04
|
(15) похоже на то...
|
|||
18
Jstunner
07.05.10
✎
12:06
|
Наличие/отсутствие ключевого слова "Процедура" вопрос вкуса и привычки, не более..
В том или ином виде, процедуры существуют почти во всех языках. |
|||
19
Zaid
07.05.10
✎
12:08
|
(14) можно и так. А вообще не обязательно. Если ты используешь функцию (или процедуру), то предполагается, что ты знаешь, что она делает. При этом не важно, возвращает функция что-то или нет - ты можешь использовать ее как процедуру, не присваивая возвращаемое значение. Т.е. писать так:
//так правильно МояФункция(параметр1); //А можно так Результат = МояФункция(параметр1); |
|||
20
PowerBoy
07.05.10
✎
12:09
|
Умом 1с не понять - вот Select Case нет, а процедура есть.
:) |
|||
21
Jstunner
07.05.10
✎
12:12
|
Еще как важно, что функция возвращает. Например такой код не взлетит. Так как void f() - самая что настоящая процедура, а не функция :)
void f(); smth = f(); |
|||
22
Zaid
07.05.10
✎
12:13
|
(21) я про функцию в 1с
|
|||
23
Jstunner
07.05.10
✎
12:16
|
(22) налицо четкое разделение, и ключевое слово тебе как бы намекает, стоит ждать результат от метода или нет.
|
|||
24
kokamoonga
07.05.10
✎
12:16
|
(0) а если тебе нужно например заполнить таб. поле в форме? функцией? а что возвращать будешь и куда? и главное зачем?
|
|||
25
Wingless
07.05.10
✎
12:18
|
(6) а по каким причинам процедура не "может прерваться в любом месте"?
|
|||
26
Mitriy
07.05.10
✎
12:22
|
(25) по регилиозным...
|
|||
27
Mitriy
07.05.10
✎
12:22
|
(26)* религиозным...
|
|||
28
vetra
07.05.10
✎
12:23
|
(24) можно вернуть результат выполнения
|
|||
29
kokamoonga
07.05.10
✎
12:24
|
(28) а нафига козе баян?
|
|||
30
Zaid
07.05.10
✎
12:24
|
+(28) а можно и не вернуть :)
(25) затупил, прошу прощения. |
|||
31
Lama12
07.05.10
✎
12:24
|
Могу предположить, что процедура придумана для упрощения работы компилятора.
Т.е. на функцию нужно выделять память для результата (а он у нас практически всегда типа Variant), а на процедуру не нужно ничего выделять для результата. В результате экономится время компиляции и время выполнения (выделение памяти для результата). |
|||
32
Jstunner
07.05.10
✎
12:24
|
(28) справилсо/нет? Для таких целей гораздо удобней использовать исключения.
|
|||
33
kokamoonga
07.05.10
✎
12:25
|
(32) воистину
|
|||
34
Zaid
07.05.10
✎
12:26
|
(24) все можно сделать функцией. Возвращать результат при этом не обязательно. Т.е. слово "возврат" в функции можно и не писать.
(31) я тоже склоняюсь к этому, но хотелось бы знать точно. |
|||
35
kokamoonga
07.05.10
✎
12:28
|
(34) ну так тебе в (18) уже дан ответ зачем называть по-разному. а в (31) вероятная причина разделения
|
|||
36
Zaid
07.05.10
✎
12:29
|
||||
37
kokamoonga
07.05.10
✎
12:29
|
то что ты не пишешь Возврат не означает что компилятор ничего от функции не ожидает
|
|||
38
Jstunner
07.05.10
✎
12:29
|
В первом случае, не понятно, вернет ли функция преобразованную таблицу, или переделает переданную. Во втором - все ясно, не залезая в код, или коменты
Функция Преобразовать(Таблица) // КонецФункции Процедура Преобразовать(Таблица) // КонецПроцедуры |
|||
39
Megas
07.05.10
✎
12:30
|
(0) Логическое разделение...
Удобно! Видиш слово Функция и понимаеш что она что то возвращает! Видиш процедура и знаеш что она отработает и всё! |
|||
40
Zaid
07.05.10
✎
12:33
|
(38) Если тебе нужно использовать "преобразовать()" без присваивания результата - используй без:
Функция Преобразовать(Таблица) // Возврат Истина; КонецФункции; //Обработчик... Преобразовать(Таблица); //... |
|||
41
kokamoonga
07.05.10
✎
12:34
|
(40) спор ни о чем. ты сам-то потом код прочитаешь который на одних функциях налабал?
|
|||
42
la luna llena
07.05.10
✎
12:34
|
По теории функция должна только возвращать значение, не меняя среды, а процедура не должна возвращать значения.
|
|||
43
Zaid
07.05.10
✎
12:34
|
(37) а он ожидает?
|
|||
44
kokamoonga
07.05.10
✎
12:35
|
(43) а ты можешь однозначно утверждать что нет?
|
|||
45
Jstunner
07.05.10
✎
12:35
|
(40) в (38) ключевая фраза - "не залезая в код"
|
|||
46
Zaid
07.05.10
✎
12:36
|
(44) не могу. Поэтому и спрашиваю. Хочу знать точно. То, о чем пишешь ты - предположение. Я в (34) писал, что тоже склоняюсь к этому выводу.
|
|||
47
kokamoonga
07.05.10
✎
12:37
|
(46) а на (41) не желаешь ответ дать?))
|
|||
48
Jstunner
07.05.10
✎
12:37
|
(36) ты фанатик скорости и минимализма, в ущерб читаемости и простоты?
|
|||
49
zak555
07.05.10
✎
12:39
|
(0) используй их только в предопределённых
|
|||
50
Zaid
07.05.10
✎
12:39
|
(45) когда ты используешь функцию, ты знаешь что она должна делать. Вопрос возвращает она что-то или нет - не существеннен, т.к. если тебе результат не нужен, ты можешь его не использовать.
(47) сорри, пропустил этот пост. Да, легко. Разницы никакой - я об этом и пишу. В том числе и в этом самом посте, отвечая на 45. (48) читай внимательнее вики: "Также в сложных программах возникают большие «нагромождения» операторов try ... finally и try ... catch (try ... except)." |
|||
51
Zaid
07.05.10
✎
12:40
|
(49) что значит "только в предопределенных"?
|
|||
52
Сисой
07.05.10
✎
12:40
|
(0) не барань.
Процедура исторически родилась как инкапсуляция повторяемого кода программы. Например, вызовом процедуры можно считать команду GOSUB в классическом Бейсике. Процедуры в том или ином виде есть во всех языках 4GL, созданных до появления ООП. Иногда это вырожденная функция, как в Си (void mysub(int *a)). Более того, есть языки, где функций нет, а процедуры есть. В реалиях 90-х стало модно оперировать термином "метод" и процедуры стали методами объекта. Но поскольку 1С не поддерживает ООП, то и "методы" его описываются на уровне конструкций классического Паскаля - PROCEDURE и FUNCTION. |
|||
53
Zaid
07.05.10
✎
12:43
|
(52) ответ вида "дань традиции" и "у всех есть и у меня будет". Если это рудимент, почему от него не откажутся?
|
|||
54
zak555
07.05.10
✎
12:44
|
(51) есть же предопределённые процедуры в 1с - в итоге свои - используй, как функции !
|
|||
55
Ненавижу 1С
гуру
07.05.10
✎
12:44
|
вот пример:
Функция Пример() КонецФункции Процедура КнопкаВыполнитьНажатие(Кнопка) Сообщить(ТипЗнч(Пример())); КонецПроцедуры |
|||
56
Живой Ископаемый
07.05.10
✎
12:44
|
Опять на 1Сников напал зуд пофиксить мироздание.
|
|||
57
Ненавижу 1С
гуру
07.05.10
✎
12:45
|
в паскале они есть, в C-подобных тоже есть, считая, что если написано void Test() то это процедура
|
|||
58
Zaid
07.05.10
✎
12:46
|
(55) пример чего? не понял. На любое событие ты можешь назначить как процедуру, так и функцию:
Функция Пример() КонецФункции Функция КнопкаВыполнитьНажатие(Кнопка) Сообщить(ТипЗнч(Пример())); КонецФункции //Также как и Функция ПриЗаписи() // КонецФункции |
|||
59
Jstunner
07.05.10
✎
12:46
|
(53) так откажись, какие проблемы. Лишишь себя интуитивно понятной информации при повторном использовании кода.
|
|||
60
Zaid
07.05.10
✎
12:47
|
(59) смущает (31)
|
|||
61
Сисой
07.05.10
✎
12:47
|
(53) А зачем вот сейчас отказываться? Мне не мешает, коллег по работе спросил - не чешется. Может, мазь тебе какую купить, их много в аптеках бывает.
Блин, в платформе 8 дофига элементов кривизны, а он на процедуры напал... Которые как раз никаким боком ни на скорость, ни на надежность, ни на читабельность не влияют. |
|||
62
Jstunner
07.05.10
✎
12:48
|
(60) я и говорю, ты - ранний оптимизатор. У тебя есть средне-крупные законченные проекты?
|
|||
63
Поручик
07.05.10
✎
12:49
|
ЛЮДИИИИИИ!!!
Я всё понял, Zaid === Г.... 1С, только он у него такие тупоглубокомысленные темы. |
|||
64
Jstunner
07.05.10
✎
12:50
|
(62)+ если уж так тебя смущает, напиши простенький тест, да замерь
|
|||
65
Ненавижу 1С
гуру
07.05.10
✎
12:51
|
гораздо круче обсудить возвращаемые параметры по-умолчанию, и передаваемые в них константы, например
Процедура Тест(А=Неопределено) А=5; //как бы возвращается КонецПроцедуры Б=0; Тест(Б); Тест(7); Тест(); в нормальных языках возвращаемые параметры описываются отдельно(var, ref, &), а не по-умолчанию, в 1С все наоборот (Знач) |
|||
66
Ненавижу 1С
гуру
07.05.10
✎
12:52
|
тему про NULL, Неопределено и пустые ссылки стоит поднимать? ))
|
|||
67
anddro
07.05.10
✎
13:02
|
такое ощущение, что недавно эта тема уже обсуждалась.
у процедуры есть одна хорошая особенность: ее невозможно вызвать через табло. |
|||
68
Ненавижу 1С
гуру
07.05.10
✎
13:03
|
(67) что в этом хорошего?
|
|||
69
Zaid
07.05.10
✎
13:03
|
(64)
ТестПроцедуры(кк); 1 000 000 45,511313 48,57 ТестФункции(кк); 1 000 000 45,440559 48,49 Тест ничего не показывает... Однако ответ для себя я нашел ) Вероятно процедуру оставили как раз потому, что некоторым ее использование все-таки удобно. |
|||
70
anddro
07.05.10
✎
13:06
|
(68) то, что даже зная исходный код программы, пользователь не сможет выполнить определённые действия в обход основной логики.
|
|||
71
Ненавижу 1С
гуру
07.05.10
✎
13:07
|
(70) суровые челябинские пользователи?
|
|||
72
anddro
07.05.10
✎
13:10
|
(71) именно, в данном случае пользователем может считаться и администратор в удаленном филиале, который должен иметь ограниченные полномочия в базе, но ему это очень не нравится.
|
|||
73
hhhh
07.05.10
✎
13:22
|
(69) нет, ты точно Г...1С
|
|||
74
Abracadabra
07.05.10
✎
13:35
|
А Вы еще не наткнулись на ошибку "Обращение к процедуре как к функции" или "Обращение к функции как к процедуре"? Неужели так тяжело догадаться, что предназначение процедуры - выполнение действий, а предназначение функции - получение значения?
|
|||
75
Zixxx
07.05.10
✎
13:37
|
(0) Процедура тоже возвращает значение
Процедура КнопкаВыполнитьНажатие(Кнопка) А = 0; НашаПроцедура(А); Сообщить(А); КонецПроцедуры Процедура НашаПроцедура(А) А = 1; КонецПроцедуры |
|||
76
GedKo
07.05.10
✎
13:40
|
(75) это не возврат значение, а изменение параметров среды выполнения.
|
|||
77
fisher
07.05.10
✎
13:42
|
(0) Затем же, зачем разделение на отчеты и обработки.
Для наглядности. Разделение на функции и процедуры присутствует в большинстве высокоуровневых языков. 1С тут не оригинально. |
|||
78
Ненавижу 1С
гуру
07.05.10
✎
13:43
|
(74) "Обращение к функции как к процедуре" не бывает, о том и речь
|
|||
79
Abracadabra
07.05.10
✎
13:48
|
(78) если функция возвращает значение, а это значение никуда не помещается, то будет выдано такое сообщение...
|
|||
80
Ненавижу 1С
гуру
07.05.10
✎
13:51
|
(79) ты бы попробовал прежде чем писать эту ерунду
кстати, большинство ЯП позволяют это делать |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |