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

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

  •  21-09-2019
  •  | 
  •  

Вопрос

Я немного изучал устаревшую систему, которую я поддерживаю, с NDepend (отличный инструмент, проверьте это), на днях.Мои выводы чуть не заставили меня разбрызгать кофе по всему экрану.Топ - 3 функции в этой системе , ранжированные по убыванию цикломатической сложности , следующие:

  1. SomeAspNetGridControl.Создайте дочерние элементы управления (CC из 171!!!)
  2. SomeFormControl.Добавить форму (CC из 94)
  3. Некоторый контроль поиска.Разделите критерии (CC из 85)

Я имею в виду 171, вау!!!Разве это не должно быть ниже 20 или что-то еще?Так что это заставило меня задуматься.Какую самую сложную функцию вы поддерживаете или реорганизовали?И как бы вы отнеслись к рефакторингу такого метода?

Примечание: CC, который я измерил, находится над кодом, а не над IL.

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

Решение

Это детские штучки по сравнению с каким-нибудь винтажным COBOL 1970-х, над которым я работал несколько лет назад.Мы использовали оригинал Маккейб инструмент для графического отображения CC для некоторой части кода.Распечатка была чисто черной, потому что линии, показывающие функциональные контуры, были очень плотно набиты и напоминали спагетти.У меня нет точной цифры, но она должна была быть намного выше 171.

Что делать

За Код Завершен (первое издание):

Если оценка равна:

  • 0-5 - процедура, вероятно, в порядке
  • 6-10 - начните думать о способах упрощения рутины
  • 10+ - разбейте часть подпрограммы на вторую подпрограмму и вызовите ее из первой подпрограммы

Возможно, было бы хорошей идеей писать модульные тесты по мере разбиения исходной процедуры.

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

Это относится к коду на C / C ++, который в настоящее время поставляется в продукте:

самое высокое значение CC, которое я мог бы надежно идентифицировать (т.е.Я не подозреваю, что инструмент ошибочно добавляет значения сложности для несвязанных экземпляров main (...) ):

  • функция обработки изображений:184
  • загрузчик элементов базы данных с проверкой:159

Существует также подпрограмма тестирования с CC = 339, но это не является строго частью продукта доставки.Однако это заставляет меня задуматься, как на самом деле можно было бы проверить тестовый пример (ы), реализованный там...

и да, имена функций были скрыты, чтобы защитить виновных :)

Как это изменить:

Уже предпринимаются усилия по устранению этой проблемы.Проблемы в основном вызваны двумя первопричинами:

  1. спагетти-код (без инкапсуляции, много копирования-вставки)
  2. код, предоставленный группе продуктов некоторыми учеными, не имеющими реального образования в области разработки программного обеспечения / инжиниринга / плотницкого дела.

Основной метод заключается в выявлении связных кусочков спагетти (потяните за нитку :)) и разбейте функции looooong на более короткие.Часто существуют сопоставления или преобразования, которые могут быть извлечены в функцию или вспомогательный класс / объект.Переход на использование STL вместо контейнеров и итераторов ручной сборки также может сократить объем кода.Использование std::string вместо C-строк очень помогает.

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

  • 1-10 - просто, без особого риска
  • 11-20 - сложный, с низким риском
  • 21-50 - слишком сложный, средний риск, внимание
  • Более 50 - слишком сложный, невозможно протестировать, высокий риск
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top