Имя: Пароль:
IT
 
[А=Б=В] vs [Если Б=В Тогда А=Истина]
, ,
0 aleks-id
 
18.05.12
11:23
1. [А=Б=В] - я проф. программист 52% (15)
2. КГ/АМ 28% (8)
3. [Если Б=В Тогда А=Истина] - я проф. программист 17% (5)
4. [А=Б=В] - я не программист 3% (1)
5. [Если Б=В Тогда А=Истина] - я не программист 0% (0)
Всего мнений: 29

В ветке v8: Как по дате определить что это конец месяца? разгорелись дебаты насчет использования конструкций и возможностей языков программирования (в частности 1С) при работе с булевой алгеброй. Какой вариант кому ближе?
12 Alex S D
 
18.05.12
11:30
конечно

[А=Б=В] - я проф. программист
13 ковер
 
18.05.12
11:30
(9) а куле просто нужно знать порядок выполнения операций
14 Maxus43
 
18.05.12
11:31
ДА!

[А=Б=В] - я проф. программист
15 Reset
 
18.05.12
11:31
Возврат Б=В

тоже будем писать как
Если  Б=В тогда
 возврат Истина;
Иначе
возврат Ложь;
Конец;
?
16 salvator
 
18.05.12
11:31
За другую конструкцию меня бьют на работе

[А=Б=В] - я проф. программист
17 PR
 
18.05.12
11:32
Из прошлой ветки.
Проще Если.
Особенно если речь не про "А=Б=В", а про чуть более длинные выражение, например "ТекущиеДанные.Флажок=ОбщийМодуль.ПолучитьЧтоТоТам(ТекущиеДанные.Сумма, Истина)=ОпределитьКакойНитьТамПоказатель(Константы.МояКонстанта.Получить(), ТекущиеДанные.ДокументПланирования.Дата, ТекущаяДата())".
18 izekia
 
18.05.12
11:32
(13) ну профпрограммер пишет для неудачников же
19 izekia
 
18.05.12
11:33
(16) расскажи нам как тебя бьют? сейчас мазохисты подтянутся
20 aleks-id
 
18.05.12
11:33
из прошлой ветки по мнению PR вместо кода

ТекСтрока.Отметка = ТекСтрока.БанковскийСчет = Константы.ОсновнойБанковскийСчет;

надо писать

Если ТекСтрока.БанковскийСчет = Константы.ОсновнойБанковскийСчет Тогда
ТекСтрока.Отметка = Истина
Иначе
ТекСтрока.Отметка = Ложь
КонецЕсли;
21 ковер
 
18.05.12
11:33
(16) откизди начальника, главное чтоб работало
22 PR
 
18.05.12
11:34
(20) Именно.
23 dmpl
 
18.05.12
11:35
(13) Не только порядок, то и то, что в одном случае знак = обозначает сравнение, а в другом случае знак = обозначает присваивание. В том же C/C++ такая конструкция сделает значение всех 3 переменных равным В, а в Паскале вообще смысл будет очень хитрым.

(20) Лучше

ТекСтрока.Отметка = Ложь;
Если ТекСтрока.БанковскийСчет = Константы.ОсновнойБанковскийСчет Тогда
ТекСтрока.Отметка = Истина;
КонецЕсли;
24 izekia
 
18.05.12
11:36
(19)+ уже тема есть, сорри)
25 ХочуСказать
 
18.05.12
11:37
(22) ты просто быдлокодер
26 Lys
 
18.05.12
11:37
В каждом конкретном случае пишу так, как более удобно и наглядно.
Упоротые адепты только первого, или только второго подхода - убейтесь, надо быть гибким.

ЗЫ: Не знаю, как там в паскале или си это работает, и знать не хочу.

КГ/АМ
27 Reset
 
18.05.12
11:37
(23) При чем здесь С/С++ ?
28 Irek-kazan
 
18.05.12
11:37
надо писать код так, чтобы после вас любой разобрался

[Если Б=В Тогда А=Истина] - я проф. программист
29 Maxus43
 
18.05.12
11:38
(26) смотри тему в сабже, с которой всё началось. именно ТАМ 100% А = (Б = В) по феншую
30 Alex S D
 
18.05.12
11:38
(27) я думаю все начинали изучать программирование не с 1С...
31 Warlock
 
18.05.12
11:39
Конструкция [А=Б=В], безусловно, красивая, но в реальных проектах я придерживаюсь идеологии [Если Б=В Тогда А=Истина], как более наглядной и быстро читаемой

По той же причине расписываю:

Если ДлинноеИСложноеУсловие Тогда
 Ревизит1.Видимость = Истина;
 Ревизит2.Видимость = Ложь;
 Ревизит3.Видимость = Истина;
Иначе
 Ревизит1.Видимость = Ложь;
 Ревизит2.Видимость = Истина;
 Ревизит3.Видимость = Ложь;
КонецЕсли

хотя можно написать:
 
 РезультатДлинногоИСложногоУсловия = ДлинноеИСложноеУсловие;
 Ревизит1.Видимость = РезультатДлинногоИСложногоУсловия;
 Ревизит2.Видимость = Не(РезультатДлинногоИСложногоУсловия);
 Ревизит3.Видимость = РезультатДлинногоИСложногоУсловия;

но в таком случае, при разборе кода, приходится мысленно просчитывать результат, и, что важнее, если код дорабатывать или повторно использовать, сложность понимания может вырасти до того, что без отладчика не разобраться.

[Если Б=В Тогда А=Истина] - я проф. программист
32 Maxus43
 
18.05.12
11:40
(31) конструкция А = (Б = В) используется для простых условий, незачем воротить Если Тогда для таких мелких, они читаемы в любом случае
33 aleks-id
 
18.05.12
11:41
(31) если бы ты вместо РезультатДлинногоИСложногоУсловия назвал переменную Отображать то все было бы читабельно
34 dmpl
 
18.05.12
11:42
(27) Притом же, причем и Паскаль - конструкция неоднозначная, и если программируешь в разных языках программирования, то можешь неправильно понять конструкцию, что приведет к ошибке в программе или впустую потраченному на отладку времени.
35 Ненавижу 1С
 
гуру
18.05.12
11:44
(31) главное теперь не забывать при создании нового реквизита добавлять строки в ДВУХ местах, вместо ОДНОГО
36 Fish
 
18.05.12
11:44
(28) Забыл уточнить. надо писать код так, чтобы после вас любой ПРОГРАММИСТ разобрался. А быдлокодеру как не пиши- всё равно не осилит :)))

[А=Б=В] - я проф. программист
37 Reset
 
18.05.12
11:45
(34) Т.е., по твоему, я сейчас и в С должен отказаться от конструкции x=y=z ? Не дай бог адинэсник мой код не правльно поймет
38 Maxus43
 
18.05.12
11:46
нормальный программист понимает в каком он языке кодит, и такие отличия знает
39 dmpl
 
18.05.12
11:47
(37) Ты сам его можешь неправильно понять ;) Пусть это и продлится недолго, но производительность твою снизит.
40 PR
 
18.05.12
11:47
(35) Вместо двух наборов строк лучше написать
Результат = ДлинноеИСложноеУсловие;

Ревизит1.Видимость = Результат;
Ревизит2.Видимость = НЕ Результат;
Ревизит3.Видимость = Результат;
41 Steel_Wheel
 
18.05.12
11:48
Скобки забыл перед "Б" и после "В"

[А=Б=В] - я проф. программист
42 Maxus43
 
18.05.12
11:48
(39) чож ты на английском в 1с не пишеш? програмер С++ тебя не поймёт когда в 1с заглянет
43 Ненавижу 1С
 
гуру
18.05.12
11:48
есть и более тонкие различия, так что нельзя писать в универсальном стиле во всех языках мира

например в Си++ нельзя в конструкторе вызывать виртуальные методы, а в Си# можно
44 PR
 
18.05.12
11:48
(37) Если ты не понимаешь отличия программирования на 1С от программирования на C, то вряд ли ты поймешь, почему в C правильнее писать А=Б=В, а в 1С наоборот.
45 Ненавижу 1С
 
гуру
18.05.12
11:49
(40) так я про то же, а он в (31) говорит - нефига
46 aleks-id
 
18.05.12
11:49
(41) скобки здесь не обязательны
47 Warlock
 
18.05.12
11:49
(33), (35) Пример сильно упрощенный. В жизни я попадал на такие конструкции, которые используют несколько "результатов сложных условий" и бинарную логику для вычисления необходимости отображения

Метод в (31) хорош тем, что, глядя в код, можно представить видимость реквизитов. А когда условий много, есть подблоки и прочие изыски, читать код тяжело. Но я не говорю, что надо делать только как в (31). Надо всегда решать по обстоятельствам
48 Fish
 
18.05.12
11:49
(41) А скобки зачем?
49 Ненавижу 1С
 
гуру
18.05.12
11:50
(46)(48) просто визуально операцию сравнения отличить от операции присваения
50 Fish
 
18.05.12
11:50
(44) Ну так поведай, почему же в 1С писать А=Б=В неправильно?
51 Ненавижу 1С
 
гуру
18.05.12
11:51
(47) отмазка не принята ))
52 PR
 
18.05.12
11:51
(45) Прочитай предыдущие посты еще раз. Внимательно.
53 Ненавижу 1С
 
гуру
18.05.12
11:51
(50) он ее читает с трудом, но тут дело привычки, имхо
54 Reset
 
18.05.12
11:52
(39) Не делайте, прошу, из меня идиота. Я всегда в курсе, на каком языке пишу в конкретный момент.
55 Wobland
 
18.05.12
11:52
ну зачем все эти лишние слова?

[А=Б=В] - я проф. программист
56 Ненавижу 1С
 
гуру
18.05.12
11:52
(52) да хоть обчитайся, толчем воду на пустом месте, дело в личных тараканах в голове
57 aleks-id
 
18.05.12
11:53
кстати, кто тут вопит про С ? там конструкция будет А=Б==С
в паскале вообще А:=Б=С
58 PR
 
18.05.12
11:53
(50) Мне каждые 20 постов повествовать что ли?
Прочитай предыдущие посты.
59 Irek-kazan
 
18.05.12
11:54
А вот еще вопрос, какой вариант быстрее вычислить интерпретатор?
60 dmpl
 
18.05.12
11:54
(42) Кодер может и не поймет. Программист - поймет.

(43) Те еще грабли, особенно при глубоком наследовании.

(50) Потому что в 1С значение оператора = меняется в зависимости от места использования. В Си оператор = - это присваивание, а сравнение делает оператор ==.

(57) Ну вот! Замечательно видно где сравнение, а где присваивание.
61 Ненавижу 1С
 
гуру
18.05.12
11:54
(57) в Си можно как
А=Б==С
так и
А=Б=С

итог разный
62 Fish
 
18.05.12
11:54
(58) Читал, кроме того, что ты не умеешь читать такой код, я доводов не увидел :))
т.е., если какой-то одинэсник не осиливает рекурсию, то её тоже в 1С использовать нельзя?
63 izekia
 
18.05.12
11:55
(61) мы и так все знаем что ты знаешь С
64 dmpl
 
18.05.12
11:55
(61) Угу, а если мы еще и перегрузили эти операторы - то вообще дух захватывает от использования возможностей языка...
65 trad
 
18.05.12
11:55
в одних случаях

[А=Б=В] - я проф. программист
66 Ненавижу 1С
 
гуру
18.05.12
11:55
(60) значения разные, но однозначно определяется смысл, а для наглядности еще и скобки добавить
67 trad
 
18.05.12
11:55
в других случаях

[Если Б=В Тогда А=Истина] - я проф. программист
68 Ненавижу 1С
 
гуру
18.05.12
11:56
(63) если бы
69 PR
 
18.05.12
11:56
(56) А, пардоньте, я неверно прочитал (31).

Я думал, что написано, что не нужно писать
Ревизит1.Видимость = ДлинноеИСложноеУсловие;
Ревизит2.Видимость = Не(ДлинноеИСложноеУсловие);
Ревизит3.Видимость = ДлинноеИСложноеУсловие;
70 Maxus43
 
18.05.12
11:57
(60) >>Кодер может и не поймет. Программист - поймет
дак программист и в 1с поймёт А=Б=В.
Противоречиш сам себе, включи логику. То програмист не поймёт, то поймёт.

[А=Б=В] - я проф. программист
71 dmpl
 
18.05.12
11:58
(66) Однозначно, но противоестественно ;)
72 dmpl
 
18.05.12
11:59
(70) Для этого он должен прочитать талмуд сначала.
73 Warlock
 
18.05.12
11:59
(51)
Приведу чисто гипотетический код:

ВалютнаяСумма.Видимость = ОтражатьВБухгалтерскомУчете И Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
КурсВзаиморасчетов.Видимость = ОтражатьВБухгалтерскомУчете И Валюта = Константы.ВалютаРегламентированногоУчета.Получить() И ОбщийМодуль.ПолучитьПравоПользователя("ПравоМенятьКурс");

против

Если ОтражатьВБухгалтерскомУчете И Валюта = Константы.ВалютаРегламентированногоУчета.Получить() Тогда
 ВалютнаяСумма.Видимость = Истина;
 Если ОбщийМодуль.ПолучитьПравоПользователя("ПравоМенятьКурс") Тогда
   КурсВзаиморасчетов.Видимость = Истина;
 Иначе
   КурсВзаиморасчетов.Видимость = Ложь;
 КонецЕсли;
Иначе
 ВалютнаяСумма.Видимость = Ложь;
 КурсВзаиморасчетов.Видимость = Ложь;
КонецЕсли;

А теперь представь, что реквизитов и ветвлений много. Какой получится читабельнее? (Про отсутствие избыточности не говорим - она принесена в жертву)
74 Ненавижу 1С
 
гуру
18.05.12
12:00
(72) ну знаешь, в Си тоже надо прочитать талмуд ))
75 dmpl
 
18.05.12
12:01
(74) Если писать нормально - талмуд не потребуется ;) На Си можно писать не сложнее, чем на Бейсике.
76 aleks-id
 
18.05.12
12:02
(72) проще ведь на мисте спросить да?
v8: Помогите разобраться в коде
77 Fish
 
18.05.12
12:03
(73) Первый вариант, естественно читабельнее, чем вникать в кучу если, иначеЕсли и т.п. А когда внутри одного из Иначе если засунут ещё такое же дерево из Если... ИначеЕсли, то код становится совсем нечитабельным.
78 Reset
 
18.05.12
12:05
(73) Второй вариант сложнее читается.
Первый подлежит оптимизации - убрать получение константы два раза
Например

ЭтоВалютаРеглУчета=Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
ВалютнаяСумма.Видимость = ОтражатьВБухгалтерскомУчете И ЭтоВалютаРеглУчета;
КурсВзаиморасчетов.Видимость = ОтражатьВБухгалтерскомУчете И ЭтоВалютаРеглУчета И ОбщийМодуль.ПолучитьПравоПользователя("ПравоМенятьКурс");
79 PR
 
18.05.12
12:06
(62) Когда аргументы заканчиваются, начинаются передергивания и придумывания, да.
80 Ненавижу 1С
 
гуру
18.05.12
12:06
(73) спорно очень, что читабельнее

1 вариант упрощается до:

УсловиеВидимостиВалютноСуммы = ОтражатьВБухгалтерскомУчете И Валюта = Константы.ВалютаРегламентированногоУчета.Получить();
ВалютнаяСумма.Видимость = УсловиеВидимостиВалютноСуммы;
КурсВзаиморасчетов.Видимость = УсловиеВидимостиВалютноСуммы И ОбщийМодуль.ПолучитьПравоПользователя("ПравоМенятьКурс");

2 вариант упрощается до:

ВалютнаяСумма.Видимость = Ложь;
КурсВзаиморасчетов.Видимость = Ложь;
Если ОтражатьВБухгалтерскомУчете И Валюта = Константы.ВалютаРегламентированногоУчета.Получить() Тогда
ВалютнаяСумма.Видимость = Истина;
Если ОбщийМодуль.ПолучитьПравоПользователя("ПравоМенятьКурс") Тогда
  КурсВзаиморасчетов.Видимость = Истина;  
КонецЕсли;
КонецЕсли;
81 H A D G E H O G s
 
18.05.12
12:06
I 'm not fortunate son!

Вот вам делать нехер.

КГ/АМ
82 Ненавижу 1С
 
гуру
18.05.12
12:07
(81) во, старая гвардия ежей подтянулась ))
83 Ненавижу 1С
 
гуру
18.05.12
12:08
кстати NULL в SQL и в Си++ имеет разный смысл ))
84 H A D G E H O G s
 
18.05.12
12:08
85 Fish
 
18.05.12
12:10
(79) Ты самокритичен, как никогда :)))
86 PR
 
18.05.12
12:11
(85) Заканчиваю беспредметный разговор с тобой. Неинтересно.
87 Warlock
 
18.05.12
12:12
(80)Согласен, что спорно. Но если конфигурация в активной разработке и есть большая вероятность, что к коду нужно будет вернуться, я выбираю второй вариант. Хотя первый вариант, снабдив вспомогательными переменными, можно сделать красивым и лаконичным. В общем, по ситуации.
88 Fish
 
18.05.12
12:13
(86) Так собственно, никакого спора и не было. Ты заявил, что в 1С так писать нельзя. Я просто спросил, почему. Ты ответа не дал. То, что лично ТЕБЕ это не удобно читать и ТЕБЕ так не нравится - это не аргументы.
89 mg-samara
 
18.05.12
12:14
Наглядность - важнее.

Но в редких случаях можно использовать и А=Б=В.

[Если Б=В Тогда А=Истина] - я проф. программист
90 dmpl
 
18.05.12
12:16
(83) Более того, я могу написать

#undef NULL
#define NULL 1000

и будет вообще весело :)
91 Ksandr
 
18.05.12
12:16
Краткость сестра таланта

[А=Б=В] - я проф. программист
92 izekia
 
18.05.12
12:17
(82) не гунди)
93 Irek-kazan
 
18.05.12
12:18
в общем то надо закруглятся. Писать можно и так и эдак, главное чтобы работало.
Те кто пишут по принципам "главное быстро. а мне и так все понятно. кто не понял дебил" выбирают первый вариант.
94 Ненавижу 1С
 
гуру
18.05.12
12:19
(90) точно
#define true false
95 х86
 
18.05.12
12:22
(0)используем православную конструкцию

?(Б=В, Истина, Ложь)
96 dmpl
 
18.05.12
12:23
(94) А еще можно операторы +, -, *, /, = перегрузить, например, умножение на деление и сложение на вычитание, а присваивание на сравнение :) А чо? Использование возможностей языка :)
97 aleks-id
 
18.05.12
12:24
(95) а чем она отличается от конструкции
?(Б=В, Б=В, Б=В)
98 Steel_Wheel
 
18.05.12
12:24
(48) Для наглядности, чтобы у тру-сишников разрыва шаблона не было. И только
99 1Сергей
 
18.05.12
12:27
"трусишники"... надо запомнить
100 Ненавижу 1С
 
гуру
18.05.12
12:28
100!
101 х86
 
18.05.12
12:28
(97)по сути ни чем от всех перечисленных не отличается
102 aleks-id
 
18.05.12
12:29
(101) вот именно! так почему ты так не пишешь?
103 dmpl
 
18.05.12
12:29
Анекдот в тему:

Пишите код так, будто человек, который будет его поддерживать – маньяк-психопат, который знает, где вы живете.
104 х86
 
18.05.12
12:31
(102)хз, я не привередливый, конструкция как в (0) редко встречается, поэтому могу написать и так и так, и слогикой дружу понимаю все варианты
105 х86
 
18.05.12
12:32
(104)+ но в конструкции  А=Б=В страюсь ставить скобочки для лучшего понимания А=(Б=В)

[А=Б=В] - я проф. программист
106 Mort
 
18.05.12
12:33
Почему-то оператор "=" у некоторых вызывает возбуждение, а ">" не вызывает. Не думаю что кто-то между "А = B>C" и "Если B>C Тогда A = Истина ..." выберет второе.

[А=Б=В] - я проф. программист
107 dmpl
 
18.05.12
12:36
(106) Потому что в 1С он штатно имеет двойное назначение.
108 Irek-kazan
 
18.05.12
12:39
(106) второе однозначно!
109 Stepa86
 
18.05.12
13:48
А = (Б=В)  //когда умещается на экране и не надо думать
или
Если Б=В Тогда   // когда нужно в блоке много чего еще поделать
А = Истина;
или
А = БравноВ(Б,В)  // когда условие сложное/длинное или непонятное
или
Если БравноВ(Б,В) Тогда // когда условие сложное/длинное или непонятное и в блоке надо еще чо нить поделать
А = Истина;

конструкция ?(,,) ломает мне мозг - нинавижу ее

(103) первое упоминание этой цитаты у Макконнелла и фразу приписывают ему, но сам он это отрицает

КГ/АМ
110 dumb851
 
18.05.12
13:51
А=Б+В

КГ/АМ
111 Кирпич
 
18.05.12
13:56
А = (Б = В)

КГ/АМ