|
Философский вопрос о коде | ☑ | ||||||
---|---|---|---|---|---|---|---|---|
0
quest
03.06.12
✎
17:07
|
Вот два примера условного кода. Они эквивалентны. Что делает УсловиеВыполнено() - не важно сейчас.
1. Функция Вариант1(ТЗ) для каждого х из ТЗ цикл если УсловиеВыполнено(х) тогда возврат истина; конецЕсли конецЦикла; возврат ложь; КонецФунции 2. Функция Вариант2(ТЗ) результат = ложь; для каждого х из ТЗ цикл если УсловиеВыполнено(х) тогда результат = истина; прервать конецЕсли конецЦикла; возврат результат; КонецФунции Но вот какой из варинатов лучше? |
|||||||
35
aleks-id
03.06.12
✎
18:20
|
(32) потому что цикл не всегда оптимальное решение. как например в этом случае. и запрос всего-навсего должен вернуть количество, а функция вернуть РезЗапроса.Количество > 0
|
|||||||
36
DrShad
03.06.12
✎
18:20
|
(32) а лучше по циклу вызов функции гонять?
|
|||||||
37
aleks-id
03.06.12
✎
18:21
|
(34) с такими вопросами тебя из серьезных контор погонят метлой
|
|||||||
38
aleks-id
03.06.12
✎
18:22
|
(*старательно пишет в блокнотик " batman69 - копрокодер " *)
|
|||||||
39
quest
03.06.12
✎
18:23
|
(33) Ок, давай, пиши функцию для такого случая -
ТЗ = новый массив; ТЗ.Добавить(новый структура("Поле1,поле2,поле3",0,1,2)); ТЗ.Добавить(новый структура("Поле1,поле2,поле3",0,1,2)); ТЗ.Добавить(новый структура("Поле1,поле2,поле3",0,1,2)); |
|||||||
40
vde69
03.06.12
✎
18:24
|
Если функция возвращает значение - то оператор "Возврат" должен быть один, и желательно в самом конце функции, что-бы его легче было найти.
по этому второй вариант более читабельным 2 вариант |
|||||||
41
quest
03.06.12
✎
18:24
|
(37) прежде чем категоричо так заявлять - ты бы хоть подумал для разнообразия что ТЗ - не обязательно ТаблицаЗначений.
|
|||||||
42
Feanor
03.06.12
✎
18:24
|
(36) а чем плохо? Допусти, что "УсловиеВыполнено()" требуется проверять и для отдельно взятой строки (например, при редактировании ТЧ формы), и для всех строк в коллекции.
|
|||||||
43
aleks-id
03.06.12
✎
18:25
|
(41) я тебя просил выложить рабочий код. чего ты щас мне в очередной раз какую то хню подсовываешь?
|
|||||||
44
DrShad
03.06.12
✎
18:25
|
(39) за такое можно и по морде отхватить
|
|||||||
45
Партизан
03.06.12
✎
18:26
|
не надо плодить лишние сущности, в данном случае переменная "результат"
1 вариант |
|||||||
46
quest
03.06.12
✎
18:26
|
(43) ты действительно не понимаешь что пример - надуманый???? он не из реального кода. Я его придумал пока писал.
|
|||||||
47
quest
03.06.12
✎
18:27
|
(44) Аргументируй.
|
|||||||
48
batman69
03.06.12
✎
18:27
|
(41)+ 100500 )))
|
|||||||
49
DrShad
03.06.12
✎
18:27
|
(45) а функции как в (27) в контексте (0) нужно плодить?
|
|||||||
50
Professor_1С
03.06.12
✎
18:27
|
...я обычно так делаю.
2 вариант |
|||||||
51
batman69
03.06.12
✎
18:28
|
Все потому, что прогеры с "образованием" ))) думать совсем не могут, штампы одни )))
|
|||||||
52
aleks-id
03.06.12
✎
18:28
|
(41) это щас так модно изголяться?
МойМассив = Новый ТаблицаЗначений; или МойСписокЗначений = Новый Массив; |
|||||||
53
DrShad
03.06.12
✎
18:28
|
(47) переменные должны называться интуитивно-понятно этого даже 1С требует, не говоря уже о тех кто будет читать код после тебя
|
|||||||
54
batman69
03.06.12
✎
18:30
|
(53)Согласен, но за каким х..., исходя из названия переменной сразу плодить штампованное решение? Самым крутым показаться хочется? А, автор молодец, что в это носом ткнул +1000
|
|||||||
55
aleks-id
03.06.12
✎
18:30
|
(51) иди завидуй в оффтоп. именно там у тебя больше всего мессаг.
|
|||||||
56
batman69
03.06.12
✎
18:31
|
Вот так вас дураков и нужно на работу принимать.
|
|||||||
57
DrShad
03.06.12
✎
18:31
|
да и накуя на форум постить код с такими "хрен пойми что это" переменными? чтоб потролить?
|
|||||||
58
quest
03.06.12
✎
18:31
|
(52) ты с темы то не съезжай. Пиши функцию которая запросом обработает то что в (39) написано
(53) не спорю. Но еще раз говорю - код в (0) просто пример. Причем не пример наименования переменных, а стилей програмирования. |
|||||||
59
Партизан
03.06.12
✎
18:31
|
(49) нет
|
|||||||
60
DrShad
03.06.12
✎
18:31
|
(54) в (57) ответ на твой вопрос
|
|||||||
61
vde69
03.06.12
✎
18:32
|
(23) +100
|
|||||||
62
DrShad
03.06.12
✎
18:32
|
(58) если напишу, что даешь?
|
|||||||
63
batman69
03.06.12
✎
18:33
|
Вот - вопрос про стиль, согласен, а эти сразу со своими запросами полезли, ну нахрена?
|
|||||||
64
aleks-id
03.06.12
✎
18:33
|
(57) да ладно бы так. человек спросил мнение. я свое мнение сказал, что по хорошему так не делают ибо копрокод. а он чото обиделся и вместо того чтобы принять и исправить, начал херь всякую сочинять тут. и этот 69 еще, кулацкий подпевала. надеюсь это его возраст а не любимая поза?
|
|||||||
65
DrShad
03.06.12
✎
18:34
|
(63) а запрос не стиль работы с ТаблицамиЗначений? мне проще ТЗ через запрос обработать, чем гонять по ней цикл
|
|||||||
66
Партизан
03.06.12
✎
18:34
|
ИМХО НаСИльники выбирают 1й вариант,
Пасквилянты (@Result) второй ? |
|||||||
67
batman69
03.06.12
✎
18:35
|
(65)Ну, у тебя то , конечно весь код идеален ))))
|
|||||||
68
DrShad
03.06.12
✎
18:35
|
(64) надеюсь ты [и этот 69 еще] не про vde69?
|
|||||||
69
batman69
03.06.12
✎
18:35
|
(67) к (64)
|
|||||||
70
DrShad
03.06.12
✎
18:35
|
(67) есть сомнения?
|
|||||||
71
aleks-id
03.06.12
✎
18:37
|
(58) это не стиль а гамно! но если исходить только из имеющегося условия, то тебе уже написали и не раз - выход должен быть один и в самом конце.
|
|||||||
72
aleks-id
03.06.12
✎
18:38
|
(68) не. vde адекват :)
|
|||||||
73
Партизан
03.06.12
✎
18:38
|
(71) пасквилянт или насильник?
|
|||||||
74
quest
03.06.12
✎
18:39
|
да ё моё... чего все так перевозбудились? в (0) вопрос как с вашей точки зрения лучше организовывать возврат в функции.
Все. Других вопросов там нет. |
|||||||
75
DrShad
03.06.12
✎
18:39
|
(58) при условии что ТЗ это массив содержащий структуры, то отсутсвие одного из ключей структуры вызовет критическую ошибку, а следовательно функция из (27) лажовая
|
|||||||
76
DrShad
03.06.12
✎
18:40
|
(74) где вариант 3. Запросом ?
|
|||||||
77
Азазелло
03.06.12
✎
18:40
|
В целях отладки удобнее
2 вариант |
|||||||
78
mirosh
03.06.12
✎
18:40
|
я за второй вариант, отладка,универсальность и прочее
2 вариант |
|||||||
79
DrShad
03.06.12
✎
18:42
|
+(75) либо значение по структуре не число будет и тоже "вторая смена!"
|
|||||||
80
aleks-id
03.06.12
✎
18:42
|
(73) асмовец :)
|
|||||||
81
batman69
03.06.12
✎
18:43
|
(74)Лучше - 2, так как он не плодит сущности. А в целом, считаю, что вопрос автором был поставлен корректно, и то что некоторые тут так восстали что бы показать свою самость, это их проблемы. )))
|
|||||||
82
batman69
03.06.12
✎
18:43
|
Да ..
2 вариант |
|||||||
83
quest
03.06.12
✎
18:43
|
(76) да задолбали вы своими запросами.
Перепишу код из (0) вот так 1. Функция Вариант1(ЛюбаяКоллекция) для каждого х из ЛюбаяКоллекция цикл если УсловиеВыполнено(х) тогда возврат истина; конецЕсли конецЦикла; возврат ложь; КонецФунции 2. Функция Вариант2(ЛюбаяКоллекция) результат = ложь; для каждого х из ЛюбаяКоллекция цикл если УсловиеВыполнено(х) тогда результат = истина; прервать конецЕсли конецЦикла; возврат результат; КонецФунции |
|||||||
84
Партизан
03.06.12
✎
18:44
|
(80) на асме будешь писать jmp к концу функции вместо того чтобы сразу retn ?
я за быстродействие и минимальное использование памяти 1 вариант |
|||||||
85
Mort
03.06.12
✎
18:44
|
В дремучие времена отсутствия модульного программирования, структур данных и областей видимости, функции были на 8-20 листов (экранов). И затерять возврат из такой функции в центре кода было не совсем этично. Сейчас, когда функция больше одного-двух экранов уже смахивает на г-код, возврат из середины функции гораздо лучше читается чем переход в конец модуля.
1 вариант |
|||||||
86
quest
03.06.12
✎
18:44
|
+(83) функция УсловиеВыполнено() возвращает либо истину либо ложь.
|
|||||||
87
batman69
03.06.12
✎
18:45
|
(83)Ты, не переживай, просто на мисте это прикол такой, не разобравшись, сразу себя самыми крутыми кодерами выставлять, да попутно остальных приспустить... традиция такая ))))
|
|||||||
88
Партизан
03.06.12
✎
18:46
|
а вообще "проблема" В (0) выеденного яйца не стоит, каждый руководствуется своими соображениями, которые считает более важными
|
|||||||
89
andrewks
03.06.12
✎
18:47
|
когда одинесникам делать нечего, они... начинают философствовать на тему оформления кода
3. 3 вариант |
|||||||
90
aleks-id
03.06.12
✎
18:47
|
(86) а функция Вариант_х что возвращает? результат функции УсловиеВыполнено() ? и еще скажи что это не копрокод!
кстати, твой код из (27) будет всегда возвращать ложь. ибо не подгонишь ты настолько значения колонок. |
|||||||
91
batman69
03.06.12
✎
18:48
|
(85)В целом согласен,но если у тебя не одна проверка, а скажем три или 10, и ты каждый раз будешь писать возврат? Не красиво, не рационально и не читабельно.
|
|||||||
92
aleks-id
03.06.12
✎
18:48
|
(84) обалдел? перед ret будет jz на начало цикла.
|
|||||||
93
DrShad
03.06.12
✎
18:49
|
(90) да не поймут они этого
|
|||||||
94
batman69
03.06.12
✎
18:50
|
(90)Чушь несешь опять, ну откуда ты знаешь что у него там за значения в колонках? Что за условия задачи? Может там по условию задачи только одно значение в Ложь уйдет, что ты опять умничаешь на ровном месте?
|
|||||||
95
Mort
03.06.12
✎
18:51
|
(91) Да никогда не придется писать портянку из 10 проверок, если организовать решение правильно.
|
|||||||
96
batman69
03.06.12
✎
18:52
|
(95)Ну, тут ты прав )))
|
|||||||
97
DrShad
03.06.12
✎
18:52
|
(94) в (90) все верно написано одна функция возвращает значение другой - зачем?
|
|||||||
98
quest
03.06.12
✎
18:55
|
(90)
да! это г*внокод. да! это не работает и работать не будет никогда. да! мне никто не подаст руки и проклянут после смерти. ушел самоубиваться |
|||||||
99
vde69
03.06.12
✎
18:55
|
(89)
приходят немец,русский и поляк в публичный дом, на входе их "мамочка" спрашиваю - для подбора оптимальных кандидаток скажите размер члена - Н 22 см - П 18 см - Р 12 см ну послали их в 3 разных комнаты, у немца с поляком все нормально а из комнаты куда послали русского крик, и жрица бегом от туду. "мамочка" ее спрашивает - ты чего, ведь тебе достался с самым маленьким членом, все проще простого - так русские дураки всегда путают длину и диаметр... я это к чему, к тому, что мерятся можно только зная четкие правила и условия, по этому размер как правило не сильно имеет значение :) |
|||||||
100
DrShad
03.06.12
✎
18:56
|
(98) да ладно тебе так убиваться-то... расслабься
|
|||||||
101
DrShad
03.06.12
✎
18:57
|
(99) записал, анек жизненный - респект
|
|||||||
102
batman69
03.06.12
✎
18:57
|
(95)Хотя... есть у тебя список (Ну, чтоб без запросов ))) ) из 20 строк из них 15 разные, и решение нужно принимать в зависимости от значения. case нету... какое решение?
|
|||||||
103
Партизан
03.06.12
✎
18:58
|
(91) очень даже читабельно, не нужно изучать остаток кода до конца функции, все сразу ясно и понятно и главное определенно, а с переменной "результат" можно было бы "передумать" и получить то, что где-то до конца функции присвоено уже совсем другое значение.
|
|||||||
104
batman69
03.06.12
✎
19:01
|
(103)Что значит не нужно? Ты когда код читаешь - знаешь значение на возврат? Откуд ты знаешь что именно на этом возврате нужно остановиться?
|
|||||||
105
Партизан
03.06.12
✎
19:06
|
(104) когда ищешь отладчиком ошибку в чужом коде, который впервые видишь, отладка так быстрее
|
|||||||
106
DimVad
03.06.12
✎
19:12
|
Первый вариант быстрее и легче читается - требует меньше "мозговых тактов" ;-)
1 вариант |
|||||||
107
NcSteel
03.06.12
✎
20:53
|
(95) Посмотри типовые функции обмена с КПК
|
|||||||
108
NcSteel
03.06.12
✎
20:55
|
Методология мля.
2 вариант |
|||||||
109
0_Serg_0
03.06.12
✎
21:38
|
однозначно первый красивше
...но согласен с ораторами считающими как в (22) 1 вариант |
|||||||
110
serffer
03.06.12
✎
21:42
|
Я за код который легче поддерживать и дорабатывать.
2 вариант |
|||||||
111
orefkov
03.06.12
✎
21:42
|
"Make it as simple as possible, but not simpler" (с)
Делай так просто, насколько возможно, но не проще. 1 вариант |
|||||||
112
dklushin
03.06.12
✎
22:18
|
в данном случае вариант 1. Если много возвратов и расчёты результата - то конечно 2, и никак иначе
|
|||||||
113
dklushin
03.06.12
✎
22:19
|
вариант 1
1 вариант |
|||||||
114
experimentator76
03.06.12
✎
22:22
|
пользую оба варианта
и так и так правильно тему можно закрывать |
|||||||
115
dklushin
03.06.12
✎
22:23
|
(110) +1 согласен, когда идёт усложнение, то лучше конечно результат возвращать в одном месте, я всегда так и делаю(тоже задавался такой дилемой), но тот хoвнoкод, который в (0) понятнее будет именно вариант 1, автор не спросил про вариант усложнения
|
|||||||
116
dklushin
03.06.12
✎
22:38
|
Кстати я аргументирую почему творение(0) в обоих вариантах копрокод. Потому что нехер плодить кучу функций, типа
Фунцкия ПолучитьКТОЯ() Рез = ПолучитьСтатусМеня(); Если Рез="Кодер" Возврат СокрП(СокрЛ(Рез)); Иначе Возврат СокрЛ(СокрП(Рез)); КонецЕсли; КонецФункции Фунцкия ПолучитьСтатусМеня() Возврат "Гавнакодер" КонецФункции Нельзя всё в одной сделать? Я уверен, что в 99% случаев твою функцию Вариант() не надо было создавать, если она вызывается из одного места. |
|||||||
117
experimentator76
03.06.12
✎
22:56
|
(116) это условные примеры которые в жизни встречаются
что касается вложений то их конечно нужно минимизировать хотя иногда когда кода МНОГО - его выношу в подпроцедуры для наглядности кода |
|||||||
118
experimentator76
03.06.12
✎
22:58
|
+ и конечно же если условие в цикле - запрос или другое обращение к данным базы - то его нужно выносить за пределы цикла
то есть условие должно быть простым и к данным уже в памяти |
|||||||
119
dklushin
03.06.12
✎
23:01
|
(117) вот когда я писал на кошерном с#, нас учили изначально, имеет смысл выносить код в отдельную функцию если:
1. Есть повторяющиеся куски кода 2. Код функции занимает более 2-3 экранов Если случается второе, то очевидно код кривой и в 50% случаев случается вариант 1 в неявном виде. Но в типовых модулях 1с часто вижу код на оочень много экранов, причём 2-3 это чисто текст запроса. Так что всё нормально, но резать процедурку можно по желанию. |
|||||||
120
Torquader
03.06.12
✎
23:04
|
(119) Нельзя путать компилируемые и интерпретируемые языки - для первых можно указать возможность inline-функций, которые просто будут поставлены в код в место вызова.
В случае же интерпретируемых языков всё исполняется, как есть - и при выносе кода в функцию будет просто задержка на её вызов (причём здесь это не один оператор перехода, а серьёзная подготовка и перемещение данных). |
|||||||
121
dklushin
03.06.12
✎
23:10
|
(120) здесь имхо оптимизация последнее дело. Но так-то да, ещё один аргумент в пользу уменьшения функций. Кто-нибудь замерял сколько длится вызов функции. Про подготовку данных - в 1с передача параметров по умолчанию по ссылке, так что тут всё норм. Вот возврат, особенно если это ТаблицаЗначений, большая проблема. особенно если это стотыщ строк
|
|||||||
122
experimentator76
03.06.12
✎
23:21
|
(119) случается и без запросов что текст процедуры большой - например загрузка из разновидностей входящих форматов
цель одна а содержание разное |
|||||||
123
experimentator76
03.06.12
✎
23:24
|
(121) в одноэсе всегда ссылка для "сложных" типов )
так что быстро все и без задержек я в отладчике к примеру никогда не замечал что огромная таблица вызывает задержки и на в замере это не отражается |
|||||||
124
quest
03.06.12
✎
23:31
|
(116) чукча - писатель? на предыдущей странице было сказано что код - просто от балды написан. не несет никакой смысловой нагрузки... Ты же не пытаешься оценить хелловорд с точки зрения оптимальности или соответствия каким-то стандартам.
Что же касается твоего мнения и 99% процентов случаев - то это твой опыт. Он основан на задачах которые ты решал. Мой говорит как раз о том что надо вынести функцию, потому что таковы были мои задачи. |
|||||||
125
iceman2112
03.06.12
✎
23:35
|
Это же очевидно
1 вариант |
|||||||
126
dklushin
03.06.12
✎
23:44
|
(124) давай без оскорблений пожалуйста, опытный писатель. Какую функцию написал, про ту и говорим. Что её нет смысла выносить в отдельную.
2 вариант |
|||||||
127
quest
03.06.12
✎
23:52
|
функция в (0) это тестовый пример. И вопрос стоял - какой код проще воспринимается - с одной точкой выхода или несколькими. Вопроса оценивать эффективность кода не стояло.
Извини, про чукчу действительно зря сказал. В будущем постараюсь воздержаться. |
|||||||
128
dklushin
04.06.12
✎
00:00
|
(127) в общем теперь поняли друг друга, отлично. Но согласись, целесообразность использования варианта 1/2 опять же от контекста зависит. Так-то второй более кошерен. Зачастую при отладке трудно отловить точку выхода, поставил брейкпоинт, а хрен там, не поймал, ищешь другой "возврат". А в приведённом выше коде конечно лаконичнее 1. Или например если огромный код, точка выхода в самом конце. И в начале, идёт проверка условия и выход, тут тоже вариант 1 более удобен.
2 вариант |
|||||||
129
dklushin
04.06.12
✎
00:02
|
что бесспорно, это (99). потому что всё относительно)))
|
|||||||
130
ChAlex
04.06.12
✎
00:05
|
Господа, вам нечем занятся? я фигею...
|
|||||||
131
AlexSmolensky
04.06.12
✎
00:21
|
(0) Утверждение, что "функция должна иметь одну точку выхода". Вероятно пошло с тех пор, когда программисты заботились о создании переменных в памяти в начале функции и очистке памяти от временных переменных при её завершении. В те времена, конечно вариант 2) будет однозначно правильным. Но сегодня платформа 1С сама об этом заботится.
Первый вариант чуть лучше читается (меньше строк). Других аргументов не вижу. 1 вариант |
|||||||
132
iithethethe
04.06.12
✎
00:38
|
чувствуется уровень профессионализма на месте, а по теме за оба варианта 2
|
|||||||
133
quest
04.06.12
✎
01:49
|
миста и профпригодность - это как-бы не коррелирующие понятия. И вопрос был задан провокационный, и именно в такой форме. В принципе с тем же успехом можно было спросить и про отношение народа к goto. Ну или про другие случаи оформления кода. Мое мнение по этому вопросу в принципе простое - нормальный специалист легко разберется и в случае 1 и в случае 2. При большом количестве точек выхода - просто перепишет код под себя, забив болт на правила оформления кода, читабельность и т.д. Просто потому что ему так удобно.
Всем кто принимал участие - спасибо. На следующие выходные снова работать - припасу травы на субботу. С новой рабочей неделей всех! |
|||||||
134
Infsams654
04.06.12
✎
09:02
|
(133) возврат, прервать, продолжить из цикла - это как раз и есть goto.
противники делают так Функция Вариант3(ТЗ) результат = ложь; ном = 0; пока не результат и ном < ТЗ.количество() цикл если УсловиеВыполнено(ТЗ[ном]) тогда результат = истина; конецЕсли ном = ном + 1; конецЦикла; возврат результат; КонецФункции |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |