Имя: Пароль:
1C
1С v8
Философский вопрос о коде
0 quest
 
03.06.12
17:07
1. 1 вариант 52% (14)
2. 2 вариант 48% (13)
Всего мнений: 27

Вот два примера условного кода. Они эквивалентны. Что делает УсловиеВыполнено() - не важно сейчас.
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;
   конецЦикла;
   возврат результат;
КонецФункции