-
Notifications
You must be signed in to change notification settings - Fork 51
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Добавить расчет когнитивной и цикломатической сложностей #1117
Comments
Исходные ссылки на Когнитивную сложность и Википедия |
Исходные ссылки на циклометрическую сложность Википедия Википедия RU |
Проверка на цикломатическую сложность есть и у Microsoft |
Что-то у меня разошлись значения когнитивной сложности в примере2 (https://1c-syntax.github.io/bsl-language-server/diagnostics/CognitiveComplexity/): Поэтому решил исходить из спецификации (Приложение B) источника (https://www.sonarsource.com/docs/CognitiveComplexity.pdf) Буду придерживаться следующего алгоритма, поправьте, если допустил ошибки: Конструкции увеличивающие сложность:
Конструкции получающие дополнительный штраф за уровень вложенности:
Конструкции увеличивающие уровень вложенности:
|
А Edt умеет подсчитывать когнитивную и цикломатическую сложность? Не подскажите где эти настройки? И можно ли выдавать ошибку при превышении заданного порога? |
Нет, ещё не умеет, как раз пробую научить. На скрине VCS с плагином |
Взял в работу |
Приведенный алгоритм цикломатической сложности тоже не нравится https://1c-syntax.github.io/bsl-language-server/diagnostics/CyclomaticComplexity/ Мне кажется мы не должны увеличивать счетчик для блока Иначе, также мне кажется цикломатическая сложность не возрастает при переходах goto. Зато, скорей всего необходимо учесть директивы препроцессора |
Блок "Иначе" - это альтернативный (ещё один) вариант условий. Т.е. человек необходимо понять все условия срабатывания в "Если" или в "Иначе если" - потом понять весь скоуп всех возможных вариантов, вычесть из них те что могли отработать выше - и понять в каких же случаях реально будет срабатывание кода в "Иначе". Это однозначное усложнение. |
С метками goto всё ещё хуже: человек перестаёт понимать алгоритм линейно пока читает код, ему нужно перепрыгивать в другое место чтобы понимать и переносить (в своей голове) туда весь текущий контекст код, при чем он не может опираться на тот код который видит до метки, так как этого кода в данный момент (при переходе) не существует как бы. То есть уровень загрузки/напряга мозга сильно повышается на метках. |
У нас Если добавляет ещё одну линию, вне зависимости от наличия Иначе, просто в сокращённом случае блок Если пустой и опускается. Поэтому наличие Если третью линию не добавляет. А вот ветки ИначеЕсли каждая добавляет по новой линии Например: Одна линия исполнения: Процедура Тест()
Инструкция1();
КонецПроцедуры; Две линии исполнения (блок Если): Процедура Тест()
Инструкция1();
Если Условиие Тогда
Инструкция2();
КонецЕсли;
КонецПроцедуры; 1: инструкция1, инструкция2 По-прежнему две линии исполнения (блок Если Иначе): Процедура Тест()
Инструкция1();
Если Условиие Тогда
Инструкция2();
Иначе
Инстуркция3();
КонецЕсли;
КонецПроцедуры; 1: Инструкция1, Инструкция2 |
То что мозг напряжется согласен, но изменится ли у нас количество линий исполнения? |
Доработана проверка SelfReferenceCheck: добавлена опция, позволяющая пропускать проверку для модулей объектов, наборов записей, менеджеров значений.
* Доработана проверка SelfReferenceCheck: добавлена опция, позволяющая пропускать проверку для модулей объектов, наборов записей, менеджеров значений. * Исключение некоторых типов модулей из проверки Модули, в которых ключевое слово "ЭтотОбъект" не является ссылкой на модуль/объект-владельца, исключены из проверки. --------- Co-authored-by: Dmitriy Marmyshev <dmar@1c.ru>
Описание проблемы
Было ба не плохо если бы в проверках "по стандартам" (я понимаю что стандарта нет такого) были два пункта:
Предельное значение когнитивной сложности
Предельное значение цикломатической сложности
При превышении указанных значений добавлялась незначительная ошибка конфигурации.
Описание решения проблемы
Предлагаю сделать так как это реализовано в BSL Language Server:
Когнитивная сложность (CognitiveComplexity)
Цикломатическая сложность (CyclomaticComplexity)
Дополнительная информация
No response
The text was updated successfully, but these errors were encountered: