Анализ цикломатической сложности кода

29.10.13

Разработка - Инструментарий разработчика

Инструмент для контроля сложности написанного кода для 1С8.
Пригодится разработчикам, которые заботяться о качестве своего продукта, простоте его тестирования и дальнейшей поддержке.

Скачать файлы

Наименование Файл Версия Размер
Анализ цикломатической сложности (cyclomatic complexity analys)
.epf 17,27Kb
212
.epf 17,27Kb 212 Скачать

Если у вас есть опыт разработки информационных систем, вы наверняка знаете, что со временем (а иногда и сразу) написанный код усложняется и увеличивается в размере. Это приводит к тому, что становится сложно предсказать, к каким последствиям может привести модификация кода, а количество тестов, которые нужно провести, растет экспоненциально с ростом количества циклов и условий.

Иногда встречаются рекомендации по написанию вроде "старайтесь, что бы тексты ваших методов не превышали размера экрана". Очевидно, что это несерьезное требование, тем более, что в профессиональном мире давно уже существуют метрики на сложность кода. Одна из таких метрик - цикломатическая сложность. Что это и как она рассчитывается - можно почитать в википедии (статья на английском написана лучше).

Данный инструмент предназначен для расчета цикломатической сложности любого участка кода - фрагмент модуля, отдельного метода, целого модуля или набора модулей. Все менеджеры знают, что управлять чем-то возможно только тогда, когда это можно измерить. На мой взгляд, использование такой метрики сложности кода, как цикломатическая сложность, отлично подходит для выявления проблемых мест конфигурации, нахождения точек, которые требуют реинжиниринга. А данный инструмент поможет вам в этом.

Как использовать данный инструмент:

  1. Открыть обработку в 1С:Предприятии 8.
  2. Вставить фрагмент кода, который вы хотите проанализировать в поле на закладке "Текст"
    или выбрать каталог, в котором лежат искодные коды модулей (в текстовом виде), указав маску выбора фалов
    или выбрать файл с текстом исходного кода.
  3. Нажать на кнопку "Выполнить".
  4. Полученные результаты можно отсортировать по любой из колонок дерева результатов. Для наглядности, отдельные методы в дереве результатов подкрашиваются в цвет, символизирующий его сложность.
  5. На закладке "Настройки" можно поменять цвета, настройки градиента раскрашивания.

Как применять это в реальной жизни?

В комментариях попросили рассказать, как это применять в реальной жизни. Делюсь своими рекомендациями, основанными на  внедрении этого инструмента в нашем коллективе:

  • Оптимум метрики: не стОит вводить. Мы ограничились введением верхнего допустимого значения. Исследования, о которых говорится в википедии в разделе "Применение", рекомендуют ограничивать сложность на уровне 10. В отдельных случая можно допустить поднятие лимита до 15. Сложность более 50 гарантирует вам головную боль при поддержке.
    Учитывая специфику разработки ИС (мало математически строгих алгоритмов - всегда нужны какие-то исключения и допущения), мы подняли допустимую верхнюю границу сложности до 14. В отдельных случаях, допускается превышение до 20 с обязательным комментарием в коде метода, чем вызвана необходимость повышенной сложности.
  • Разработчик, при передаче задачи в тест, самостоятельно замеряет сложность кода который он произвел/модифицировал. При необходимости, некоторые части выносятся в отдельные методы. В ряде случаем это также увеличивает или облегчает повторное использование кода.
  • Для разработчиков, которые систематически превышают максимально допустимую сложность кода, можно применять штрафные санкции.
  • Кстати, не стоит брать типовые конфигурации в качестве ориентира по сложности кода. Самое высокое значение цикломатической сложности, которое я видел, было около 350. Yell И да, это был типовой регламентированный отчет.

Примечания по использованию:

  • Поддерживается анализ кода написанного как на русском, так и на английском языке.
  • Обработка работает в обычном (не управляемом) приложении, но исходный код может анализировать как для обычного, так и для управляемого приложения. Если вам нужна версия обработки для работы под управляемым приложением - пишите в комментариях или в личку.
  • Вы можете использовать обработку по своему усмотрению в рамках действующего законодательства вашего государства. Единственная просьба: если у вас есть замечания или предложения по улучшению обработки, а также в случае нахождения багов - пишите мне об этом в комментариях или мне в личку.

См. также

SALE! 20%

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 10400 руб.

02.09.2020    122122    670    389    

714

SALE! 25%

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 15300 руб.

06.10.2023    7288    21    6    

39

SALE! 20%

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 8000 руб.

10.11.2023    3525    11    1    

34

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177738    1073    0    

849

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99345    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    18108    6    8    

39

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    28107    3    10    

15

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

2400 руб.

24.09.2019    23601    15    15    

32
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. charushkin 104 14.12.12 08:33 Сейчас в теме
(0) Автор, объясните хотя бы в двух словах, чем полезна ваша обработка на практике? Какие выводы можно сделать, вычислив ЦСП?
4. Spitfire 104 14.12.12 13:23 Сейчас в теме
(1) hulio, (2) comol, коллеги, по вашим просьбам добавил описание практического применения.
вычисление ЦС дает ответ на вопрос, нужно ли уже разбить код на несколько методов, или еще нет.
5. comol 5051 14.12.12 13:46 Сейчас в теме
(4) Spitfire, Вот теперь однозначно "+" и мой грейт респект.
2. comol 5051 14.12.12 09:35 Сейчас в теме
И какое значение должно быть для нормального кода... может статистику по типовым собирали или ещё что. С чем сравнивать?
3. WKBAPKA 214 14.12.12 11:59 Сейчас в теме
я тоже не совсем понял как это работает, но за труды +
6. DMSDeveloper 146 14.12.12 14:30 Сейчас в теме
Спасибо, нужная штука!
7. boggonzikov 339 14.12.12 15:57 Сейчас в теме
Спасибо, респект!
Эх, еще бы такое в снегопат.
8. pumbaE 14.12.12 16:47 Сейчас в теме
(7) boggonzikov,
Эх, еще бы такое в снегопат.


Типа так можно хоть сейчас, а вот что бы все модули конфигурации перебрало и вывело сводный отчет - тут программировать надо.
9. Spitfire 104 14.12.12 16:53 Сейчас в теме
(8) pumbaE, перебрать все модули конфигурации можно через Конфигуратор-Выгрузить файлы конфигурации.
Насчет сводного отчета - конкретизируйте, пожалуйста, как вы это видите. Возможно, я добавлю в саму обработку какие-то более удобные инструменты анализа результатов анализа =)
13. pumbaE 14.12.12 18:10 Сейчас в теме
ОФФ: Странно, но в рассылке по почте стоит автором tormozit.

(9) Spitfire, мое программировать - это в плане добавить в снегопате обход дерева метаданных и передачу текстов в вашу обработку, т.е. что бы не было необходимости нажимать выгрузить тексты модулей, потом запускать обработку и т.д., а нажал волшебную кнопку и сразу автоматом заработало.

Имхо, для ежедневного использования непригодна, нет признаков игнорировать какой-то модуль; допустим типовая конфигурация, я все равно ничего не буду делать если вдруг ваша обработка покажет n, нет m число (m больше выглядит чем n). Т.е. сказать, а что изменилось за неделю получить такую информацию трудно.

Тот же итоговый отчет необходимо строить только по граничным показателям, если у меня макс. стоит число 15, то зачем мне для одного из вариантов отчета видеть процедуры с 1 или 2?
14. tormozit 7136 14.12.12 18:21 Сейчас в теме
(13) Я тут не причем =)
Однако замечал во многих рассылках о комментариях с инфостарта, что я там как автор указан. Возможно кто первый подписался на комментарии, того рассылка и считает автором?
16. Spitfire 104 14.12.12 19:36 Сейчас в теме
(13) pumbaE, если честно, я не думал о потребности анализировать изменения за определенный период. мы у себя ее используем не так. Я подумаю о внедрении такой функциональности и о внедрении отборов в дерево результатов.
10. ildarovich 7850 14.12.12 17:33 Сейчас в теме
На мой взгляд, нужно прямо в тексте статьи сказать, что данная метрика является просто суммой количества слов "Тогда" (then), "?(" и "Цикл" (loop) в тексте модуля (не находящихся в комментариях или кавычках). Иначе термин "цикломатическая сложность" заставляет представлять что-то чрезвычайно хитроумное. Ничего плохого в простоте метрики нет. Однако такое более понятное определение поставит ее в ряд с другими простыми метриками типа количества строк, букв, слов, разделителей ";" в одной процедуре (функции) модуля.
user598655_ilia-bers; purgin; Tolpinski; starik-2005; zqzq; krv2k; artbear; +7 Ответить
11. Spitfire 104 14.12.12 17:56 Сейчас в теме
(10) ildarovich, можно хоть весь листинг привести в описании. Зачем?
И потом, обработка действительно считает цикломатическую сложость - количество циклов в графе управления программы. Если бы 1С была другой, например, многопоточной, такой простой реализации не получилось бы.

И мне бы не хотелось, что бы эта метрика оказалась в одном ряду с подсчетом количества слов или строк метода. Почему? Потому что эти метрики на практике бесполезны, и интересуют только любителей больших чисел.
12. kser87 2438 14.12.12 18:06 Сейчас в теме
15. ildarovich 7850 14.12.12 18:22 Сейчас в теме
(12) Если быть занудой, то
количество циклов в графе управления программы
обработка НЕ считает. Собственно, в приведенных Вами ссылках все это уже написано. В частности, и то, что основное назначение метрики - это оценка мощности множества тестов для процедуры или функции. При этом делается ПРЕДПОЛОЖЕНИЕ, что мощность теста определяется необходимостью прогона графа управления по всем возможным путям. На практике при программировании в 1С редко когда применяется (автоматическое) модульное тестирование или юнит-тестирование. Поэтому применение данной метрики - это определенная условность. И доказать, что эта метрика лучше, чем, например, число строк в модуле, невозможно из-за трудностей определения критерия сравнения.
эти метрики на практике бесполезны, и интересуют только любителей больших чисел
- думаю, что это высказывание просто голословно.
17. Spitfire 104 14.12.12 19:58 Сейчас в теме
(15) ildarovich, указанные вами предположения сделаны не мной, а множеством умных людей, занимающимися computer science. Аналогичные предположения делаются, когда производится любое автоматизированное тестирование - регрессионное, юнит, модульное, любое - ведь протестировать все случаи, с которыми придется столкнуться программе, невозомжно и ненужно. Потому каждый сам выбирает себе достаточное множество тестов. А эта метрика, как вы правильно сказали, помогает оценить мощность множества таких тестов. И, кстати, то, что среди разработчиков на 1С автоматическое тестирование применяется реже, чем в других технологиях, не делает нам чести. К счастью, ситуация улучшается, я могу это видеть.

Если быть занудой, то
количество циклов в графе управления программы
обработка НЕ считает.
Это равносильно утверждению, что половина произведения катетов прямоугольного треугольника не дает нам его площади. А дает лишь.. хм.. половину произведения катетов.

К сожалению, эта метрика придумана не мной, потому я не буду здесь ее защищать. Ее полезность изучена и доказана.
эти метрики на практике бесполезны, и интересуют только любителей больших чисел
- думаю, что это высказывание просто голословно.
в таком случае, приведите, пожалуйста, практическую ценность для разработчика числа строк или символов модуля. И объясните, что буду означать изменения этих метрик при добавлении/удалении больших комментариев или запросов.
21. ildarovich 7850 15.12.12 20:31 Сейчас в теме
(17) Привожу практическую ценность для разработчика числа строк или символов модуля на таком примере: Пусть требуется создать таблицу значений для данных табеля. Это можно сделать так:
ТЗ = Новый ТаблицаЗначений;
	ТЗ.Колонки.Добавить("ПервыйЧасов1");
	ТЗ.Колонки.Добавить("ПервыйЧасов2");
	ТЗ.Колонки.Добавить("ПервыйЧасов3");
	ТЗ.Колонки.Добавить("ПервыйЧасов4");
	ТЗ.Колонки.Добавить("ПервыйЧасов5");
	ТЗ.Колонки.Добавить("ПервыйЧасов6");
	ТЗ.Колонки.Добавить("ПервыйЧасов7");
	ТЗ.Колонки.Добавить("ПервыйЧасов8");
	ТЗ.Колонки.Добавить("ПервыйЧасов9");
	ТЗ.Колонки.Добавить("ПервыйЧасов10");
	ТЗ.Колонки.Добавить("ПервыйЧасов11");
	ТЗ.Колонки.Добавить("ПервыйЧасов12");
	ТЗ.Колонки.Добавить("ПервыйЧасов13");
	ТЗ.Колонки.Добавить("ПервыйЧасов14");
	ТЗ.Колонки.Добавить("ПервыйЧасов15");
	ТЗ.Колонки.Добавить("ПервыйЧасов16");
	ТЗ.Колонки.Добавить("ПервыйЧасов17");
	ТЗ.Колонки.Добавить("ПервыйЧасов18");
	ТЗ.Колонки.Добавить("ПервыйЧасов19");
	ТЗ.Колонки.Добавить("ПервыйЧасов20");
	ТЗ.Колонки.Добавить("ПервыйЧасов21");
	ТЗ.Колонки.Добавить("ПервыйЧасов22");
	ТЗ.Колонки.Добавить("ПервыйЧасов23");
	ТЗ.Колонки.Добавить("ПервыйЧасов24");
	ТЗ.Колонки.Добавить("ПервыйЧасов25");
	ТЗ.Колонки.Добавить("ПервыйЧасов26");
	ТЗ.Колонки.Добавить("ПервыйЧасов27");
	ТЗ.Колонки.Добавить("ПервыйЧасов28");
	ТЗ.Колонки.Добавить("ПервыйЧасов29");
	ТЗ.Колонки.Добавить("ПервыйЧасов30");
	ТЗ.Колонки.Добавить("ПервыйЧасов31");
Показать
Так:
ТЗ = НоваяТаблицаЗначений(Сред(СтрЗаменить(",1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31", ",", ",ПервыйЧасов"),2));
Или так:
ТЗ = Новый ТаблицаЗначений;
	Для ё = 1 По 31 Цикл 
		ТЗ.Колонки.Добавить("ПервыйЧасов" + ё)
	КонецЦикла;
Единственная метрика считает предпочтительным варианты 1 или 2, даже не различая их, а какой вариант на самом деле будет лучше? Это как раз и подскажут другие метрики типа числа строк или числа символов. Про комментарии не говорю, очевидно, что строки с комментариями учитываются отдельно (как и в обсуждаемой метрике).
Собственно, мою мысль точнее выскажет заключительная фраза из ОЧЕНЬ ИНТЕРЕСНОЙ СТАТЬИ про метрики кода http://www.viva64.com/ru/a/0045/
Подводя итог, хотелось бы отметить, что ни одной универсальной метрики не существует. Любые контролируемые метрические характеристики программы должны контролироваться либо в зависимости друг от друга, либо в зависимости от конкретной задачи, кроме того, можно применять гибридные меры, однако они так же зависят от более простых метрик и также не могут быть универсальными. Строго говоря, любая метрика - это лишь показатель, который сильно зависит от языка и стиля программирования, поэтому ни одну меру нельзя возводить в абсолют и принимать какие-либо решения, основываясь только на ней.
Serg O.; starik-2005; +2 Ответить
22. ildarovich 7850 15.12.12 20:54 Сейчас в теме
(21) Могу также добавить, что существует по крайней мере четыре приема, позволяющие намеренно занижать цикломатическую сложность, считаемую Вашей обработкой:
1) "Раскрытие циклов" - повторение одинаковых строк в программе, если число повторений заранее известно;
2) Использование оператора "Выполнить" - кавычки будут экранировать Тогда и Цикл от подсчета;
3) Использование списка (или таблицы) значений и поиска в нем вместо Если ... ИначеЕсли ... ИначеЕсли ... КонецЕсли;
4) Использование рекурсии вместо циклов. При этом вместо условия выхода использовать неполноту вычисления логических выражений (не вполне уверен, но стоит попробовать).

(11) Если привести в статье более понятное определение, то разработчики, желающие разрабатывать код со значением сложности менее 10, будут просто складывать число циклов и условных операторов (считать до 10 не сложно) вместо более "цикломатически-сложной" (шутка) процедуры запуска обработки.

Тем не менее статью считаю полезной, поставил плюс, метрику возьму на вооружение. Ну и ради спортивного интереса код в обработке нужно попытаться привести к меньшим значениям цикломатической сложности!

P.S.: Думаю, что еще одна область применения алгоритма оценки - это написание на его основе нового "правила проверки" для конфигурации "1С:Автоматизированная проверка конфигураций". Плюс в том, что там уже есть готовые функции "ПолучитьТекстМодуля(ИмяМодуля)", "ПолучитьСтруктуруМодуля(ИмяМодуля)"
user811769; zqzq; CratosX; +3 Ответить
18. Qsko 60 15.12.12 12:54 Сейчас в теме
Очень интересная разработка. Очень порадовала фраза:
Кстати, не стоит брать типовые конфигурации в качестве ориентира по сложности кода. Самое высокое значение цикломатической сложности, которое я видел, было около 350. И да, это был типовой регламентированный отчет.


О чём говорят эти замеры? На сколько я понял, главное, о чём говорит нам числовой показатель - "количество" учитываемых условий/условностей в каком-либо методе. Причём, если следовать рекомендациям, то эти учитываемые условия следует минимизировать, вынося их просчёт в отдельные процедуры и функции.

Забавно, что в типовых конфигурациях самыми "сложными" оказались те, что отвечают за:
1) вывод печатных (ПечатьСчетаФактуры1137 - 39) и регламентированной отчётности (ПроверитьВозможностьВыгрузки - 131),
2) процедуры проведения документов по регистрам.
Хотя мне кажется, что если на одном уровне встречается "Если... Тогда... КонецЕсли", а за ним следует снова "Если... Тогда... КонецЕсли", то это не усложнят код (условия не вложены, на одном уровне), а на числовой показатель влияют: +1 за каждое Если... Тогда... КонецЕсли. Ибо эти проверялки условий - необходимость, которую выносить в отдельные функции вряд ли стоит. Посмотрите функции "ПроверитьВозможностьВыгрузки" в регламентированных отчётах.

По сему такая мысль: а может не надо при следующими друг за другом "Если... Тогда... КонецЕсли" на одном уровне увеличивать счётчик на +1? А вот за вложенность можно увеличивать. Чем больше вложенностей условий, тем запутаннее код. Тоже самое касается и циклов. Но у них другая беда - много циклов гораздо хуже, чем тоже количество "Если...".

Однако, метод есть метод. Он лишь ориентирует на ВОЗМОЖНО проблемные места, а не является показателем проблемности. То есть условие необходимое, но не достаточное.
19. pumbaE 15.12.12 13:00 Сейчас в теме
(18) Qsko, ну еще в зарплатах модулях очень любят использовать, для возможности группировки.
Если Истина Тогда 
(возможно потому, что у разрабов типовых снегопата нет :) )
20. LaNaite 135 15.12.12 17:34 Сейчас в теме
23. ManyakRus 483 17.12.12 12:06 Сейчас в теме
отчет работает :)
показывает что надо, правильно.

Только оно не поможет заставить программистов исправить свой код,
скажут что у меня сложные вычисления поэтому и сложный код..

(у меня доходит до 37 ЦС, у коллеги до 75 ЦС)
24. Spitfire 104 17.12.12 16:11 Сейчас в теме
(23) ManyakRus, как показывает практика, задачи класса "заставить людей что-то делать" или "заставить людей что-то делать так, как нужно" решаются другими способами. :) Это отдельная область знаний.
25. ildarovich 7850 02.09.13 23:39 Сейчас в теме
Понадобилось воспользоваться обработкой... Нашел ошибку: считаются лексемы "Тогда", но не считаются "тогда" и тому подобное. Понятно, при подсчете нужно приводить строки к одному регистру. Кстати, непонятно почему не используется встроенная функция СтрЧислоВхождений(<Строка>, <ПодстрокаПоиска>), а написана своя.
Spitfire; +1 Ответить
26. Spitfire 104 29.10.13 12:51 Сейчас в теме
(25) ildarovich, Спасибо за замечание, выложил исправленную версию.
Свой метод подсчета вхождений пришлось писать потому, что СтрЧислоВхождений не умеет искать в режиме "слово целиком", то есть, он посчитает вхождения инструкций в идентификаторы.
ildarovich; +1 Ответить
27. bashhhh 25 12.03.15 21:30 Сейчас в теме
Протестируем все свои наработки. Спасибо за отчет!
28. vipetrov2 10.03.17 12:03 Сейчас в теме
Надо эту характеристику рассматривать не как главный критерий написания кода, который нужно минимизировать, а как одно из ограничений. А то подобный догматизм может привести к таким бесполезным вещам, как "Индусский код".
И получается, что оператор ветвления в цикле нужно считать не за единицу, а умножать на количество циклов. Интересно посмотреть, что за граф построите в алгоритме сортировки.
И оператором ветвления является не только "Если", но и "Попытка".
29. ImHunter 312 11.07.17 15:05 Сейчас в теме
Похоже, разработчик уже не поддерживает обработку, т.к. был на сайте в 2015 году.

Кто будет пользовать - в обработке нужно фикс сделать:

Процедура УбратьДирективыКомпиляции(Текст, Директива) Экспорт 
	ПозицияНачалаДирективы = НайтиСледующееВхождениеПодстроки(Текст, Директива);
	Пока ПозицияНачалаДирективы <> 0 Цикл
		НачалоТекущейСтроки = НайтиПредыдущееВхождениеПодстроки(Текст, Символы.ПС, ПозицияНачалаДирективы);
		Если НачалоТекущейСтроки = 0 Тогда
			НачалоТекущейСтроки = 1;
		КонецЕсли;
		
		СтрокаПередХешем = Сред(Текст, НачалоТекущейСтроки, ПозицияНачалаДирективы - НачалоТекущейСтроки);
		
		// директивы не могут стоять после других команд или текста в строке - перед ними могут быть только незначащие символы
		Если СокрЛП(СтрокаПередХешем) = "" Тогда
			НачалоСледующейСтроки = НайтиСледующееВхождениеПодстроки(Текст, Символы.ПС, ПозицияНачалаДирективы + 1);
			Если НачалоСледующейСтроки = 0 Тогда
				НачалоСледующейСтроки = СтрДлина(Текст);
			КонецЕсли; 
			Текст = ?(НачалоТекущейСтроки > 1, Лев(Текст, НачалоТекущейСтроки), "") + Сред(Текст, НачалоСледующейСтроки);
		КонецЕсли; 
		
		//  фикс от
		НоваяПозиция = НайтиСледующееВхождениеПодстроки(Текст, Директива, ПозицияНачалаДирективы);
		Если НоваяПозиция=ПозицияНачалаДирективы Тогда 
			ПозицияНачалаДирективы = ПозицияНачалаДирективы + 1;
		КонецЕсли;
		// фикс до
		ПозицияНачалаДирективы = НайтиСледующееВхождениеПодстроки(Текст, Директива, ПозицияНачалаДирективы);
	КонецЦикла; 
КонецПроцедуры
Показать
30. ImHunter 312 12.07.17 07:19 Сейчас в теме
Не, вставленный сходу фикс искажает алгоритмы и формирует неверный результат. Надо все-таки еще подумать.
А смысл фикса задумывался в том, чтобы выйти из бесконечного цикла.
31. Serg O. 224 19.11.21 09:48 Сейчас в теме
обработка показывает цикломатическую сложность 52
не всё видимо считает...

если смотреть тот же модуль через VSC - получается 82
а когнитивная сложность 110

скриншоты ниже
Прикрепленные файлы:
Оставьте свое сообщение