После прочтения "Какой у вас / хороший предел цикломатической сложности? ", я понимаю, что многие мои коллеги были очень раздражены этим новым Политика контроля качества нашего проекта: не более 10 цикломатической сложности на функцию.
Значение: не более 10 «if», «else», «try», «catch» и других операторов ветвления рабочего процесса кода. Правильно. Как я объяснил в разделе «Вы тестируете частный метод?», такая политика имеет много хороших побочных эффектов.
Но: В начале нашего (200 человек - 7 лет) проекта мы с удовольствием регистрировали (и нет, мы не можем легко делегировать это какому-то 'Аспектно-ориентированное программирование 'для журналов).
myLogger.info("A String");
myLogger.fine("A more complicated String");
...
И когда первые версии нашей Системы были запущены, у нас возникла огромная проблема с памятью не из-за ведения журнала (которое в какой-то момент было отключено), а из-за параметров журнала (строк), которые всегда вычисляются, а затем передаются функциям info () или fine (), только для того, чтобы обнаружить, что уровень ведения журнала был «ВЫКЛЮЧЕН» и что регистрация не велась!
Поэтому QA вернулся и призвал наших программистов вести условный журнал. Всегда.
if(myLogger.isLoggable(Level.INFO) { myLogger.info("A String");
if(myLogger.isLoggable(Level.FINE) { myLogger.fine("A more complicated String");
...
Но теперь, с этим 10 цикломатическим уровнем сложности «нельзя перемещать» на ограничение функции, они утверждают, что различные журналы, которые они помещают в свою функцию, воспринимаются как бремя, потому что каждое «if (isLoggable ())» является засчитывается как +1 цикломатическая сложность!
Таким образом, если функция имеет 8 'if', 'else' и т. Д. В одном тесно связанном алгоритме с трудностями для совместного использования и 3 критических действиях журнала ... они превышают предел, даже если условные журналы не могут быть < em> действительно часть указанной сложности этой функции ...
Как бы вы справились с этой ситуацией?
Я видел несколько интересных эволюций кодирования (из-за этого «конфликта») в моем проекте, но я просто хочу сначала узнать ваши мысли.
Спасибо за все ответы.
Я должен настаивать на том, что проблема связана не с «форматированием», а с «оценкой аргументов» (оценка, которая может быть очень дорогостоящей, непосредственно перед вызовом метода, который ничего не сделает) < br> Итак, когда a написал выше «Строка», я на самом деле имел в виду aFunction (), где aFunction () возвращает String и является вызовом сложного метода, собирающего и вычисляющего все виды данных журнала, которые должны отображаться регистратором. .. или нет (отсюда проблема и обязательство использовать условное ведение журнала, отсюда и актуальная проблема искусственного увеличения «цикломатической сложности» ...)
Теперь у меня есть пункт «вариативная функция», выдвинутый некоторыми из вас (спасибо, Джон). < br> Примечание: быстрый тест на java6 показывает, что мои varargs функция оценивает свои аргументы перед вызовом, поэтому ее нельзя применять для вызова функции, но для 'объекта извлечения журнала' (или 'оболочки функции'), для которого toString () будет вызываться только в случае необходимости. . Понятно.
Я опубликовал свой опыт по этой теме.
Я оставлю его там до следующего вторника для голосования, а затем выберу один из ваших ответов.
Еще раз спасибо за все предложения :)
if
внутри метода / макроса. Например, если это C / C ++, макросы, очевидно, помогут, хотя их использование может нарушить какую-либо другую политику обеспечения качества. Общие методы C # (то есть наборInfo<T>
,Info<T1,T2>
,Info<T1,T2,T3>
также позволят вам избежать этой проблемы, поскольку параметры будут передаваться в метод без упаковки / преобразования в строку, и они легко встраиваются, если они статичны (что относится к расширению методы тоже). - person Groo   schedule 12.08.2017