|
"Не" как антипаттерн програмирования | ☑ | ||
---|---|---|---|---|
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 - подготовка к расчету // - исправляет некорректные исходные данные // - выполняет проверку данных. ПодготовкаИсходныхДанныхКРасчету(ПараметрыРасчета); |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |