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

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

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

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

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

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

Ситуации (не ЗначениеЗаполнено() не ... is null к этому не относятся в них с чтением кода проблем у  меня нет)
   Конструктор1С
 
101 - 21.07.21 - 14:30
(98) да. Приведу чуть больше этого говна. И это только часть одной уродской огромной процедуры. Попробуй разобраться, что вообще делает этот код?

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

   Конструктор1С
 
107 - 21.07.21 - 14:43
(102) этот говнокод несколько раз анализирует и сам же меняет один и тот же булев флаг. Допустить в таком ошибку при доработке, или неправильно истолковать его, - как два пальца об асфальт
   Почему 1С
 
108 - 21.07.21 - 14:45
(106) Сейчас местные гении в раз слева на право его прочитают )))
   Guk
 
109 - 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) Этот код тоже не нарушает стандартов. Даже по когнитивной и цикломатической сложности.
   fisher
 
111 - 21.07.21 - 14:53
(107) Да ну нет. Тут достаточно простой и понятный паттерн. Я бы просто в функцию вынес и сразу делал возврат при срабатывании очередной проверки.
   fisher
 
112 - 21.07.21 - 14:57
А здесь так как решили оставить в портянке приходится каждый раз проверять - а имеет ли вообще смысл дальше проверять.
   Злопчинский
 
113 - 21.07.21 - 15:29
(111) а это бяка. ругаются. возврат должен типа быть один.
хотя я вот делаю как раз так - проверка - результат - возврат. или дальше если Не Результат ;-)
так понятнее при чтении, а то проверка возврата нет.. хз что там еще внизу по коду будет.. а так - глянул и все понятно. как график нарядов по КПП
   fisher
 
114 - 21.07.21 - 15:40
(113) Пусть ругаются. Если код линейный а возвраты по понятному паттерну, то какая альтернатива? Ветвления? Или паттерн из (101)? Как по мне, с возвратами и читабельнее и производительнее.
   StanLee
 
115 - 21.07.21 - 15:46
(109) этот код по-видимому писался с использованием некоего алкоголя, разбирать его также надо с использованием желательно того же самого напитка, иначе никак
   Конструктор1С
 
116 - 21.07.21 - 16:17
(110) ты уверен? В этом коде нарушены важнейшие вещи - удобочитаемость и абстракция. Удобочитаемость скатилась в дерьмо, а абстракции просто нет, какое-то месиво из кода. Почему ты так рьяно защищаешь этот говнокод? Да и когнитивная сложность у кода чрезмерно высокая
   Конструктор1С
 
117 - 21.07.21 - 16:19
(111) говно там, а нее паттерн. Обрати внимание на флаг ТребуетсяУказаниеДопДанных. Он несколько раз проверяется и тут же меняется. Самое настоящее ректальное программирование
   Конструктор1С
 
118 - 21.07.21 - 16:20
(114) где ты там увидел линеный код?
   StanLee
 
119 - 21.07.21 - 16:21
и как переделать этот код чтобы не был говнокодом? там вроде не такой сложный кусок программы чтобы дробить его на процедуры или тратить время на перестановку буковок
   Конструктор1С
 
120 - 21.07.21 - 16:48
(119) там надо смотреть код по стеку выше. Выпрямить вышестоящий код, и большинство этих говнопроверок сами отпадут. Оставшиеся сложные проверки можно вынести в отдельные функции

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

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

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

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

        ПараметрыЗапускаРасчетаПериода = ИнициализироватьПараметрыЗапускаРасчетаПериода(СтрокаСхемыРасчета);
        ПараметрыЗапускаРасчетаПериода.Вставить("ВыполняетсяОбновлениеИБ", Истина);
        
        // Формирует временные таблицы:

        // - ВТУчетныеПолитикиОрганизаций (учетные политики рассчитываемых организаций)

        // - ВТУчетныеПолитикиПрошлогоПериода (аналогично, но за предыдущий месяц)

        // - ВТПравилаЗаполненияПоляТипЗаписи (правила проверки первичных записей регистра себестоимости)

        // - ВТОтборАналитикаПоПартнерам (ключи аналитики партнеров с рассчитываемыми организациями)

        // - ВТСтоимостьПартийТоваров (расширенный аналог регистра сведений СтоимостьТоваров с полями партий; пока пустая).

        ИнициализироватьПараметрыРасчетаПартий(ПараметрыЗапускаРасчетаПериода, ПараметрыРасчета, ПараметрыОтладки);
        
        // Этап 0 - подготовка к расчету

        // - исправляет некорректные исходные данные

        // - выполняет проверку данных.

        ПодготовкаИсходныхДанныхКРасчету(ПараметрыРасчета);
  1  2

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