在阅读了“ 你的循环复杂度上限是多少?”之后,我意识到我的许多同事对我们项目中的这个新的 质量保证策略非常恼火: 每个函数不再有10个 循环复杂度。
意义: 不超过10个“ if”、“ else”、“ try”、“ catch”等代码工作流分支语句。对。正如我在“ 您测试私有方法吗?”中解释的那样,这样的政策有许多好的副作用。
但是: 在我们的(200人-7年)项目的开始,我们很高兴地记录(不,我们不能轻易地委托给某种类型的“ 面向侧面的程序设计”日志方法)。
myLogger.info("A String");
myLogger.fine("A more complicated String");
...
当我们的系统的第一个版本启动时,我们经历了巨大的内存问题,不是因为日志记录(有一次关闭了) ,而是因为 日志参数(字符串) ,它总是被计算,然后传递给‘ info ()’或‘ fine ()’函数,只是发现日志记录的级别是‘ OFF’,并且没有发生日志记录!
所以 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个“如果”,“否则”等等,在一个紧密耦合的不容易共享的算法,和3个关键的日志操作... 他们打破了限制,即使条件日志可能不是该函数的 真的部分说的复杂性..。
你会怎么处理这种情况?
我已经在我的项目中看到了一些有趣的代码演进(由于那个“冲突”) ,但是我只是想先听听你的想法。
谢谢你的回答。
我必须坚持认为,这个问题与“格式化”无关,而是与“参数评估”有关(评估可能是非常昂贵的,就在调用一个什么都不做的方法之前)
所以当我在“ a String”上面写的时候,我实际上指的是 a function () ,a function ()返回一个字符串,调用一个复杂的方法来收集和计算所有类型的日志数据,然后由日志记录器显示... ... 或者不显示(因此问题就出现了,使用条件日志记录的 义务,因此实际问题就是人为地增加“循环复杂度”... ...)
我现在得到的“ 变数函数”点由你们中的一些人提出(谢谢约翰)。
注意: 在 java6中的一个快速测试显示,我的 Varargs 函数 varargs 函数在被调用之前确实计算了它的参数,所以它不能被应用于函数调用,但是可以应用于‘ Log 撷取器对象’(或‘ function wrapper’) ,在这个对象上,toString ()只有在需要的时候才会被调用。知道了。
我现在已经把我在这个话题上的经验贴出来了。
我会把它放在那里直到下周二投票,然后我会从你们的答案中选择一个。
再次感谢您的建议:)