2009-04-14 6 views
53

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

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

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

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

ответ

37

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

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

+6

87? Это очень тщательная реализация Arrow Anti-Pattern ... Искренние соболезнования. –

+3

Так что, в основном, очень последовательная функция, содержащая 10 операторов if в строке, завершит тест? – Calmarius

+1

Я только что врывался в CC сегодня вечером, когда пытался применить действующий план атаки для очистки кода проекта. Худшими правонарушителями было 450 за один метод и 1289 для класса (и я ни о чем не писал). Хорошая игра. SIGH ............ – Terrance

7

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

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

+1

В более ранней жизни я помню, что видел более 300. –

+3

Сегодня вечером мы обедаем в аду! – Loofer

+0

Мой коллега столкнулся с случаями более 1000. – reinierpost

1

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

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

Cyclomatic complex отлично подходит для отображения областей, которые, вероятно, делают много, и поэтому ломают единый ответственный prinicpal. Они идеально должны быть разбиты на mulitple функции

1

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

+0

Chaos кричит: следите за LAG! Я выполняю метрики ... – erickson

+0

Хех. Кто-то знает историю. – chaos

7

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

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

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

2

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

11

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

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

+0

Я бы сказал, что все эти параметры и локальные переменные предназначены для логического потока. Таким образом, они предназначены для СС. Просто из головы размышлял. –

4

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

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

+2

Я видел некоторые из тех огромных методов, о которых вы говорите, и обычно это касается тушения пожаров. Когда огонь погас, нет никаких оснований для реорганизации (это работает damnit!), И теперь этот кусок кода намного больше, и у него есть еще один огонь в течение нескольких недель/месяцев. – wowest

6

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

+3

Это также полезно, если вы не знаете код. – reinierpost

+1

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

3

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

1

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

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

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

1

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

15

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

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

CC100 = 100 * (Всего цикломатического сложность кодового)/(Всего строки коды)

+4

Но тестируемость улучшилась: отдельные методы могут (в принципе) тестироваться отдельно, даже если логика не меняется. Конечно, этого не происходит, если методы также зависят от большого количества глобального состояния, но это проблема сама по себе. – reinierpost

+0

+1 для гиперссылки на интересное слайд-шоу. Недавно я немного поразмыслил над этой проблемой, и я рад найти на ней больше материала. – stakx

+3

* замена условностей полиморфизмом * может уменьшить циклическую сложность, но также снижает ее локальную понятность. – Wolf

1

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

1

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

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

включая анализ зависимостей и в том число язык (Code Query Language), посвященный спросить, что сложного в моем коде и написать правило?

 Смежные вопросы

  • Нет связанных вопросов^_^