Какова самая высокая цикломатическая сложность любой функции, которую вы поддерживаете?И как бы вы отнеслись к его рефакторингу?
-
21-09-2019 - |
Вопрос
Я немного изучал устаревшую систему, которую я поддерживаю, с NDepend (отличный инструмент, проверьте это), на днях.Мои выводы чуть не заставили меня разбрызгать кофе по всему экрану.Топ - 3 функции в этой системе , ранжированные по убыванию цикломатической сложности , следующие:
- SomeAspNetGridControl.Создайте дочерние элементы управления (CC из 171!!!)
- SomeFormControl.Добавить форму (CC из 94)
- Некоторый контроль поиска.Разделите критерии (CC из 85)
Я имею в виду 171, вау!!!Разве это не должно быть ниже 20 или что-то еще?Так что это заставило меня задуматься.Какую самую сложную функцию вы поддерживаете или реорганизовали?И как бы вы отнеслись к рефакторингу такого метода?
Примечание: CC, который я измерил, находится над кодом, а не над IL.
Решение
Это детские штучки по сравнению с каким-нибудь винтажным COBOL 1970-х, над которым я работал несколько лет назад.Мы использовали оригинал Маккейб инструмент для графического отображения CC для некоторой части кода.Распечатка была чисто черной, потому что линии, показывающие функциональные контуры, были очень плотно набиты и напоминали спагетти.У меня нет точной цифры, но она должна была быть намного выше 171.
Что делать
За Код Завершен (первое издание):
Если оценка равна:
- 0-5 - процедура, вероятно, в порядке
- 6-10 - начните думать о способах упрощения рутины
- 10+ - разбейте часть подпрограммы на вторую подпрограмму и вызовите ее из первой подпрограммы
Возможно, было бы хорошей идеей писать модульные тесты по мере разбиения исходной процедуры.
Другие советы
Это относится к коду на C / C ++, который в настоящее время поставляется в продукте:
самое высокое значение CC, которое я мог бы надежно идентифицировать (т.е.Я не подозреваю, что инструмент ошибочно добавляет значения сложности для несвязанных экземпляров main (...) ):
- функция обработки изображений:184
- загрузчик элементов базы данных с проверкой:159
Существует также подпрограмма тестирования с CC = 339, но это не является строго частью продукта доставки.Однако это заставляет меня задуматься, как на самом деле можно было бы проверить тестовый пример (ы), реализованный там...
и да, имена функций были скрыты, чтобы защитить виновных :)
Как это изменить:
Уже предпринимаются усилия по устранению этой проблемы.Проблемы в основном вызваны двумя первопричинами:
- спагетти-код (без инкапсуляции, много копирования-вставки)
- код, предоставленный группе продуктов некоторыми учеными, не имеющими реального образования в области разработки программного обеспечения / инжиниринга / плотницкого дела.
Основной метод заключается в выявлении связных кусочков спагетти (потяните за нитку :)) и разбейте функции looooong на более короткие.Часто существуют сопоставления или преобразования, которые могут быть извлечены в функцию или вспомогательный класс / объект.Переход на использование STL вместо контейнеров и итераторов ручной сборки также может сократить объем кода.Использование std::string вместо C-строк очень помогает.
Я нашел другое мнение по этому поводу у эта запись в блоге который, кажется, имеет смысл и работает для меня при сравнении его с различными кодовыми базами.Я знаю, что это очень самоуверенная тема, так что YMMV.
- 1-10 - просто, без особого риска
- 11-20 - сложный, с низким риском
- 21-50 - слишком сложный, средний риск, внимание
- Более 50 - слишком сложный, невозможно протестировать, высокий риск