Вход | Регистрация


1С:Предприятие ::

Метки: 

Тернарные операторы в 1С

Я
   svsvsv
 
10.10.17 - 14:23
Уважаемые коллеги!
Есть ли у вас какие-то правила (для себя) по использованию тернарных операторов определенного уровня вложенности? (например, не использовать тернарный оператор внутри тернарного оператора).
И вообще, используете ли вы его?

Наткнулся на следующее Г, поэтому и возник вопрос:

ПериодПо = ?(Шапка.ЭтоУвольнение, Шапка.Дата, ?(Шапка.ЭтоАванс, Дата(Год(Шапка.ПериодРегистрации), Месяц(Шапка.ПериодРегистрации), 15), КонецМесяца(Шапка.ПериодРегистрации)));
 
  Рекламное место пустует
   Йохохо
 
1 - 10.10.17 - 14:28
(0) это Г только если это не твое Г )
   Numerus Mikhail
 
2 - 10.10.17 - 14:28
Использую не больше 1 вложенного.
Пример из (0) вполне читабельный.
   azernot
 
3 - 10.10.17 - 14:30
Использую. Регулярно. В т.ч. вложенные.
Как правило при формировании какой-либо строки (например, текста запроса). Но бывает и подобное (0), если есть чёткое булево условия как в (0), то почему бы и нет?
   lubitelxml
 
4 - 10.10.17 - 14:31
(2) +1
   Asmody
 
5 - 10.10.17 - 14:32
(0) А если переписать вот так:

ПериодПо = ?(Шапка.ЭтоУвольнение
           , Шапка.Дата 
           , ?(Шапка.ЭтоАванс
             , Дата( Год(Шапка.ПериодРегистрации)
                   , Месяц(Шапка.ПериодРегистрации)
                   , 15
                   )
             , КонецМесяца(Шапка.ПериодРегистрации)
             )
           );
   svsvsv
 
6 - 10.10.17 - 14:32
(2) Он читабельный, т.к. на мисте шрифт мельче, чем в конфигураторе (скажем, EDT-style)
В конфигураторе это 176 символов, не помещается в экран
   Asmody
 
7 - 10.10.17 - 14:33
(5)+ хотя формирование даты просится отрефакториться в функцию
   vde69
 
Модератор
8 - 10.10.17 - 14:34
(5) лучше так
Если не Шапка.ЭтоУвольнение и Шапка.ЭтоАванс Тогда
  ПериодПо = Дата(Год(Шапка.ПериодРегистрации), Месяц(Шапка.ПериодРегистрации), 15);
ИначеЕсли не Шапка.ЭтоУвольнение Тогда
  ПериодПо = КонецМесяца(Шапка.ПериодРегистрации);
Иначе
  ПериодПо = Шапка.Дата
КонецЕсли;
   svsvsv
 
9 - 10.10.17 - 14:34
(7) я и отрефакторил в функцию. Еще заменил "?" на "Если", а то не очень удобно смотреть, хоть и в одну строчку
   Asmody
 
10 - 10.10.17 - 14:36
(8) Не лучше. Три присваивания вместо одного - потенциальный источник проблем.
 
 
   Fedor-1971
 
11 - 10.10.17 - 14:37
(0) нормально читается так:
ПериодПо = ?(Шапка.ЭтоУвольнение,
             Шапка.Дата, 
            ?(Шапка.ЭтоАванс, Дата(Год(Шапка.ПериодРегистрации), Месяц(Шапка.ПериодРегистрации), 15), КонецМесяца(Шапка.ПериодРегистрации)));

При рефакторинге имеет смысл переделывать на Если ... КонецЕсли;
   Asmody
 
12 - 10.10.17 - 14:38
Я бы всё это вынес в функцию.
   vde69
 
Модератор
13 - 10.10.17 - 14:38
(10) Вы не правы, все три присвоения никогда не выполняются все вместе...

а из плюсов - любой из трех результатов наглядно записан в виде одной строчки, это примерно как case в других языках
   vde69
 
Модератор
14 - 10.10.17 - 14:41
ну и можно еще так


ПериодПо = Шапка.Дата//инициализация


Если не Шапка.ЭтоУвольнение Тогда 
 Если Шапка.ЭтоАванс Тогда
  ПериодПо = Дата(Год(Шапка.ПериодРегистрации), Месяц(Шапка.ПериодРегистрации), 15);
 Иначе
  ПериодПо = КонецМесяца(Шапка.ПериодРегистрации);
КонецЕсли;
   H A D G E H O G s
 
15 - 10.10.17 - 14:42
Не использую дичь вида
?
   svsvsv
 
16 - 10.10.17 - 14:43
Я бы сделал так:

ПериодПо = Шапка.Дат//инициализация

ПериодРегистрации = Шапка.ПериодРегистрации;
Если Не Шапка.ЭтоУвольнение Тогда 
 Если Шапка.ЭтоАванс Тогда
  ПериодПо = Дата(Год(ПериодРегистрации),Месяц(ПериодРегистрации), 15);
 Иначе
  ПериодПо = КонецМесяца(ПериодРегистрации);
КонецЕсли;

то есть добавил бы это:

ПериодРегистрации = Шапка.ПериодРегистрации;
   Fragster
 
17 - 10.10.17 - 15:10
ПериодПо = ?(Шапка.ЭтоУвольнение, Шапка.Дата,
           ?(Шапка.ЭтоАванс, Дата(
                Год(Шапка.ПериодРегистрации)
                   , Месяц(Шапка.ПериодРегистрации)
                   , 15
                ), 
           КонецМесяца(Шапка.ПериодРегистрации)
           ));
   sitex
 
18 - 10.10.17 - 15:16
(0) Использую, причем но не более 3-4 вложенных. Далее просто становиться не читабельно.
   drcrasher
 
19 - 10.10.17 - 15:17
(17)(5) за такой перенос запятой 1С смело разворачивает конфу на исправление
   Fragster
 
20 - 10.10.17 - 15:19
(19) ты про запятую в начале в функции Дата? это мне тоже не нравится
   oslokot
 
21 - 10.10.17 - 15:19
(0) ? использую, но без вложений
   Fragster
 
22 - 10.10.17 - 15:19
ПериодПо = ?(Шапка.ЭтоУвольнение, Шапка.Дата,
           ?(Шапка.ЭтоАванс, Дата(
                   Год(Шапка.ПериодРегистрации),
                   Месяц(Шапка.ПериодРегистрации),
                   15
                ),
           КонецМесяца(Шапка.ПериодРегистрации)
           ));
   drcrasher
 
23 - 10.10.17 - 15:22
(20) да. у них вообще много интересных требований к коду, сначала плеваться тянет, потом втягиваешься и даже логичность некоторая видна
   Asmody
 
24 - 10.10.17 - 15:57
(19) 1С может ходить нахер. Или пусть опубликуют codestyle.
В таком стиле ты никогда не пропустишь и не забудешь запятую.
   kittystark
 
25 - 10.10.17 - 16:11
(24) +1
   Сти
 
26 - 10.10.17 - 16:13
(5) Это хорошо, когда платят за количество строк кода. Как по мне, так чем более кратко, тем лучше. После Perl, наверное )))
   Fragster
 
27 - 10.10.17 - 16:41
в https://its.1c.ru/db/content/v8std/src/d810/i8100444.htm?_=1507132762 именно про запятые ничего нету
   Ненавижу 1С
 
28 - 10.10.17 - 16:44
А почему 1С решила извратить этот классческий оператор?

Результат = Условие ? ПоложительныйОтвет, ОтрицателныйОтвет;
   ptiz
 
29 - 10.10.17 - 16:56
В нашем деле, главное - читаемость кода. Вложенные "?" читаемость портят.
   Fedor-1971
 
30 - 10.10.17 - 17:10
(28) Взяли за основу С
Вот так красивее:
Результат = ? Условие : ПоложительныйОтвет, ОтрицателныйОтвет;
   Asmody
 
31 - 10.10.17 - 17:23
(28) (30) А разве не так:

<условие> ? <еслида> : <еслинет>;
   Asmody
 
32 - 10.10.17 - 17:24
1С вообще сделали этот оператор как-бы функцией, каковой он не является.
Зато в 7.7 с его помощью делалась "ленивая" проверка условий.
   тарам пам пам
 
33 - 10.10.17 - 17:26
Использую без вложенных. Пример вполне читабелен, но от вложенного ? я бы все равно избавился.
 
  Рекламное место пустует
   Филиал-msk
 
34 - 10.10.17 - 17:28
(28) (30) Да тоже, когда язык проектировали, забыли как пишется.
   Филиал-msk
 
35 - 10.10.17 - 17:29
(32) Особенности реализации стековой машинки, очевидно. Дерево разбора у них ЕМНИП, только в эклипсе и появилось, до этого - тупая попытка компиляции и смотрим что получилось
   Asmody
 
36 - 10.10.17 - 17:38
(35) хотя для ?() они все аргументы не вычисляют
   mexanik_96
 
37 - 10.10.17 - 17:39
(0) сложные условия обычно объединяют(речь не про 1с) в переменную. Фиксин по моему даже писал где-то об этом
   Филиал-msk
 
38 - 10.10.17 - 17:44
(36) Синтаксическая глюкоза от 1С (:
   Fragster
 
39 - 10.10.17 - 18:39
(32) что в ?() что в ЕСЛИ - проверка ленивая
   Филиал-msk
 
40 - 10.10.17 - 19:34
(39) в 7.7 нет
   PiotrLoginov
 
41 - 10.10.17 - 19:54
(0) Тогда уж голосовалку.

Код в (0) очень даже норм.
   Fragster
 
42 - 10.10.17 - 20:33
(40) да
   Лефмихалыч
 
43 - 10.10.17 - 22:08
(0) правило простое - тернарные операторы должны быть простыми и укладываться в голове с одного прочтения. Если приходится читать по частям, то надо рефакторить.
Код в топике - УГ, фу так делать
   Брудвар
 
44 - 10.10.17 - 23:17
(43) Да вроде норм. С одного раза все понятно
   kittystark
 
45 - 10.10.17 - 23:49
вот как надо
[1с]
Если ?(Отмерь(),?(Отмерь(),?(Отмерь(),?(Отмерь(),?(Отмерь(),?(Отмерь(),Отмерь(),ложь),ложь),ложь),ложь),ложь),ложь) тогда
Отрежь();
КонецЕсли
[/1с]
   kittystark
 
46 - 10.10.17 - 23:52
если позаботиться о читабельности, то так выглядит лучше
[1с]
Если ?(Отмерь(),
         ?(Отмерь(),
             ?(Отмерь(),
                 ?(Отмерь(),
                     ?(Отмерь(),
                         ?(Отмерь(),Отмерь(),ложь),
                         ложь),
                       ложь),
                     ложь),
                   ложь),
                 ложь)
Тогда
    Отрежь();
КонецЕсли
[/1с]
   kittystark
 
47 - 10.10.17 - 23:53
поэтому (5) самый наиприемлемый варинат
   kittystark
 
48 - 10.10.17 - 23:58
и зачастую, когда в запросе наворотишь условий со всякими И / ИЛИ, да ещещ перевложенными в скобочках, чтоб понимать суть условия приходится  делать отступы и потом НЕ ПОЛЬЗОВАТЬСЯ конструктором, чтобы потом вся "логическая"не слетела нах, после его "стандартизации"
   kittystark
 
49 - 10.10.17 - 23:59
* "логическая Красота"
 
  Рекламное место пустует
   Asmody
 
50 - 11.10.17 - 00:24
(48) А вот если в запросе наворотишь вот это всё, то это 100% рефакторить надо.
   VladZ
 
51 - 11.10.17 - 06:28
(0) Для себя решил так: вложенные конструкции в "?" не использовать.
   Рэйв
 
52 - 11.10.17 - 06:57
(0)Только если под настроение для прикола могу навернуть:-)
А вообще стараюсь если есть вложенность, то использовать Если...Тогда.
Потому что потом сам материшься спустя какое то время разгадывая  этот ребус:-)
   Ненавижу 1С
 
53 - 11.10.17 - 09:00
А вот если бы в SQL писали бы не

select
case
    when x>1000 then y1000
    when x>100  then y100
    when x>10   then y10
    else             y0
end as Y

а вот так (а ля Си-лайк):

select
Y = x>1000    ? y1000    :
    x>100    ? y100    :
    x>10    ? y10    :    
              y0
   Сияющий в темноте
 
54 - 11.10.17 - 09:29
select case в запросах 1с прекрасно реализован



Список тем форума
Рекламное место пустует   Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует