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

StackOverflow https://stackoverflow.com/questions/745857

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Нам нужна метрика, которая не станет зеленой из-за простой декомпозиции метода.Я называю это СС100.

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

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

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

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

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

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

"не все, что имеет значение, может быть измерено, и не все, что может быть измерено, имеет значение" Einstein

Поэтому не забывайте также пропускать любую информацию такого типа через человеческую фильтрацию.

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

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

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

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

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

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

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

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

Боюсь, что для языка проекта, для которого мне больше всего нужны такие метрики, ЛПК, На самом деле не так уж много бесплатных инструментов для его создания.Так что нет, мне это не очень полезно.

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top