Вход | Регистрация
    1  2   
1С:Предприятие :: 1С:Предприятие 8 общая

"Не" как антипаттерн програмирования

"Не" как антипаттерн програмирования
Я
   Почему 1С
 
21.07.21 - 09:05
Читаю код и постоянно спотыкаюсь на конструкциях типа (пропускаю эту НЕ)

Если НЕ СтруктураТаблицДокумента.ТаблицаУслуги = Неопределено тогда

Не читается этот код для меня, так писал код уважаемый бывший сотрудник программист 1с (но не уважаемый мной ) в конторе где я сейчас работаю, мало того что сам писал он еще и всех других приучил к такому.
Мне они заявляют типа лучше писать через "НЕ" условия <>, на вопрос почему следует ответ так писал наш Ф.И.О.

Наболело, это мой загон или действительно можно считать антипаттерном.

Ситуации (не ЗначениеЗаполнено() не ... is null к этому не относятся в них с чтением кода проблем у  меня нет)
   TormozIT
 
1 - 21.07.21 - 09:10
Думаю (по опросам коллег) это в большинстве случаев объясняется так

Если автор владел удобным переключателем языка ввода. Например раскладкой клавиатуры Чистова http://devtool1c.ucoz.ru/load/prochie/raskladka_russkaja_dlja_1s/2-1-0-22 . Тогда он пишет "<>".

Иначе автору неудобно переключать язык ввода и он пишет (Не Выражение1 = Выражение2).
   Галахад
 
2 - 21.07.21 - 09:10
Стандартам не противоречит - нормальный код.
   lodger
 
3 - 21.07.21 - 09:10
"не ЗначениеЗаполнено() не ... is null" - специфичны для применяемой переменной и могут давать разные результаты при такой мутабельности переменных. поэтому придирок меньше.

Не = и <> полностью тождественны. но в первой 2 операции, а во второй 1. если стоять над каждой строкой с секундомером - <> выбор специалиста. зато "не =" читается лучше в большом и неопределенном массиве людей, т.к. ближе к русской лексике.
   TormozIT
 
4 - 21.07.21 - 09:11
Я тоже не люблю запись в виде "Не Выражение1 = Выражение2", т.к. она больше "мыслетактов" съедает при чтении и при редактировании неудобнее.
   mikecool
 
5 - 21.07.21 - 09:12
(3) "Не = и <> полностью тождественны. но в первой 2 операции, а во второй 1" - во второй тоже 2
   ДенисЧ
 
6 - 21.07.21 - 09:12
Я иногда пишу НЕ (а1 = а2 ИЛИ а3 = а4) вместо (а1 <> а2 И а3 <> а4)
Удобней читается.
   TormozIT
 
7 - 21.07.21 - 09:13
(5) Во второй одна операция, а не две.
   mikecool
 
8 - 21.07.21 - 09:14
(6) вот и знатоки булевой алгебры подтянулись ))
   fisher
 
9 - 21.07.21 - 09:14
Если можно без НЕ без усложнения кода, то конечно лучше без НЕ. Нормально с НЕ читаются только отрицания простых утверждений типа "НЕ ЭтоЭлемент".
Но самая жесть - это двойное отрицание (смысловое). Типа "НЕ ЭтоНеГруппа".
(6) а1 <> а2 И а3 <> а4 - читается нативнее и легче.
   TormozIT
 
10 - 21.07.21 - 09:15
(6) Согласен. Тоже так пишу иногда. Зависит от того, в каком виде лучше виден смысл выражения.
   ДенисЧ
 
11 - 21.07.21 - 09:15
(9) Не всешда легче. Особенно если переменные имеют осмысленное название.
   mikecool
 
12 - 21.07.21 - 09:17
(7) не во всех языках, емнип, есть <>
   fisher
 
13 - 21.07.21 - 09:17
(11) Не всегда. Просто этот пример неудачный был :)
А так да - правила де моргана иногда выручают. И в одну и в другую сторону.
   BeerHelpsMeWin
 
14 - 21.07.21 - 09:18
(6) тоже так делаю, особенно когда внутри скобок очень длинное и при этом интуитивно понятное условие
   ДенисЧ
 
15 - 21.07.21 - 09:18
(13) Ну я не стал же писать типа 
Объект.ВидОперации = Перечисление.ВидыОперацийСписания.ВДолг ИЛИ Объект.ВидОперации = Перечисление.ВидыОперацийСписания.ВПодарок

))
   ДенисЧ
 
16 - 21.07.21 - 09:18
(12) В таких есть !=
   mikecool
 
17 - 21.07.21 - 09:19
(16) что по сути Не ... = ... ))
   mikecool
 
18 - 21.07.21 - 09:19
+17 я, по крайней мере, это так воспринимаю
   TormozIT
 
19 - 21.07.21 - 09:20
(17) != есть один оператор и одна операция.
   fisher
 
20 - 21.07.21 - 09:21
(18) Ну и зря. Это ж просто синтаксис такой.
   mikecool
 
21 - 21.07.21 - 09:22
(19) для процессора же две операции или тоже одна?
   Mikeware
 
22 - 21.07.21 - 09:23
проблема там же, где обычно...
   fisher
 
23 - 21.07.21 - 09:24
(21) Это абсолютный эквивалент <> в других языках. За количество операций процессора не поручусь, но оно одинаковое будет.
   mikecool
 
24 - 21.07.21 - 09:25
(23) вот и мне так припоминается, ибо <> все равно заменяется на отдельные < и >
   fisher
 
25 - 21.07.21 - 09:26
(24) По-моему, ты что-то пятничное пишешь.
   Mikeware
 
26 - 21.07.21 - 09:28
(25) среда - это маленькая пятница. а мизда - пятница каждый день.
   mikecool
 
27 - 21.07.21 - 09:29
(25) так просвети меня - как происходит вычисление "не равно"
   Галахад
 
28 - 21.07.21 - 09:30
На всякий случай.

Текст*        Количество*        Время чистое, с

Если НЕ Сч = ПроверочноеЧисло Тогда    1 000 001    1,169575

Если Сч <> ПроверочноеЧисло Тогда    1 000 001    1,164398
   skpoo
 
29 - 21.07.21 - 09:30
(0) Помниться когда то Гилёв приводил какие то аргументы, что конструкция с НЕ выполняется быстрее конструкции "<>" и с тех пор кактусы возле компьютера заменили на конструкцию с НЕ.
   skpoo
 
30 - 21.07.21 - 09:31
О, опередили.
 
 
   fisher
 
31 - 21.07.21 - 09:32
(27) Да точно так же, как и равно. В процессорах обычно на проверки флагов наборы симметричных команд.
   TormozIT
 
32 - 21.07.21 - 09:42
(28) 2 опкода против одного. Один оказался быстрее.
   Адинэснег
 
33 - 21.07.21 - 09:47
   Classic
 
34 - 21.07.21 - 10:09
(0)
Сложно угадать, как удобней будет читаться следующему программисту.
Потому все пишут так, как удобней им.

Лично я использую и одно и другое в зависимости от разных ситуаций.
Денис в (6) один из примеров описал.
   Почему 1С
 
35 - 21.07.21 - 10:26
(34) Конкретно в ситуации типа такой

Если НЕ СтруктураТаблицДокумента.ТаблицаУслуги = Неопределено тогда
    делаем чтото
ИначеЕсли СуммаБП = 0 И НЕ СтруктураТаблицДокумента.ТаблицаУслуги = Неопределено Тогда
    делаем чтото
ИначеЕсли Не СтруктураТаблицДокумента.ТаблицаТовары = Неопределено Тогда
    ааааа 
....

Нет ощущения что "НЕ" автоматом пропускаются мозгом, если бегло идти по коду пытаясь понять как он работает? Если есть хоть у кого то , то уже можно смело записывать в антипаттерн
Если СтруктураТаблицДокумента.ТаблицаУслуги <> Неопределено тогда , тут такого эффекта думаю у всех не будет наблюдаться

Из озвученного выше Не (условие  = "что то" или условие2 = "что то"), скобки решают проблему и внимание четко фокусируется на "НЕ", это не тот случай
   ManyakRus
 
36 - 21.07.21 - 10:26
"НЕ" не надо писать никогда :)
только в крайнем случае
Чтоб читать текст слева направо а не справа налево
   Галахад
 
37 - 21.07.21 - 11:00
(35) Хм. А чего бы так не написать:

Если НЕ СтруктураТаблицДокумента.ТаблицаУслуги = Неопределено тогда
    
    делаем чтото
    
    Если СуммаБП = 0 Тогда
        делаем чтото
    КонецЕсли;
    
ИначеЕсли Не СтруктураТаблицДокумента.ТаблицаТовары = Неопределено Тогда
    ааааа
   H A D G E H O G s
 
38 - 21.07.21 - 11:04
(0) Вообще пофиг
   Asmody
 
39 - 21.07.21 - 11:04
(6) А вот ХЗ. Первое "по этажам" хуже разносится. И вообще, я бы уже предикат написал бы
   Документовед
 
40 - 21.07.21 - 11:05
(0) это ты еще про «перейти» не знаешь.
   Asmody
 
41 - 21.07.21 - 11:08
фи! в приличном обществе такие выражения не употребляют
   fisher
 
42 - 21.07.21 - 11:33
машины не  машины
ставить    не ставить
   Ненавижу 1С
 
43 - 21.07.21 - 11:36
   Mort
 
44 - 21.07.21 - 11:36
Лучше всего когда какой-нибудь гений называет реквизит с "не", типа "НеВключатьВЧек". Такой не-не начинается в коде)
   Ненавижу 1С
 
45 - 21.07.21 - 11:40
(44) Где-то кстати читал, что надо по возможности применить синонимы/антонимы и избегать в идентификаторах отрицание
   Mikeware
 
46 - 21.07.21 - 11:43
(35)>>Если есть хоть у кого то , то уже можно смело записывать в антипаттерн
А может, тех, у кого есть - записывать в инвалиды? ну, по крайней мере, в тугодумы? или просто гнать из профессии ссаными тряпками?
   Йохохо
 
47 - 21.07.21 - 11:49
(45) отрицания психологически хуже вопринимаются, мосх стремится их игнорировать как негатив
   Guk
 
48 - 21.07.21 - 11:53
(0) тупо язык переключать неохота...
   Почему 1С
 
49 - 21.07.21 - 12:05
(46) Неадекватный вывод и сообщение в целом, надо еще проверить кто больший тугодум, если из двух вариантов один подходит всем, а второй лишь части, вполне можно сделать верный вывод.
   fisher
 
50 - 21.07.21 - 12:09
(47) Еще "Иначе" тяжело читаются. Анализ таких ветвлений быстро истощает мой атрофирующийся мозг. Очень часто код легко переписывается без "Иначе".
   Mikeware
 
51 - 21.07.21 - 12:12
(49) а чего тут проверять? есть некоторый текст, и два типа людей - одни понимают этот текст целиком (и выражения с "не", и выражения без "не"), а другие - понимают только наполовину (ну в силу тугодумства "спотыкаются на частицах НЕ"). поэтому те, кто понимают наполовину, и являются тупы^W тугодумами.
(50) Да, когда мы придумывали язык "вояка" - мы так и не смогли из военного языка найти аналог "если" :-)
   Малыш Джон
 
52 - 21.07.21 - 12:18
(51) >>есть некоторый текст, и два типа людей - одни понимают этот текст целиком (и выражения с "не", и выражения без "не"), а другие - понимают только наполовину (ну в силу тугодумства "спотыкаются на частицах НЕ"). поэтому те, кто понимают наполовину, и являются тупы^W тугодумами.

Знаю кучу случаев, когда индусский говнокод оправдывался именно таким аргументом. Ну и опять же, есть KISS.
   Почему 1С
 
53 - 21.07.21 - 12:26
(51) Все понятно с тобой, типичный зазнайка, самый умный на свете "Молодец".
   polosov
 
54 - 21.07.21 - 12:29
Тоже не вижу проблем с НЕ. Сам использую эту конструкцию в запросах.
   Конструктор1С
 
55 - 21.07.21 - 12:33
(0) смотря как применять НЕ. Если после НЕ следует "говорящая" переменная или функция, то код нормальный

Не ЯвляетсяРезидентом
Не ФайлЗаписанНаДиск()

а если НЕ присутствует в сложной логической проверке, то такая заведомо заставляет перечитать код несколько раз, легко можно попасть в ловушку и понять код не правильно
Не <Условие1> И <Условие2> И Не <Условие3> Или <Условие4>

последнее типичный стайл типичных 1сников. Мартина Фаулера на них не хватает. Так что в большинстве случаев 1сного кода булево отрицание зло
   mikecool
 
56 - 21.07.21 - 12:35
тогда уж в антипаттерны внести и все условия вида
Если Не <булевая переменная>
   mikecool
 
58 - 21.07.21 - 12:36
+56 а то вдруг проблемы с чтением кода возникнут у кого то ))
   Почему 1С
 
59 - 21.07.21 - 12:40
(55) Такое же мнение
(56) Зачем передергивать, проблема лишь в конструкциях что я привел в (0), где НЕ визуально теряется в тексте, отдалено от непосредственной операции сравнения
   mikecool
 
60 - 21.07.21 - 12:42
(59) просто у меня нет такой проблемы, и я читаю такой код слева направо...
 
 
   Почему 1С
 
61 - 21.07.21 - 12:47
(60) Понятно, видимо вам чужды эффекты с обманом зрения...
   mikecool
 
62 - 21.07.21 - 12:54
(61) даже не знаю о таком
   fisher
 
63 - 21.07.21 - 13:08
(62) Про оптические иллюзии в курсе? Ну вот это когда код в такое складывается. Страшная штука.
   Конструктор1С
 
64 - 21.07.21 - 13:13
(56) "Если Не <булевая переменная>" проблем не создаёт

Если Не Дурак Тогда
    ПойтиВПрограммисты();
КонецЕсли;

проблемы создают такие вот уродства:

Если Не ТребуетсяУказаниеДопДанных 
    И ЗначениеЗаполнено(ПараметрыСканирования.ДокументОснование)
    И Не ЗначениеЗаполнено(ДанныеШтрихкода.Серия)
    И ДанныеДокументаОснования <> Неопределено Тогда
   Злопчинский
 
65 - 21.07.21 - 13:16
"уродство" читалось бы легче со скобками, типа 
Если Не (ТребуетсяУказаниеДопДанных 
    И ЗначениеЗаполнено(ПараметрыСканирования.ДокументОснование)
    И Не ЗначениеЗаполнено(ДанныеШтрихкода.Серия)
    И ДанныеДокументаОснования <> Неопределено) Тогда
   Конструктор1С
 
66 - 21.07.21 - 13:19
(65) скобки уродство не спасут. Тем более в данном случае, скобки поменяют логику проверки
   Mikeware
 
67 - 21.07.21 - 13:21
(52) говнокод говнокодом, а понимание пониманием.
да, KISS никто не отменял, но и применение отрицания в разных случаях разное. Да и в скобках меня никто не не ограничивал...
   Галахад
 
68 - 21.07.21 - 13:21
(64) Хм. И какие предложения?
   fisher
 
69 - 21.07.21 - 13:23
(68) Вероятно, намекает на необходимость комментария или вынесения в отдельный предикат для разъяснения бизнес-кейса. Других идей нет :)
   Guk
 
70 - 21.07.21 - 13:24
жжоте. столько постов обсуждать подобную хрень ;)...
   Почему 1С
 
71 - 21.07.21 - 13:24
(64) это лишь посыл что мозг работает не как компьютер строго детерминировано, а непроизвольно может интерпретировать и искажать информацию, например как в оптических иллюзиях, либо умение мозга свободно читать слова в которых перемешаны буквы, в данном случае если не проявлять некую концентрацию, может вполне проигнорировать "Не".

П.С. Давайте шуточки за триста, гагага он половину кода не видит когда читает код это клиника для тугодумов.
   fisher
 
72 - 21.07.21 - 13:25
(70) Ы. Кого это когда останавливало? Прививочные посты вообще бесконечным сериалом идут.
   Конструктор1С
 
73 - 21.07.21 - 13:27
(68) в данном случае воняет уродливой декомпозицией, нужно пересматривать код. Минимум, чтобы читающий не ломал глаза и не ошибся при беглом чтении, можно вынести проверки в булевы переменные
   Конструктор1С
 
74 - 21.07.21 - 13:31
(71) вот именно. Есть вероятность неправильного толкования. Как-минимум такой код заставляет остановиться и перечитать его несколько раз, обращаясь за подсказками и пояснениями к окружающему коду. Код здорового человека читается как простой текст, понимается с первого раза. Код курильщика нужно зачитывать и перечитывать, решая ребусы
   Галахад
 
75 - 21.07.21 - 13:32
(73) Покажи как это будет на примере из (64)
   Guk
 
76 - 21.07.21 - 13:37
(74) забавно читать такие рассуждения. от кода требуется, чтобы он работал. и работал правильно. а как и кто его там будет читать, это проблемы того кто читает.
зы: это ты код NS-а не видел. его без веществ вообще читать не возможно ;) но он написал таким кодом шахматы на 1С на уровне 2-го разряда, а ты вряд ли напишешь. пусть и красивым кодом...
   Почему 1С
 
77 - 21.07.21 - 13:40
(76) Главное чтобы работало - https://infostart.ru/1c/articles/966234/
Неужели статья для вас будет открытием?
   fisher
 
78 - 21.07.21 - 13:42
(75) Если НеобходимоЗаполнитьХреньИзДокументаОснования Тогда// например
Но как по мне и комментария было бы достаточно.
(76) Забавно читать такие рассуждения. Так как они верны только для случаев, когда этот код не требует постоянной поддержки. В противном случае эти проблемы напрямую конвертируются в затраты нанимателя. И гораздо дешевле в этом случае работать с людьми, которые эти проблемы не генерят.
   acht
 
79 - 21.07.21 - 13:42
(76) > это проблемы того кто читает.
Это пока ты в одиночку для себя любимого пишешь. И то, когда через месяца три вернещся к коду - начнешь на кофейной гуще гадать, что же тогда имелось в виду?

> он написал таким кодом шахматы
Вот-вот. Забавная такая хня, которой можно гордится.
   StanLee
 
80 - 21.07.21 - 13:44
я по удобству чтения кода ставлю, например мне удобнее читать такой код "НЕ ЗначениеЗаполнено()" и такой: "Если МояПеременная <> Неопределено"
   fisher
 
81 - 21.07.21 - 13:45
(80) В общем случае это неравноценный код.
   Галахад
 
82 - 21.07.21 - 13:47
(78) Тут проблема в чтобы переменная точно передавала смысл условия.
И иногда в условие что-то может изменится, а вот имя переменной менять мало кто будет.
   fisher
 
83 - 21.07.21 - 13:48
А код NS'a - это конечно что-то с чем-то. Заглядывал я в его шахматы. Умный мужик, но из команды я бы его ссаными тряпками гнал. Ну или посадил на разработку черных ящиков, которые с большой вероятностью трогать не придется.
   Вафель
 
84 - 21.07.21 - 13:54
(83) это все следствия олимпиадного программирования
   fisher
 
85 - 21.07.21 - 13:56
(84) У него хоть оправдания были. Он там из 1С выжимал производительность, как алкоголик водку из дохлой кошки. Не удивлюсь, если бы он с фактами на руках доказал что длинные мнемонические замедляют его программу :)
   Конструктор1С
 
86 - 21.07.21 - 14:03
(75) код лечится рефакторингом. Причёсывая говно получишь причёсанное говно. Поэтому нужно пересмотреть не только саму логическую проверку, но и окружающий код. Эта уродливая проверка уже сама по себе индикатор, что в коде проблемы. Когда код будет переписан по-человечачи, уродливая логическая проверка сама исчезнет
   fisher
 
87 - 21.07.21 - 14:11
(86) А когда и рефакторинг кода не помогает - мы отрефакторим постановку задачи. Ты, случаем, не консалтером работаешь?
   Галахад
 
88 - 21.07.21 - 14:12
(86) Ну не знаю. По каким критериям код из (64) вообще попал в говнокод? Какие общепринятые стандарты он нарушает?
   fisher
 
89 - 21.07.21 - 14:13
(88) Градиент наморщивания лба превышает ПДК.
   Guk
 
90 - 21.07.21 - 14:17
(84) точно! хотя мне было объяснено, что это следствие не только олимпиадного, но и экстремального программирования ;)
из-за этого и срались постоянно, когда приходилось что-то дописывать в его коде ;)...
   Конструктор1С
 
91 - 21.07.21 - 14:17
(87) нет. Не запускай код до плачевного состояния и не придётся страдать при рефакторинге
   fisher
 
92 - 21.07.21 - 14:19
(91) Тебе видимо повезло работать с идеальными разработчиками и постановщиками. Если, конечно, под кодом здорового человека ты понимаешь не только собственный код. Я бы к такому даже и не подумал придираться. Хотя комментарий не помешал бы, конечно.
   Конструктор1С
 
93 - 21.07.21 - 14:22
(88) в нем слишком сложное логическое условие
   StanLee
 
94 - 21.07.21 - 14:23
вполне себе нормальное условие и читается нормально
   Конструктор1С
 
95 - 21.07.21 - 14:23
(92) нет, не повезло. Постоянно вязну в говнокоде
   Guk
 
96 - 21.07.21 - 14:23
(93) ;)...
   fisher
 
97 - 21.07.21 - 14:24
(95) Если в таком, то тебе таки повезло.
   Галахад
 
98 - 21.07.21 - 14:27
(89) Если там таких условий куча, тогда да. А одно уж как-нибудь можно понять.

(93) Нет.
   Hans
 
99 - 21.07.21 - 14:28
(0) Тоже считаю так делать нельзя. "Не" не надо по возможности.
   Почему 1С
 
100 - 21.07.21 - 14:29
(92) Комментарий внутри функций с вероятностью 90% признак плохого кода.
К комментариям описаниям функции/процедуры это не относится
  1  2   

Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.