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

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

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

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

Ситуации (не ЗначениеЗаполнено() не ... is null к этому не относятся в них с чтением кода проблем у  меня нет)
1 TormozIT
 
гуру
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
Стандартам не противоречит - нормальный код.
3 lodger
 
21.07.21
09:10
"не ЗначениеЗаполнено() не ... is null" - специфичны для применяемой переменной и могут давать разные результаты при такой мутабельности переменных. поэтому придирок меньше.

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

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

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

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

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

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


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

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

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

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

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

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

а если НЕ присутствует в сложной логической проверке, то такая заведомо заставляет перечитать код несколько раз, легко можно попасть в ловушку и понять код не правильно

Не <Условие1> И <Условие2> И Не <Условие3> Или <Условие4>

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

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

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

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

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

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

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

Если ДанныеШтрихкода <> Неопределено
    И Не ТребуетсяУказаниеДопДанных Тогда
    
    Если Не ТребуетсяУказаниеДопДанных
        И ПараметрыСканирования.ЗапрашиватьНоменклатуру
        И (Не ЗначениеЗаполнено(ДанныеШтрихкода.Номенклатура)
        Или Не ЗначениеЗаполнено(ДанныеШтрихкода.АлкогольнаяПродукция)) Тогда
        ТребуетсяУказаниеДопДанных = Истина;
    КонецЕсли;
    
    Если Не ТребуетсяУказаниеДопДанных
        И ЗначениеЗаполнено(ПараметрыСканирования.ДокументОснование)
        И Не ЗначениеЗаполнено(ДанныеШтрихкода.Серия)
        И ДанныеДокументаОснования <> Неопределено Тогда
        
        ПараметрыПоиска = Новый Структура;
        ПараметрыПоиска.Вставить("Номенклатура",   ДанныеШтрихкода.Номенклатура);
        ПараметрыПоиска.Вставить("Характеристика", ДанныеШтрихкода.Характеристика);
        
        НайденныеСтроки = ДанныеДокументаОснования.НайтиСтроки(ПараметрыПоиска);
        Если НайденныеСтроки.Количество() > 0
            И ЗначениеЗаполнено(НайденныеСтроки[0].Серия) Тогда
            ТребуетсяУказаниеДопДанных = Истина;
        КонецЕсли;
        
    КонецЕсли;
    
КонецЕсли;
102 fisher
 
21.07.21
14:34
И что неясного? Выясняется, требуется ли введение каких-то доп-данных. Выясни, что происходит при ТребуетсяУказаниеДопДанных и все станет ясно как божий день.
103 StanLee
 
21.07.21
14:35
если требуется запрашивать номенклатуру, но не указана номенклатура  или алкопродукция, то нужно требовать доп данные
если же не требуется указание доп данных и нет серии и есть документ основание, то ищем нужную номенклатуру в документе основания
  если не нашли номенклатуру то требовать доп данные
да все изумительно читается, просто изумительно, кодер молодец, надо выдать огурец!
104 StanLee
 
21.07.21
14:37
нормальное человеческое чтение, прям как книгу читать
а вот бывает "инженерное" чтение, когда все по шаблону и в непонятном порядке или в одну строку, и этот шаблон рвет мой внутренний шаблон, вот тогда грусть-печаль
105 fisher
 
21.07.21
14:41
Если это часть громадной портянки, то код конечно неидеален в плане читабельности. Ее можно и повысить. Но до говнокода ему пилить и пилить. Сдается мне, что Галя балувана.
106 Smallrat
 
21.07.21
14:42
Мне как то пришлось разгребать такое:

ЗначениеСубконто = ?(ЗначениеЗаполнено(ТекущееЗначениеСубконто) и ТипЗнч(ТекущееЗначениеСубконто) = Тип("СправочникСсылка.Активы") И ЗначениеЗаполнено(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущееЗначениеСубконто,"Объект")),?(ТипЗнч=Тип("СправочникСсылка.Акции") ИЛИ ТипЗнч=Тип("СправочникСсылка.ПаиПИФ") ИЛИ ТипЗнч=Тип("СправочникСсылка.Облигации") ИЛИ ТипЗнч=Тип("СправочникСсылка.ДепозитарныеРасписки") ИЛИ ТипЗнч=Тип("СправочникСсылка.СтруктурныеНоты"),ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущееЗначениеСубконто,"Объект"),"Эмитент"), ?(ТипЗнч=Тип("СправочникСсылка.ДенежныеТребования") ИЛИ ТипЗнч=Тип("СправочникСсылка.ДолиУК"),ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущееЗначениеСубконто,"Объект"),"Контрагент"), ?( ТипЗнч=Тип("СправочникСсылка.Векселя"),ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущееЗначениеСубконто,"Объект"),"Векселедатель"),?(ТипЗнч=Тип("СправочникСсылка.ИпотечныеСертификатыУчастия"),ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ТекущееЗначениеСубконто,"Объект"),"УправляющийИпотечнымПокрытием"),Справочники.Контрагенты.ПустаяСсылка() )))),Справочники.Контрагенты.ПустаяСсылка());
107 Конструктор1С
 
21.07.21
14:43
(102) этот говнокод несколько раз анализирует и сам же меняет один и тот же булев флаг. Допустить в таком ошибку при доработке, или неправильно истолковать его, - как два пальца об асфальт
108 Почему 1С
 
21.07.21
14:45
(106) Сейчас местные гении в раз слева на право его прочитают )))
109 Guk
 
21.07.21
14:48
(93) вот сложное условие ;)...

Если ЗначениеЗаполнено(СтрокаТЗНоменклатура.РодительКод) И СокрЛП(СтрокаТЗНоменклатура.РодительКод) <> СокрЛП(СтрокаТЗДФ.RODKOD)
    
    ИЛИ СокрЛП(СтрокаТЗНоменклатура.Наименование)    <> СокрЛП(СтрокаТЗДФ.NAIM)
    ИЛИ (СтрокаТЗНоменклатура.РодительКод            <> СокрЛП(СтрокаТЗДФ.RODKOD))                        
    
    ИЛИ НЕ СтрокаТЗНоменклатура.ЭтоГруппа
    И ( //проверка реквизитов элемента
    Найти(ВРЕГ(СокрЛП(СтрокаТЗНоменклатура.ЕдиницаИзмерения)), ВРЕГ(СокрЛП(СтрокаТЗДФ.OSNED))) = 0
    
    ИЛИ СокрЛП(СтрокаТЗНоменклатура.НаименованиеПолное)<> СокрЛП(СтрокаТЗДФ.NAIM)
    ИЛИ    СтрокаТЗНоменклатура.ВесЧислитель             <> Число(СтрокаТЗДФ.OSNEDK)
    ИЛИ    СтрокаТЗНоменклатура.ВесЗнаменатель        <> 1
    ИЛИ    СтрокаТЗНоменклатура.СтавкаНДС                <> Число(СокрЛП(СтрокаТЗДФ.NDS))/100
    ИЛИ    СтрокаТЗНоменклатура.КратностьЗаказа        <> КратностьЗаказаИзФайла
    
    ИЛИ ЕстьКоличественныеПараметрыТовара И
    (СтрокаТЗНоменклатура.ОстатокТовара        <> ОстатокИзФайла
    ИЛИ    СтрокаТЗНоменклатура.СредниеПродажиТовара        <> ПродажиИзФайла
    ИЛИ    СтрокаТЗНоменклатура.ОжидаетсяПоступлениеТовара        <> ВПутиИзФайла)
    
    ИЛИ    СтрокаТЗНоменклатура.НетНаСкладе                 <> НетНаСкладеИзФайла
    ИЛИ    СокрЛП(СтрокаТЗНоменклатура.Состав)             <> СоставИзФайла
    ИЛИ    СокрЛП(СтрокаТЗНоменклатура.СрокГодности)        <> СрокГодностиИзФайла
    ИЛИ    СтрокаТЗНоменклатура.СрокГодностиЧислом <> СрокГодностиЧисломИзФайла
    ИЛИ    СокрЛП(СтрокаТЗНоменклатура.УсловияХранения)    <> УсловияХраненияИзФайла
    ИЛИ    СтрокаТЗНоменклатура.ПометкаУдаления            <> ПометкаУдаленияИзФайла                        
    
    ИЛИ Найти(ВРЕГ(СокрЛП(СтрокаТЗНоменклатура.ЕдиницаВозврата)), ВРЕГ(СокрЛП(СтрокаТЗДФ.EDV))) = 0
    ИЛИ СтрокаТЗНоменклатура.ВесЧислительВозврата <> ВесЧислительВозвратаИзФайла)
    //конец проверки реквизитов элемента
    
Тогда
110 Галахад
 
гуру
21.07.21
14:49
(101) Этот код тоже не нарушает стандартов. Даже по когнитивной и цикломатической сложности.
111 fisher
 
21.07.21
14:53
(107) Да ну нет. Тут достаточно простой и понятный паттерн. Я бы просто в функцию вынес и сразу делал возврат при срабатывании очередной проверки.
112 fisher
 
21.07.21
14:57
А здесь так как решили оставить в портянке приходится каждый раз проверять - а имеет ли вообще смысл дальше проверять.
113 Злопчинский
 
21.07.21
15:29
(111) а это бяка. ругаются. возврат должен типа быть один.
хотя я вот делаю как раз так - проверка - результат - возврат. или дальше если Не Результат ;-)
так понятнее при чтении, а то проверка возврата нет.. хз что там еще внизу по коду будет.. а так - глянул и все понятно. как график нарядов по КПП
114 fisher
 
21.07.21
15:40
(113) Пусть ругаются. Если код линейный а возвраты по понятному паттерну, то какая альтернатива? Ветвления? Или паттерн из (101)? Как по мне, с возвратами и читабельнее и производительнее.
115 StanLee
 
21.07.21
15:46
(109) этот код по-видимому писался с использованием некоего алкоголя, разбирать его также надо с использованием желательно того же самого напитка, иначе никак
116 Конструктор1С
 
21.07.21
16:17
(110) ты уверен? В этом коде нарушены важнейшие вещи - удобочитаемость и абстракция. Удобочитаемость скатилась в дерьмо, а абстракции просто нет, какое-то месиво из кода. Почему ты так рьяно защищаешь этот говнокод? Да и когнитивная сложность у кода чрезмерно высокая
117 Конструктор1С
 
21.07.21
16:19
(111) говно там, а нее паттерн. Обрати внимание на флаг ТребуетсяУказаниеДопДанных. Он несколько раз проверяется и тут же меняется. Самое настоящее ректальное программирование
118 Конструктор1С
 
21.07.21
16:20
(114) где ты там увидел линеный код?
119 StanLee
 
21.07.21
16:21
и как переделать этот код чтобы не был говнокодом? там вроде не такой сложный кусок программы чтобы дробить его на процедуры или тратить время на перестановку буковок
120 Конструктор1С
 
21.07.21
16:48
(119) там надо смотреть код по стеку выше. Выпрямить вышестоящий код, и большинство этих говнопроверок сами отпадут. Оставшиеся сложные проверки можно вынести в отдельные функции

>>там вроде не такой сложный кусок программы чтобы дробить его на процедуры

дробить на процедуры нужно не когда глаза закровоточат, а гораздо раньше. Чтобы была декомпозиция, уровни абстракции и вот это всё
121 fisher
 
21.07.21
16:59
(117) Критикуя - предлагай. Мы подождем твоей альтернативы и сравним.
(118) Ок. Код без сложных ветвлений (иначе), который вследствие этого читается линейно. Так буквоеды проглотят?
122 Конструктор1С
 
21.07.21
17:06
(121) предлагаешь заморочиться и отрефакторить это дермо? А ради чего, чтобы доказать что код может быть читабельнее и линейнее? По-моему это и так очевидно
123 fisher
 
21.07.21
17:08
(122) Мне неочевидно. Мне действительно любопытно, на какие высоты тебе удастся поднять читабельность этого кода. И сравнить величину твоего пафоса с величиной разницы в читабельности.
124 Конструктор1С
 
21.07.21
17:10
(123) от это да... Называть говнокод говнокодом уже пафос? Рефакторить я умею, не сомневайся. В своей компании я даже обучаю это делать других
125 fisher
 
21.07.21
17:10
"я даже обучаю" - это многое объясняет в плане пафоса.
126 Конструктор1С
 
21.07.21
17:20
(125) да причём тут пафос? Рефакторинг и стремление сделать код лучше для тебя пафос?
127 fisher
 
21.07.21
17:29
Лично я вижу, что этот код можно декомпозировать и оформить аккуратнее. При декомпозиции уйдут и проверки флага, на которых тебя почему-то зациклило. Но чем этот код не является - так это говнокодом.
Он линейно читается, имеет приемлемые названия переменных, не содержит повторяемого кода, не вызывает у меня никаких wtf и при необходимости рефакторится в пол-пинка. Если ты такой код называешь говнокодом, то для настоящего говнокода у тебя стопудов должно быть какое-то особое название.
128 fisher
 
21.07.21
17:46
Вспоминается несколько конюшен, которые мне приходилось разгребать, чтобы внести требуемые заказчиком поправки. В первозданном виде я попросту не был на это способен, настолько там все было эпично.
Начинаешь потихоньку разбираться, переименовывая переменные в процессе постижения их сакрального смысла. Особый кайф при этом когда они меняют свой смысл по ходу повествования.
Потом переписываешь постигнутые кусочки на более лаконичные и без wtf. Потом аккуратно декомпозируешь повторяющийся код кое-где. Тоже поэтапно. Постепенно подбираешься к самому вкусному - запутанному лабиринту безусловных переходов в самых неожиданных местах. Из условий, из циклов - отовсюду. Распутываешь потихоньку этот клубок и переписываешь нормально. Когда картинка наконец начинает помещаться в мозгу не взрывая его, облегченно вздыхаешь и переписываешь окончательно. И! Наконец! Ты способен внести контролируемые изменения! Победа!!!
Вот это я понимаю говнокод. А тебе анализ флага поперек горла встал.
129 Конструктор1С
 
21.07.21
18:17
(128) вот вроде бы понимаешь губительность невразумительного кода, но почему оправдываешь непотребство в (101). Признайся, ведь тебе пришлось перечитать его несколько раз, побегать глазками ввер-вниз, прежде чем ты понял логику кода. А ведь это несчастные 20 строк кода. Было бы их 2000, пришлось бы изрядно побарахтаться. В этом и есть проблема плохого кода - он нещадно пожирает время и интеллектуальные ресурсы читающего тот самый код. Да, в программировании есть такой парадокс - плохой код стоит дорого, дороже качественного, отшлифованного кода
130 vi0
 
21.07.21
20:31
(0) плохой код, согласен
с НЕ там две операции, и нужно внимание чуть больше напрягать при чтении по этой причине
131 Asmody
 
21.07.21
20:41
(128) всё так, только в какой-то момент ты осознаёшь, что уже впёрся в код типовой, и всё, трындец
132 Смотрящий
 
21.07.21
20:53
(0) Из резюме можешь убрать пункт
Умею читать чужой код
133 vi0
 
22.07.21
03:59
(9) НЕ ЭтоНеГруппа <> Неопределено
вполне возможно встретить
134 Конструктор1С
 
22.07.21
07:05
(132) ценится умение писать качественный, гибкий код. А не умение копаться в чужих экскрементах. Второе лишь вынужденная мера, а не навык сам по себе
135 fisher
 
22.07.21
09:14
(129) Основные умственные усилия - это убедиться что этот код делает именно то, что он делает и ничего лишнего. Это исправляется банальным комментарием или простейшей декомпозицией. Говнокод так легко не победить.
(133) Встретить еще и не то можно. Главное - самому такого не писать.
136 ДенисЧ
 
22.07.21
09:16
(134) Плевать всем на твой код.
Ценится умение быстро и качественно решать задачи.
А если для решения задачи нужно раскопать копрокод - значит, ты должен это уметь. Если встанешь в позу "я один в белом, а всё остальное коричневое и плохо пахнет" - с тобой долго работать и разговаривать не будут
137 Галахад
 
гуру
22.07.21
09:37
(116) У 1С есть вполне вменяемые стандарты. Если код их не нарушает, уже как-то можно жить...
И да, приведенный фрагмент кода, сам по себе не сложен.
138 fisher
 
22.07.21
09:49
(136) Ну дык одно дело раскопать легаси, а другое дело когда твоя команда генерит копрокод. А как ты правильно заметил - "ценится умение быстро и качественно решать задачи". И для команды в целом это тоже верно. Ну и даже если разработка в одно лицо. Каким бы крутым копроархеологом ты ни был - ты все равно будешь тратить кучу времени на раскопки, повышая стоимость услуг для работодателя. Чистота кодовой базы - это актив. Если конечно речь о коде, который требует поддержки. Но 1С чаще всего и имеет дело с кодом, требующим поддержки.
Чем чище и однообразнее пишет команда - тем эффективнее она решает задачи. Ну и как показывает практика, обычно наблюдается очевидная зависимость между чистотой кода и его эффективностью. Чисто пишут обычно программисты, достаточно грамотные и в вопросах эффективности тоже. Потому что опыт программиста развивается часто в таком направлении - сначала тебя заботит как вообще решать задачи, хоть как-нибудь. Потом с набором опыта начинаешь задумываться о том, как решать задачи эффективно. И наконец - как оформлять свои решения самодокументируемо и максимально удобно для возможных доработок в будущем. Последнее приходит обычно само собой с опытом долгой и серьезной работы на больших проектах (что ессно добавляет экспириенса и во многих других аспектах). Поэтому качество кода в первом приближении может немало рассказать и о бэкграунде программиста. Огромная прослойка программистов пишущих грязно - находятся на первом этапе со всеми вытекающими.
139 Почему 1С
 
22.07.21
10:19
(136) Да конечно, всем плевать на начальном этапе, а то что в таких системах со временем на основе этого копрокода задачи решать приходится на порядке дольше не задумывался?
(134) Жму руку, я думал тут адекватных людей больше будет, в некоторых прямо разочаровался.
140 Asmody
 
22.07.21
10:22
(139) "я думал тут адекватных людей больше будет" - мы просто очень давно уже тут сидим.
141 ДенисЧ
 
22.07.21
10:23
(138) (139) Я не совсем понял.
Вы решили, что я агитирую писать какашкокод?
Я вообще отвечал на "А не умение копаться в чужих экскрементах".
142 rsv
 
22.07.21
10:36
(0) верно. Есть же <>
143 rsv
 
22.07.21
10:37
А можно еще в типовых динамически через стопитцот процедур собирать
Текст запроса . Сопровождение таких подходов равно 0 .
144 mikecool
 
22.07.21
10:40
разбираешь такой копрокод, материшься и думаешь - какой гад это написал?
и тут до тебя доходит, что это твой код трехмесячной давности...
занавес
145 mikecool
 
22.07.21
10:42
+144 сейчас как раз занимаюсь рефактором своего ОМ строк на 6к
так много и так безжалостно я еще не выкашивал )))
146 fisher
 
22.07.21
11:06
(141) А что я должен был решить глядя на "плевать всем на твой код"? Если всем плевать - значит нет причин не писать какашкокод.
147 Конструктор1С
 
22.07.21
13:39
(136)

>>Ценится умение быстро и качественно решать задачи

Ты не сможешь быстро и качественно решить задачу, если кругом говнокод:
1. Говнокод нещадно гробит время. На то, что можно было сделать за пару часов, уходят дни, а то и недели
2. Говнокод пораждает новый говнокод. Про качество можно забыть
148 vi0
 
22.07.21
14:25
(135) главное чтобы человек был щаслис
149 ManyakRus
 
22.07.21
14:27
Не надо доделывать чужой код. Чужой код надо сразу стирать и делать заново :)
(кроме типового кода конфигурации)
150 dubolom
 
22.07.21
14:27
Людей, не пишущих говнокода вообще, очень мало, и они на вес золота. Потому что задача не просто в том, чтобы писать нормально, а и в том, чтобы планировать время правильно - всех опросить, всё проанализировать, написать прямыми руками.
151 vi0
 
22.07.21
14:38
(150) во франчах на вез золота быстрые копрокодеры
152 dubolom
 
22.07.21
14:42
(151) Франчи как раз потому существуют и даже получают прибыль, что хороших 1с-ников очень мало. Даже среднего 1с-ника нанять выгоднее в 95% случаев, чем с франчами дело иметь.
153 Smallrat
 
22.07.21
14:54
(152) кхм, нет - свой 1Сник сидит и каждый месяц требует "атста" независимо от того сколько он сделал и это будет бесконечно (потому что отказаться от своего 1Сника, раз он появился, тяжело), франч тебе что-то накрутил на миллион-два и дальше ты ему за поддержку тыщ 10-20 (если от него ничего особенного не требуется) в месяц башляешь и всё.
154 dubolom
 
22.07.21
14:55
(153) Это если компания особо не развивается и всякой новой фигни не внедряете.
155 Smallrat
 
22.07.21
15:00
(154) ситуации конечно разные бывают - но все же, даже если развиваетесь, то есть участки, на которые не хочется отвлекать своих 1сников типа ЗУПа или чего-нить подобного, у них может даже компетенций соответствующих нет, а работы там немного, чтобы окунать своего человека туда, проще бывает франч натравить на этот участок и пусть он с ним возится. Я конечно имею в виду нормальные франчи с нормальными спецами и пониманием ответственности, а не те, которые студентов натаскивают за миску супа.
156 Pprog151713
 
22.07.21
15:50
Если остальное все нормально. То это не проблема вообще. Патерн не патерн.
157 Kassern
 
22.07.21
15:53
(100) ну да ну да, вы это еще разработчикам типовых скажите)
Для Каждого СтрокаСхемыРасчета Из СхемаРасчета Цикл
        
        // Инициализируем параметры расчета.
        ПараметрыЗапускаРасчетаПериода = ИнициализироватьПараметрыЗапускаРасчетаПериода(СтрокаСхемыРасчета);
        ПараметрыЗапускаРасчетаПериода.Вставить("ВыполняетсяОбновлениеИБ", Истина);
        
        // Формирует временные таблицы:
        // - ВТУчетныеПолитикиОрганизаций (учетные политики рассчитываемых организаций)
        // - ВТУчетныеПолитикиПрошлогоПериода (аналогично, но за предыдущий месяц)
        // - ВТПравилаЗаполненияПоляТипЗаписи (правила проверки первичных записей регистра себестоимости)
        // - ВТОтборАналитикаПоПартнерам (ключи аналитики партнеров с рассчитываемыми организациями)
        // - ВТСтоимостьПартийТоваров (расширенный аналог регистра сведений СтоимостьТоваров с полями партий; пока пустая).
        ИнициализироватьПараметрыРасчетаПартий(ПараметрыЗапускаРасчетаПериода, ПараметрыРасчета, ПараметрыОтладки);
        
        // Этап 0 - подготовка к расчету
        // - исправляет некорректные исходные данные
        // - выполняет проверку данных.
        ПодготовкаИсходныхДанныхКРасчету(ПараметрыРасчета);
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший