Имя: Пароль:
IT
 
Блочный оператор в одну строку
,
0 trad
 
15.07.20
12:21
1. Вариант Б 78% (43)
2. Вариант А 22% (12)
Всего мнений: 55

Как вы пишете блочные операторы Если, Пока, Для, Попытка и т.п. если в теле всего один исполняемый оператора?

Вариант А:
Если А=Б Тогда Возврат; КонецЕсли;

Вариант Б:
Если А=Б Тогда
    Возврат;
КонецЕсли;
200 Шоколадная страсть
 
17.07.20
05:20
(199) Кроме входных параметров.
201 Провинциальный 1сник
 
17.07.20
05:57
(67) "не равно на 3 цикла дольше сравнения"
Непонял. И равенство и неравенство - это результат выполнения инструкции вычитания (в варианте cmp, без сохранения результата) и последующего условного перехода по флагу: нулевой или не нулевой результат (jz, jnz). Инструкции jz и jnz эквивалентны в плане быстродействия.
202 Пробел
 
17.07.20
06:00
единообразие в приоритете

Вариант Б
203 rphosts
 
17.07.20
06:28
1.Вариант Б!
Ибо другие варианты  ересь! И за другие варианты гнать ссаными тряпками и сраной метлой в ассенизаторы из профессии.

Вариант Б
204 vi0
 
17.07.20
07:04
(194) Шоколад не виноват. Пацан к успеху шёл, не получилось, не фартануло
205 Провинциальный 1сник
 
17.07.20
07:45
(195) В идеале, никакая функция не должна ничего в базе изменять. Технически для этого перед выполнением должен создаваться снапшот базы и состояния сервера, доступный лишь для этой функции. А все изменения должны производиться лишь процедурами.
206 Полован
 
17.07.20
07:48
(205) А чем процедура отличается от функции, по-вашему?
207 Провинциальный 1сник
 
17.07.20
07:55
(206) Идеологически или технически? Идеологически очень многим. Функция - это значение. Процедура - это действие. Технически - зависит от языка и среды, в Си например всё функции, но Си это "переносимый ассемблер".
208 Ненавижу 1С
 
гуру
17.07.20
08:18
209 tciban
 
17.07.20
08:44
Нужно делать структурируемый, удобно читаемый код

Вариант Б
210 trad
 
17.07.20
09:52
(207) не возражения ради. Просто уточнить.

Если Процедура - как действие, должна вернуть результат действия, она может же быть функцией?
211 olegves
 
17.07.20
10:00
так нагляднее

Вариант Б
212 Eiffil123
 
17.07.20
10:11
(163) >> 1. Возврат результата из функции должен быть один.

Этот стандарт нигде не соблюдается. Взять хотя бы код на java - там сплошь и рядом несколько возвратов из метода.
213 Eiffil123
 
17.07.20
10:13
(174) ну так не используйте. отключите в своих браузерах запуск JavaScript в знак протеста против языка.
214 ДенисЧ
 
17.07.20
10:19
(212) Тут мои соседи сплошняком паркуются на газоне. Но это же не повод?
Запустил вчера проверку конфигурации (от 1с) на уг11.4 - 77 тысяч сообщений...
И что теперь - писать неправильно?
215 Провинциальный 1сник
 
17.07.20
10:20
(210) Пусть возвращает, через изменения параметров
216 ДенисЧ
 
17.07.20
10:20
217 ДенисЧ
 
17.07.20
10:22
Уг 11.4.8.92, если что
218 trad
 
17.07.20
10:31
(216) что за инструмент такой?
извините, я просто вчера с дерева слез )
219 trad
 
17.07.20
10:32
(215) это же чертовски неудобно (
220 orefkov
 
17.07.20
11:13
(219)
У людей каша в голове, говорят о процедурах-функциях, а на самом деле пытаются о "функциях с побочными эффектами" и "функциях без побочных эффектах". Почему они считают, что в этой парадигме функция с побочными эффектами должна называться "Процедура" и не должна иметь возвращаемого значения - хрен их поймешь.
221 vi0
 
17.07.20
11:24
(207) "Функция - это значение" в математике?
Или откуда такие ограничения?
222 fisher
 
17.07.20
11:29
(220) Вероятно, травматические последствия знакомства с функциональными языками.
223 Ненавижу 1С
 
гуру
17.07.20
11:29
(220) потому что есть такая парадигма (208)
224 fisher
 
17.07.20
11:36
Функции без побочных эффектов - это очень гуд и всячески приветствуются. Но очень далеки от догмы.
225 fisher
 
17.07.20
11:41
Я скорее за то, чтобы запретить процедурам возвращать значения, чем за то, чтобы запретить функциям менять состояние.
226 Полован
 
17.07.20
11:44
(218) АПК, вроде бы :)
227 acht
 
17.07.20
12:05
(220) Потому что там каша парадгим, смесь функциональщины, императивности и ООП, приправленные желанием иметь свое неоспоримое мнение. Представь, что будет, когда они услышат про методы объекта, которые возвращают, например, код результата, и при этом изменяют состояние объекта? =)
228 Провинциальный 1сник
 
17.07.20
12:49
(221) Математическое определение функции знаешь? А процедура - это просто именованная последовательность действий. Давайте не будем только упоминать язык Си и производные.
229 Провинциальный 1сник
 
17.07.20
12:51
(225) А меня реально бесят функции с императивным именованием типа ПолучитьСуммуЗадолженностиКлиента(Клиент), вместо СуммаЗадолженностиКлиента(Клиент). К сожалению, такое даже в типовых постоянно встречается. Хотя в стандартах разработки от 1с это не приветствуется.
230 Ненавижу 1С
 
гуру
17.07.20
13:10
(229) в типовых таких дофига
231 vde69
 
17.07.20
13:58
По моему вполне нормальные названия:

ПолучитьСуммуЗадолженностиКлиента(Клиент)
РасчитатьСуммуЗадолженностиКлиента(Клиент)

а вот так уже не очень выглядит
СуммаЗадолженностиКлиента()
РасчитатьСуммуЗадолженностиКлиента(Клиент)


Названия должны учитывать общую стилизацию а не только отражать прямой смысл.
232 Вафель
 
17.07.20
14:00
(231) 1с уже не согласна с тобой
233 Провинциальный 1сник
 
17.07.20
14:18
(231) Вы не так понимаете. Я о том, когда пишут Задолженность=ПолучитьСуммуЗадолженностиКлиента(Клиент) - то есть именование функции, возвращающей значение, как действия. Если же пишут ПолучитьСуммуЗадолженностиКлиента(Клиент), имея в виду процедуру, которая куда-то там получает сумму задолженности - это нормально.
234 fisher
 
17.07.20
15:03
(229) Императивному коду - императивные наименования. Аналог Get. Как раз в качестве признака того, что это именно функция и скорее всего без побочных эффектов (ну, по основному ее назначению, по крайней мере). Если существительным, то в выражениях даже не сразу и поймешь, что это название метода а не переменной.
235 acht
 
17.07.20
15:05
(231) > учитывать общую стилизацию

РассчитатьСуммуЗадолжности(Клиент, СуммаЗадолжности);
СуммаЗадолжности = СуммаЗадолженностиКлиента(Клиент);

Вот тебе и стилизация
236 vi0
 
17.07.20
15:16
(228) Так ты не ответил на мои вопросы
237 vi0
 
17.07.20
15:17
(229) а get.. set.. тебя тоже бесят?
238 vi0
 
17.07.20
15:32
(229) такие именования комфортно читаются, что немаловажно
например в тему из xUnitFor1C конструкция:
Ожидаем.Что("Некая строка").ИмеетДлину(12);
239 fisher
 
17.07.20
15:32
В функциональных языках, где функция является основной управляющей структурой и все функции при этом чистые - там да. Там обзывать функции как действия никакого смысла нет в принципе.
240 Злопчинский
 
17.07.20
16:06
(229) "ПолучитьСуммуЗадолженностиКлиента(Клиент), вместо СуммаЗадолженностиКлиента(Клиент)."
это вообще бяка.
д.б. типа

КлиентСуммаЗадолженности(Клиент).
.
тупо хотя бы для того, чтобы все функции, имеющие отношение к клиенту, лежали "рядом" при выборке названий функций.
потому что для нас важна не сумма задолженности вообще (чья?). а конкретная к конкретному объекту. рускавай езык велик и могуч, но лучше если придерживаться "подлежащее-сказуемоле)
241 novichok79
 
17.07.20
16:44
(240) если это 8.3 там есть области для этого. в 7.7 наверное приходится извращаться.
242 Конструктор1С
 
17.07.20
16:56
(160) значение по-умолчанию можно присвоить и без операторов возврата. А одна точка останова ну такое себе преимущество, ведь большинство ошибок скрываются за логическими ветвлениями, и их нужно проверять в первую очередь, а не конечное значение
243 Шоколадная страсть
 
17.07.20
17:17
(229) >> А меня реально бесят функции с императивным именованием типа ПолучитьСуммуЗадолженностиКлиента(Клиент), вместо СуммаЗадолженностиКлиента(Клиент).

Я пока в этом сомневаюсь. И тот вариант кажется верным, и другой, в разных ситуациях. Например, если у тебя переменная называется СуммаЗадолженностиКлиента, то по логике функция должна называться ПолучитьСуммуЗадолженностиКлиента. Вот так:

Перем СуммаЗадолженностиКлиента = ПолучитьСуммуЗадолженностиКлиента(Клиент);

Выглядит логично.

С другой стороны, функция с таким именем была бы удобна если забыть про промежуточную переменную:

Возврат СуммаЗадолженностиКлиента(Клиент);

Какой вариант не правильный, и почему?
244 Смотрящий
 
17.07.20
17:20
(240) По идее вообще должно быть КлиентЗадолженностьСуммаПолучить(Клиент)
245 vi0
 
17.07.20
17:20
(240) чтобы они лежали рядом должно быть Клиент.СуммаЗадолженности()
246 Шоколадная страсть
 
17.07.20
17:29
Друзья, с функциями все понятно, чистые это бесспорно хорошо.
А как вы относитесь к условиям внутри чистых функций? А так же к переменным внутри чистых функций? Лично я от них полностью отказался, и увидел что это хорошо.
В процедурах на этот принцип пофиг, их ничто не испортит, ибо они и так грязные. А функции стараюсь делать идеальными.
247 Шоколадная страсть
 
17.07.20
19:26
Чотко
248 Злопчинский
 
17.07.20
19:46
(244)(245) угу, а не тот трэш что есть...
249 vi0
 
18.07.20
08:16
(246) мы во всем блюдём меру. в секту функциональщиков пока не планируем
250 Ненавижу 1С
 
гуру
18.07.20
11:34
(246) требуется написать функцию "модуль числа". Как раз ее нет во встроенных функциях. Напиши чтобы она была чистой и без условий
251 Voronve
 
18.07.20
14:35
(250) Мнэээ Макс(а,-а) не ?
252 Ненавижу 1С
 
гуру
18.07.20
15:20
(251) хорошо. Напиши тогда Максфй
253 Злопчинский
 
18.07.20
15:22
(250) Модуль = Число(СтрЗаменить(Строка(Число),"-",""));
- не прокатит?
254 vi0
 
18.07.20
15:53
(253) часто так балуешься на проде?)
255 1ctube
 
18.07.20
16:29
Вариант Б конечно же. Так удобно, и тому кто пишет и тому кто читает

Вариант Б
256 Злопчинский
 
18.07.20
16:38
(254) ну, модуль за кучу лет я давно не помню чтобы использовал ;-)
и чем тебе в принципе код не нравится? ;-) юзай (251) тогда
257 acht
 
18.07.20
16:49
(250) Ох уж мне эти одинэсники...

Функция МодульЧисла(Число)

    Результат = Sqrt(Число * Число);
    Возврат Результат;
    
КонецФункции

Устроит
258 acht
 
18.07.20
16:50
? =)
259 acht
 
18.07.20
17:05
(250) На тебе еще вариант, без возможной потери точности.

Функция МодульЧисла(Число)
    
    Тест = Новый Соответствие;
    Тест.Вставить(Число, Истина);
    Тест.Вставить(-Число, Ложь);
    Тест.Вставить(Истина, -Число);
    Тест.Вставить(Ложь, Число);
    
    Результат = Тест[Тест[Число]];
    Возврат Результат;
    
КонецФункции
260 Смотрящий
 
18.07.20
17:09
извращенцы
261 vi0
 
18.07.20
17:10
(257) грубо, есть недостатки
262 vi0
 
18.07.20
17:17
(259) тестировал хоть? Ох уж мне эти одинэсники...
263 Злопчинский
 
18.07.20
18:01
(260) ну ты понял, кто пишет типовые на снеговике...
264 acht
 
18.07.20
18:35
(262) Да, чой-то я с переходом от hashmap загнался и накосячил. Ну, кто ж виноват, что у 1С структуры данных такие корявые? =)
265 acht
 
18.07.20
18:36
(263) ... написал автор рещения (253)
266 vi0
 
18.07.20
18:53
(264) вообще соответствие это индекс, а индекс это поиск, а поиск это условие
267 vi0
 
18.07.20
18:54
(264) ты накосячил, а виновата 1с
268 acht
 
18.07.20
19:00
(266) А крутится все на процессоре, а там jnz разные, поэтому...
269 vi0
 
18.07.20
19:09
(268) тут то абстракция самая верхняя, сама 1с
270 acht
 
18.07.20
19:14
(269) Ой, извини, пожалуйста, сейчас исправлюсь!

...а крутится все на байт-машине 1С, а там проверки разные, поэтому...
271 dot05
 
18.07.20
20:48
Я смотрю некоторые не только Макконнелла не читали, но и стандарты разработки 1с тоже

Вариант Б
272 Злопчинский
 
18.07.20
22:58
(271) если все читать - времени на продакшен не останется...
273 Шоколадная страсть
 
19.07.20
05:50
(250) Ну модуль числа и так никто не делает через условия. Есть много способов написать в функциональном стиле, тебе уже ответили. Можно даже чисто математически решить.
Придумай другую задачу
274 vi0
 
19.07.20
10:05
(273) твоя ошибка в том, что вместо того чтобы предложить решение какой то насущной проблемы разработки, ты пытаешься протолкнуть просто решение
275 acht
 
19.07.20
16:12
О, вот отличная иллюстрация использования паттерна "А" из опроса. А так же паттерна отрицания условия при сравнении.
Проверка заполнения реквизитов

Чувствуете запах?
276 vi0
 
19.07.20
19:28
(275) запах свежей полиграфии?
277 Злопчинский
 
19.07.20
20:13
(275) а что не так? просто интересно.
чисто по логике - вроде норм, возвращает Ложь/Истина
278 Cyberhawk
 
19.07.20
21:52
.

Вариант Б
280 Злопчинский
 
20.07.20
12:20
(279) трэш какой-то
281 fisher
 
20.07.20
12:41
(277) Если не обращать внимание на вероятные ошибки, то как минимум было бы лучше так, ИМХО:

Процедура СообщитьОбОшибке(ТекстОшибки, ПроверяемоеПоле = Неопределено)

    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = ТекстОшибки;
    Если ПроверяемоеПоле <> Неопределено Тогда
        Сообщение.Поле = ПроверяемоеПоле;
    КонецЕсли;
    Сообщение.Сообщить();
    
КонецФункции

Функция ПроверкаЗаполнения ()
    
    ПроверкаПройденаУспешно = Истина;

    // проверка суммы
    Если Сумма <= 99999 Тогда
        ПроверкаПройденаУспешно = Ложь;
        СообщитьОбОшибке("Неправильно заполнено", Сумма);
    КонецЕсли;
    
    // проверка периода
    Если ЗначениеЗаполнено(Период) Тогда
        ПроверкаПройденаУспешно = Ложь;
        СообщитьОбОшибке("Неправильно заполнено", Период);
    КонецЕсли;
    
    Возврат ПроверкаПройденаУспешно;
    
КонецФункции
282 fisher
 
20.07.20
12:45
Блин. У него вероятно еще и проверка инверсная. Вероятно, правильнее так:
Функция ПроверкаЗаполненияПройдена()
    
    ПроверкаПройденаУспешно = Истина;

    // проверка суммы
    Если Сумма > 99999 Тогда
        ПроверкаПройденаУспешно = Ложь;
        СообщитьОбОшибке("Неправильно заполнено", Сумма);
    КонецЕсли;
    
    // проверка периода
    Если НЕ ЗначениеЗаполнено(Период) Тогда
        ПроверкаПройденаУспешно = Ложь;
        СообщитьОбОшибке("Неправильно заполнено", Период);
    КонецЕсли;
    
    Возврат ПроверкаПройденаУспешно;
    
КонецФункции
283 Конструктор1С
 
20.07.20
12:59
(279) это уже усложнение кода получается. Отказ от условных операторов не должен быть самоцелью

(281) есть же библиотечные функции. Например, ОбщегоНазначенияКлиентСервер.СообщитьПользователю();
284 hi1C
 
20.07.20
13:07
(275) И где там паттерн А?
285 fisher
 
20.07.20
13:46
(283) Решил что так нагляднее плюс не факт, что у автора кода БСП стоит.
286 trad
 
20.07.20
14:51
(284) Иначе Возврат Истина;
287 TStan
 
20.07.20
14:53
Только Б. А в этом частном случае, думаю, лучше через тернарный ?(,,)

Вариант Б
288 hi1C
 
20.07.20
16:00
(286) и, конечно, использование этого паттерна сломало функцию?
289 trad
 
20.07.20
16:59
(288) нет, не сломало
290 acht
 
20.07.20
17:57
(288) Сделало невозможным отладку. Внутрь этой ветки нельзя поставить брекпоийт.
291 acht
 
20.07.20
18:04
(282) > У него вероятно еще и проверка инверсная

Вооот. Понимание кода с первой попытки не проходит, приходится мучительно и неоднократно перечитывать. Паттерн отрицания условия во всей красе.
292 patria0muerte
 
20.07.20
18:07
Естественно

Вариант Б
293 acht
 
20.07.20
18:12
(291)+
Это на самом деле из той же серии, что и использование отрицания в идентификаторах.

Если Не ТоварНеПродан(Номенклатура) Тогда
    // Успешного чтения
294 Djelf
 
20.07.20
18:33
В 99.99% случаях вариант Б.
Без однострочных конструкций код понимается значительно быстрее.
Код после обускаторов тоже читается, но зачем делать обфускакию с своем коде?

Вариант Б
295 H A D G E H O G s
 
20.07.20
18:35
Кто пользует вариант А - кхаб.
Пользователям ?() уже разогрели отдельный котел...

Вариант Б
296 acht
 
20.07.20
18:37
(295) > котел
В аду для интровертов нет отдельного котла (:
297 H A D G E H O G s
 
20.07.20
18:39
(296) это для хакатона..
298 Злопчинский
 
20.07.20
18:54
(293) в клюшках есть типовой обфускаторный хрень... я специально пишу в каких-нить хитрых разработках нетповых неочевидных чтоб враги после меня мозг сломали

Если ПустаяСтрока(ЧтотоСтрока)<>0 Тогда
  //тырыпыры
299 vi0
 
20.07.20
19:35
(293) Если Не ТоварНеПродан(Номенклатура)<>Неопределено Тогда
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой