Имя: Пароль:
1C
 
SONARQUBE У кого тоже есть такая проверка?
🠗 (Волшебник 19.10.2020 09:27)
,
0 osa1C
 
18.10.20
09:37
Доброго всем времени суток!
Ветка как обсуждение, как такового вопроса нет...
Столкнулся в одной крупной организации с проверкой кода Сонар Кубом. Вроде как проверка на гавнокод... Но иногда доходит до глупости вида
//Добавлено 02.10.2020 [отАвтор} по задаче 3243565-ИР - это комментарий в коде. Ругается на отсутствие ПРОБЕЛА после //. Смешно! Но это мелочь. Наткнулся и на другие проблемы.
   Например:
НужныйТипДокумента =  Получить(ДокОбъект);

Функция НужныйТипДокумента (ДокОбъект)

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

выдает ошибку "Слишком сложное условие в Если.... внесите в переменную, а также вынесите условия в отдельную функцию"


прикольно... а как у вас?
1 NorthWind
 
18.10.20
09:42
(0) ну в общем он прав. Как минимум имеет смысл сделать ТипОбъекта = ТнпЗнч(ДокОбъект) и потом сравнивать переменную. Если сравнений реально много (больше пяти), то я могу сделать из них список значений и потом в условии просто проверить принадлежность значения переменной списку. Это более читабельно.
2 ДенисЧ
 
18.10.20
09:50
Насчёт пробела - это требования к комментариям от 1с. Так что тут всё нормально. Ещё и точку в конце не забудь
3 osa1C
 
18.10.20
09:51
(1) С этим я согласен, но само условие из двух ИЛИ .... чем сложно?
4 osa1C
 
18.10.20
09:53
(2) Ден, Чем мешается отсутствие пробела в комментарии, поясни...
5 Конструктор1С
 
18.10.20
09:55
>>выдает ошибку "Слишком сложное условие в Если.... внесите в переменную, а также вынесите условия в отдельную функцию"

Он всё правильно говорит. Это проверка на говнокодерство. Слишком сложные логические проверки усложняют восприятие кода
Предлагает тебе вынести логическое условие за конструкцию Если. Либо в переменную, либо в отдельную функцию

ТнпЗнч(ДокОбъект) = Тип("ДокументОбъект.ПриходныйКассовыйОрдер")
    Или ТнпЗнч(ДокОбъект) = Тип("ДокументОбъект.ПоступлениеБезналичныхДС")
    Или ТнпЗнч(ДокОбъект) = Тип("ДокументОбъект.ВзаимозачетДенежныхСредств")

вот это чтобы не торчало внутри Если. Можно например так

ТипДокумента = ТнпЗнч(ДокОбъект);
ЭтоПоступлениеДенех = ТипДокумента  = Тип("ДокументОбъект.ПриходныйКассовыйОрдер")
    Или ТипДокумента = Тип("ДокументОбъект.ПоступлениеБезналичныхДС")
    Или ТипДокумента = Тип("ДокументОбъект.ВзаимозачетДенежныхСредств");

Если ЭтоПоступлениеДенех Тогда
    Возврат Истина;
Иначе
    Возврат Ложь;
КонецЕсли;

и название функции НужныйТипДокумента() у тебя говнокодерское (хотя сонаркуб этого и не выявляет). Оно не говорит совершенно ни о чём. Чтобы понять цель функции нужно занырнуть внуть. Переименуй хотя бы на ЭтоДокументВыполняющихПриходДенежныхСреств(), такое название описывает выполняемую функцией проверку
6 NorthWind
 
18.10.20
09:56
(3) там, во-первых, не из двух, а из трех, а во-вторых, внутри условия еще вызовы функций.
Такие штуки довольно бывает муторно читать "свежему" человеку, если используются какие-то более редкие функции чем ТипЗнч (). Вот на это оно у вас и обругалось.
7 ДенисЧ
 
18.10.20
09:59
(4) Есть правила, прописанные вендором. Их надо соблюдать.
8 ДенисЧ
 
18.10.20
10:00
(5) "ЭтоПоступлениеДенех = ТипДокумента  = Тип("ДокументОбъект.ПриходныйКассовыйОрдер")
    Или ТипДокумента = Тип("ДокументОбъект.ПоступлениеБезналичныхДС")"

Это что за говнокод??
9 Конструктор1С
 
18.10.20
10:00
(4) усложняют чтение комментария
10 NorthWind
 
18.10.20
10:00
Я бы сделал вот так

    // Ниже перечисление типов для проверки. При необходимости могут быть легко
    // добавлены новые
    ТипыДляПроверки = Новый СписокЗначений ();
    ТипыДляПроверки.Добавить (Тип ("ДокументОбъект.ПриходныйКассовыйОрдер"));
    ТипыДляПроверки.Добавить (Тип ("ДокументОбъект.ПоступлениеБезналичныхДС"));    
    ТипыДляПроверки.Добавить (Тип ("ДокументОбъект.ВзаимозачетДенежныхСредств"));    
    
    Возврат ТипыДляПроверки.НайтиПоЗначению(ТипЗнч (ДокОбъект));

Думаю, на это оно не обругалось бы.
11 Конструктор1С
 
18.10.20
10:01
(8) это поясняющая переменная. Пока что неведомый для 1сников зверёк. Название переменной поясняет, что и для чего
12 NorthWind
 
18.10.20
10:01
Точнее

Если ТипыДляПроверки.НайтиПоЗначению(ТипЗнч (ДокОбъект))=Неопределено Тогда
Возврат Ложь;
Иначе
Возврат Истина;
13 NorthWind
 
18.10.20
10:02
КонецЕсли;
14 osa1C
 
18.10.20
10:02
Т (8) С чего это то говонокод, если с функции булево возращать таким кодом
15 ДенисЧ
 
18.10.20
10:03
(11) Это не переменная. Это говнокод, который невозможно с первого взгляда прочитать
16 Конструктор1С
 
18.10.20
10:03
(14) как-минимум из-за говнокодерского названия функции. Название должно рассказывать, что делает данная функция
17 Конструктор1С
 
18.10.20
10:04
(15) с чего бы это вдруг? Т.е. для тебя открытие, что до первого знака равенства содержится имя переменной, которой присваивается значение?
18 osa1C
 
18.10.20
10:06
(16) ок, я похож на говнокодера, как я должен был назвать функцию, чтобы тебе было понятно?
19 Стаканов
 
18.10.20
10:08
Опять срач на ровном месте. ТС, используй АПК для начала, там прямо из ошибки можно перейти на описание стандарта на ИТС, и там почитать, что к чему и как.
20 osa1C
 
18.10.20
10:09
Вообще то переписав код получил его от СонарКуб без ошибок, но все равно не считаю что Сонара прав
21 Конструктор1С
 
18.10.20
10:10
(18) должно быть понятно не мне, а читающему код. Вот увидел некий Вася в коде

...
НужныйТипДокумента(ДокОбъект)
...

о чём ему говорит название НужныйТипДокумента? Да ни о чём. Такое название провоцирует залезть внутрь функции чтобы выяснить её содержимое. А будь у функции "говорящее" название, потребность заглядывать вовнутрь отпала бы сама собой
22 ДенисЧ
 
18.10.20
10:10
(17) Ещё раз. Чтобы нормально читать - это говнокод. Хочешь так писать - хотя бы поставь скобки. Тогда не так сильно бить будут.
23 Конструктор1С
 
18.10.20
10:10
(20) тем не менее, он прав. Ща нацитирую МакКонела
24 ДенисЧ
 
18.10.20
10:10
(18) Например, ЭтоНужныйТипДокумента. Минимум
25 ДенисЧ
 
18.10.20
10:11
Кстати, об АПК

Возьмите типовую и прогоните... )))
26 osa1C
 
18.10.20
10:11
(19) В чем заключен расчет производительности от того что в Если засунул условие с двумя ИЛИ ?
27 osa1C
 
18.10.20
10:12
Условие с двумя ИЛИ убивает производительность системы?
28 Стаканов
 
18.10.20
10:13
(25) Да нафига типовую проверять, даже если в типовых лажа, это не повод самому лажу гнать. Проверять свой внесенный код надо.
29 Стаканов
 
18.10.20
10:14
(26) При чём тут производительность, это замечание на соответствие читаемости кода понятиям 1С.
30 Конструктор1С
 
18.10.20
10:14
(22) что ты пристал? Я всего-лишь вытящил конструкцию ТС за Если. Мог бы расписать ещё "документальнее"


ТипДокумента = ТнпЗнч(ДокОбъект);

ЭтоПоступлениеНалички = (ТипДокумента  = Тип("ДокументОбъект.ПриходныйКассовыйОрдер"));
ЭтоПоступлениеБезнала = (ТипДокумента = Тип("ДокументОбъект.ПоступлениеБезналичныхДС"));
ЭтоВзаимозачетДенег = (ТипДокумента = Тип("ДокументОбъект.ВзаимозачетДенежныхСредств"));

ЭтоПоступлениеДенех = (ЭтоПоступлениеНалички Или ЭтоПоступлениеБезнала Или ЭтоВзаимозачетДенег);

Если (ЭтоПоступлениеДенех) Тогда
    Возврат Истина;
Иначе
    Возврат Ложь;
КонецЕсли;
31 Конструктор1С
 
18.10.20
10:16
(24) добавление "Это" всего-лишь поясняет, что функция выполняет логическую проверку. При этом функция продолжает быть "черной коробочкой", в которую полезе каждый читающий код программист
32 Конструктор1С
 
18.10.20
10:17
(27) сложные логические проверки убивают производительность читающего код
33 osa1C
 
18.10.20
10:17
на сколько быстрее работает конструкция
Тип - ТипЗнч(ДокОбьект);

НужныйТип - ПолучитьНужныйТипДокумента(Тип)



Функция НужныйТипДокумента (Тип)

Возврат = Тип("ДокументОбъект.ПриходныйКассовыйОрдер")
    Или ТнпЗнч(ДокОбъект) = Тип("ДокументОбъект.ПоступлениеБезналичныхДС")
    Или ТнпЗнч(ДокОбъект) = Тип("ДокументОбъект.ВзаимозачетДенежныхСредств")
КонецФункции;
34 Стаканов
 
18.10.20
10:18
(33) Поизучал бы ты стандарты 1С на досуге, глупых вопросов бы поубавилось.
35 Конструктор1С
 
18.10.20
10:18
(33) ни на сколько, но так читабельность ещё больше падает
36 osa1C
 
18.10.20
10:19
+ (33) замена***
Функция НужныйТипДокумента (Тип)

Возврат = Тип("ДокументОбъект.ПриходныйКассовыйОрдер")
    Или Тип("ДокументОбъект.ПоступлениеБезналичныхДС")
    Или Тип("ДокументОбъект.ВзаимозачетДенежныхСредств")
КонецФункции;
37 osa1C
 
18.10.20
10:21
(34) Сам только по стандарту работаешь?
38 Конструктор1С
 
18.10.20
10:23
Блин, МакКонела так просто не втиснешь, слишком много он про сложность кода написал. Но если кому интересно, глава "19.6. Управляющие структуры и сложность" вот этой книги:
https://www.ozon.ru/context/detail/id/138437220/
39 osa1C
 
18.10.20
10:27
(38) Совершенный код это приятно, но не в разделе 1С это давать ))
40 Aleksey
 
18.10.20
10:29
(30) Индуский код? Платят за строки?
41 Конструктор1С
 
18.10.20
10:32
(40) нет, поясняющий код. А экономия на строках кода верный признак говнокодерства
42 NorthWind
 
18.10.20
10:32
(20) конкретно в вашем случае там действительно ничего совсем уж страшного нет. Но вообще стоит принять, что для улучшения читаемости условия должны быть как можно проще. Длинные условия - это плохо, условия, внутри которых много вызовов функций - тоже не есть хорошо. Только и всего. Не стоит подходить к этому как к догме, нужно просто осознать с точки зрения человека, который придет "со стороны" и возьмется читать код.
43 Стаканов
 
18.10.20
10:35
(37) Да, весь код проверяю АПК, пока проверка не пройдёт, в продуктив не добавляю.
44 Aleksey
 
18.10.20
10:43
(42) Т.е. вместо 2 "или" использовать 4 "если" с простым условием и которые возводят с переменными флага внутри проверки?
А ешще лучше вызывать отдельный функции из ГМ передавая вест контекст
45 NorthWind
 
18.10.20
10:47
(44) по-разному можно. Можно (30), можно (10)-(12).
46 Конструктор1С
 
18.10.20
10:47
(44) почитай (38), много нового для себя откроешь. Не собираюсь читать лекцию на тему "что делает код сложным для восприятия и как его сделать простым"
47 Надо работать
 
18.10.20
10:51
(43) крутяк. у себя никак руки не дойдут внедрить... такое пишут люди - волосы дыбом встают ) но если нет провала по производительности - пока пропускаю
48 Конструктор1С
 
18.10.20
10:54
Когда упрощаешь код, неминуемо увеличивается количество строк кода. Это происходит из-за:
- разбиения сложных методов на более простые
- разбиения сложных конструкций на более простые
- разбиения сложных логических проверок на более простые
- некоторого удлинения имен переменных и методов (например, вместо КонтрПодходит() используется КонтрагентЯвляетсяРезидентомСНалоговымиЛьготами())
49 Стаканов
 
18.10.20
13:27
(47) АПК применять можно хотя-бы для понимания, насколько всё плохо, и направления на путь истинный тех, у кого очень плохо :)
50 1CnikPetya
 
18.10.20
16:16
Тоже планируем внедрять статический анализ кода. Только вместо АПК смотрим на SONAR. Тупо намного быстрее (хотя я его не гонял после последних оптимизаций 1С работы над строками).
51 Стаканов
 
18.10.20
16:18
(50) Сонар будет когда-нибудь, да, но надо идти от простого к сложному, а то так ничего и не будет. Для использования АПК практически и никаких усилий не надо.
52 palsergeich
 
18.10.20
17:52
(50) АПК <> Сонар
В Сонаре есть не все, что есть в АПК.
И наоборот тоже верно.
53 Стаканов
 
18.10.20
17:58
(52) Статический анализ это вообще просто гигиена разработки :)
54 osa1C
 
18.10.20
21:57
(43) Оно конечно правильно, но не просаживаться же до нелогичности пробела
55 osa1C
 
18.10.20
21:59
(48) Согласен, и повышается его нечитабильность
56 1CnikPetya
 
18.10.20
23:00
(54) Когда ты пишешь один - на это можно забить. А вот когда на проекте 2 десятка разработчиков, то единый стиль кода намного упрощает процесс ревью кода и последующее чтение. А начиная с пробела может пойти вразброс все: выравнивание табами, именования функций и переменных, оформление запросов и модулей и прочее-прочее. Поэтому проще зафиксировать единые правила и далее следовать им без отклонений.

(52) Давно смотрел на SONAR, но и то не очень глубоко изучал. Предполагаю, что у АПК есть возможность проверки метаданных, верно? Роли, формы, подсистемы, в то время как SONAR ориентирован именно на код?

(55) От грамотной декомпозиции всегда обратный эффект. Портянка на 10 экранов кажется понятной и логичной лишь первые пару недель после написания. А так, "заставь дурака молиться..."
57 Сияющий в темноте
 
18.10.20
23:24
Если условие сложное,то пишите в комментариях,что оно делает,разбивка на дополнительные переменные,на самом деле,только усложняет код,так как вместо условия нужно возвращаться наверх и смотреть,а что там переменной присвоили.
проверка на типы лучше всего идет через описание типов и его метод СодержитТип,тогда ничего не нужно объяснять вообще.
58 Web00001
 
19.10.20
02:39
>>разбивка на дополнительные переменные,на самом деле,только усложняет код,так как вместо условия нужно возвращаться наверх и смотреть,а что там переменной присвоили.
Если в имени переменной написано, что ей присовили и ты это видел когда читал, зачем возвращаться?
59 Стаканов
 
19.10.20
07:44
(54) Так почитай стандарты, там написано, зачем нужен пробел в начале комментария.
60 palsergeich
 
19.10.20
08:05
(59) Не написано
7.3. Большие комментарии или комментарии к фрагменту кода пишутся перед комментируемым кодом в отдельной строке. Текст выравнивается по левой границе комментируемого фрагмента. Между символами комментария "//" и текстом комментария должен быть пробел.
Пруф https://its.1c.ru/db/v8std/content/456/hdoc
61 ДенисЧ
 
19.10.20
08:07
Про комментарии...
Обратите внимание - в том же vscode при комментировании по горячей кнопке тоже ставится пробел...
Общепринято в мире, наверное
62 Конструктор1С
 
19.10.20
09:04
(55) не-а. При перямых руках эффект обратный - с упрощением кода повышается его читаемость
63 Стаканов
 
19.10.20
09:07
(60) Ну вот зачем ты так, я же человека стандарты читать хотел научить :)) Но если подумать, то таки в п.3 написано, зачем :)
64 Конструктор1С
 
19.10.20
09:09
(57) "разбивка на дополнительные переменные,на самом деле,только усложняет код"

Это если переменные обозваны абы как и находятся абы где. Нормальный код читается сверху вниз и один раз (ибо понимается с первого раза). А сложное логическое условие заставляет останавливаться и перечитывать его несколько раз
65 vi0
 
19.10.20
09:10
(61) и с точки зрения читабельности этот пробел понятен
66 Конструктор1С
 
19.10.20
09:20
(57) "лучше всего идет через описание типов и его метод СодержитТип"

сомнительно, ибо такая проверка:
- заставляет скролить вверх, чтобы перечитать содержащиеся в описании типы
- не говорит ничего о том, почему выбраны именно эти типы
67 Web00001
 
19.10.20
09:34
(63)Извините туповат. Думал, думал не придумал. Не смог найти в п.3 про то, зачем нужен пробел. п.3 рассказывает про то, что нельзя оставлять отладочные комментарии, или комментарии имеющие отношение к процессу разработки, а про пробел ни слова.
68 Стаканов
 
19.10.20
09:41
(67) Когда комментарий начинается не с пробела, скорее всего его нужно убрать из кода :))
69 Web00001
 
19.10.20
09:57
(58) в (63) uоворилось, что там есть ответ ЗАЧЕМ, это надо сделать вроде как ) а не указание что это надо сделать.
70 Конструктор1С
 
19.10.20
10:12
(67) //лишние *символы //в $$начале %/слова №/затрудняют &чтение /*текста
71 Стаканов
 
19.10.20
10:18
(69) Чо ты такой серьёзный? Если не понял, это же шутка была в (63) :)) А если понял, тогда к чему вопрос?
72 Web00001
 
19.10.20
10:26
(70)разве? Не заметил.
73 Конструктор1С
 
19.10.20
10:27
(72) чё, в самом деле что ли?
74 Web00001
 
19.10.20
10:32
(71)Триггирюсь на фразу "если подумать" ищу подвох каждый раз))))
Раз уж все такие умные, вот пример отделаю блоки текста https://take.ms/bbcEV комментарии очевидные, но они позволяют сразу перейти в нужной области вывода документа, то есть служат якорями а не комментариями. Это ОК или фу фу фу?
75 Стаканов
 
19.10.20
10:50
(74) Ну так если пробел поставить перед текстом комментария, что страшного случиться? Я вот уже на автомате пробел ставлю, и в шаблонах текста во всех пробел забил.
76 Конструктор1С
 
19.10.20
13:18
(74) серьёзного ничего не произойдёт. Но на чтение комментария без пробелов уйдёт больше времени. Потратил времени маленько здесь, маленько тут, маленько там, и вот уже время разработки значительно выросло
77 vi0
 
20.10.20
05:42
(74) это уже не комментарии получаются, а читающие будут считать их за комментарии
78 Web00001
 
21.10.20
06:34
(77)Так и что делать? в хорошем коде не должно быть такого?
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.