Подтвердить что ты не робот

Вы находите цикломатическую сложность полезной мерой?

Я играл с измерением циклической сложности большой базы кода.

Цикломатическая сложность - это количество линейно независимых путей через исходный код программы, и для вашего выбора языка существует множество бесплатных инструментов.

Результаты интересны, но не удивительно. То есть части, которые, как я знаю, были самыми волосатыми, на самом деле были самыми сложными (с рейтингом > 50). Но то, что я нахожу полезным, заключается в том, что конкретный номер "плохости" присваивается каждому методу как то, на что я могу указать, когда решает, где начать рефакторинг.

Используете ли вы цикломатическую сложность? Какой самый сложный бит кода вы нашли?

4b9b3361

Ответ 1

Мы беспощадно реорганизуем и используем Cyclomatic сложность как один из показателей, который получает код в нашем списке "хит". 1-6 мы не отмечаем сложность (хотя это может быть поставлено под сомнение по другим причинам), 7-9 сомнительно, и любой метод более 10 считается плохим, если не доказано иначе.

Самое худшее, что мы видели, было 87 из чудовищной цепочки if-else-if в некотором унаследованном коде, который нам пришлось взять на себя.

Ответ 2

Фактически, циклическая сложность может быть использована для использования за пределами порогов уровня метода. Для начала один большой метод с высокой сложностью может быть разбит на несколько небольших методов с меньшей сложностью. Но действительно ли это улучшило кодовую базу? Конечно, вы можете получить лучшую читаемость всеми этими именами методов. Но общая условная логика не изменилась. И общая условная логика часто может быть уменьшена на замену условностей на полиморфизм.

Нам нужна метрика, которая не превращается в зеленый, путем простого разложения метода. Я называю это CC100.

CC100 = 100 * (Общая циклическая сложность кодовой базы)/(Всего строк кода)

Ответ 3

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

Я думаю, что в большинстве случаев более простые показатели, такие как LOC, как минимум бывают хорошими. Если функция не подходит на одном экране, почти не имеет значения, насколько она проста. Если функция принимает 20 параметров и составляет 40 локальных переменных, не имеет значения, равна ли ее циклическая сложность.

Ответ 4

Недавно мы начали использовать его. Мы используем NDepend для анализа статического кода, и он измеряет циклическую сложность. Я согласен, это достойный способ определить методы рефакторинга.

К сожалению, мы видели # выше 200 для некоторых методов, созданных нашими разработчиками в оффшорах.

Ответ 5

Пока есть инструмент, который может хорошо работать с шаблонами С++ и методами метапрограммирования, это не очень помогает в моей ситуации. В любом случае просто помните, что

"не все вещи, которые считаются, могут быть и не все, что может быть измеренным счетом" Эйнштейн

Поэтому не забудьте передать любую информацию этого типа с помощью фильтрации людей.

Ответ 6

Вы увидите сложность, когда увидите ее. Главное, что этот инструмент полезен, - это отмечать части кода, которые были вам интересны.

Ответ 7

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

Однако, я обнаружил, что когда я делаю анализ циклической сложности для кода других людей, это обычно приводит к чувствам разочарования, тоски и общего гнева, когда я нахожу код с циклической сложностью в 100-х годах. Что заставляет людей писать методы, в которых есть несколько тысяч строк кода?!

Ответ 8

Это отлично подходит для поиска кандидатов для рефакторинга, но важно сохранить свое мнение. Я бы поддерживал диапазоны kenj0418 для направляющих обрезки.

Ответ 9

Там есть метрика Java, называемая CRAP4J, которая эмпирически сочетает циклическую сложность и покрытие JUnit для покрытия одной метрикой. Он занимался исследованиями, чтобы попытаться улучшить свою эмпирическую формулу. Я не уверен, насколько это распространено.

Ответ 10

Я не использовал его некоторое время, но в предыдущем проекте он действительно помог выявить потенциальные проблемы в чём-то код elses (конечно, не был бы!)

Найдя область для проверки, я быстро нашел множество проблем (также много GOTOS, вы бы поверили!) с логикой и некоторым действительно странным кодом WTF.

Цикломатическая сложность полезна для того, чтобы показывать области, которые, вероятно, делают много, и, следовательно, ломают единственную ответственную привилегию. Эти идеалы должны быть разбиты на mulitple функции

Ответ 11

Я боюсь, что для языка проекта, для которого мне больше всего нравятся такие показатели, LPC, есть на самом деле, не существует множества бесплатных инструментов для его создания. Так что нет, не так полезно для меня.

Ответ 12

+1 для значений списка хитов kenj0418.

Худшее, что я видел, было 275. Было еще несколько человек за 200, что мы смогли реорганизовать до гораздо меньших ЦК; они все еще были высокими, но они заставили их отступить еще в очереди. Нам не очень повезло с 275 зверями - это была (вероятно, еще есть) сеть операторов if- и switch, которая была просто слишком сложной. Это реальная ценность - это шаг за шагом, когда они решают перестроить систему.

Исключением для высокого CC, с которым мне было удобно, были фабрики; IMO, они должны иметь высокий CC, но только в том случае, если они выполняют простое создание и возвращение объекта.

Ответ 13

После понимания, что это значит, я теперь начал использовать его на "пробной основе". До сих пор я нашел, что это полезно, потому что обычно высокий CC идет рука об руку с Arrow Anti-Pattern, что делает код сложнее читать и понимать. У меня пока нет фиксированного номера, но NDepend предупреждает обо всем выше 5, что выглядит хорошим началом для изучения методов.

Ответ 14

Да, мы используем его, и я нашел его полезным. У нас есть большая устаревшая кодовая база для приручения, и мы нашли сложную сложную сложность. (387 в одном методе!). CC указывает вас непосредственно на области, которые стоит рефакторировать. Мы используем CCCC на С++-коде.

Ответ 15

Cyclomatic Complexity - всего лишь один из композиторов того, что можно было бы назвать Fabricated Complexity. Некоторое время назад я написал статью, чтобы суммировать несколько аспектов сложности кода: Борьба с сложной сложностью

Инструмент необходим для эффективного управления сложностью кода. Инструмент NDepend для кода .NET позволит вам проанализировать многие аспекты сложности кода, включая такие кодовые метрики, как: Цикломатическая сложность, глубина гнездования, отсутствие сцепления методов, охват тестами...

включая анализ зависимостей и включая язык (Язык запроса кода), посвященный заданию, сложному в моем коде и правилу записи