Tag: 的复杂性

具有最小圈复杂度的条件logging

在阅读完“ 你对圆形复杂性有什么限制? ”之后,我发现很多同事对我们项目的这个新的质量保证政策非常恼火:每个function不会超过十个循环复杂性。 含义:不超过10个“if”,“else”,“try”,“catch”等代码工作stream分支语句。 对。 正如我在“ 你testing私有方法吗? ',这样的政策有很多好的副作用。 但是:在我们(200人 – 7年)的项目开始时,我们愉快地进行了日志logging(不,我们不能轻易将它委托给日志的某种“ 面向方面编程 ”方法)。 myLogger.info("A String"); myLogger.fine("A more complicated String"); … 当我们系统的第一个版本上线时,我们遇到了很大的内存问题,而不是由于日志logging(这是closures的),但是由于总是计算的日志参数 (string),然后传递给'info()'或'fine()'函数,只能发现日志级别为“OFF”,并且没有发生日志logging! 所以QA回来了,并且敦促我们的程序员做条件logging。 总是。 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”等等,在一个紧密耦合的不容易共享的algorithm中,以及3个关键的日志动作……即使条件日志可能不是真的该function的复杂性的一部分… 你将如何处理这种情况? 在我的项目中,我已经看到了一些有趣的编码演变(由于这个“冲突”),但是我只想把你的想法放在第一位。 谢谢你所有的答案。 我必须坚持认为,问题不是“格式化”相关的,而是“论证评估”相关的(评估在做一个什么都不会做的方法之前可能是非常昂贵的) 所以当写上面的“一个string”时,我实际上是指一个函数(),用一个函数()返回一个string,并调用一个复杂的方法来收集和计算logging器显示的所有types的日志数据。或不(因此问题和使用条件日志的义务 ,因此人为地增加“圈复杂性”的实际问题…) 我现在得到你们中的一些人提出的“ 可变函数”的一点(谢谢约翰)。 注意:在java6中的一个快速testing表明,我的varargs函数在被调用之前确实评估了它的参数,所以它不能被应用于函数调用,而是被应用于“日志search器对象”(或者“函数包装器”),其中toString )只会在需要的时候被调用。 得到它了。 现在我已经发表了关于这个话题的经验。 我会把它留在下个星期二投票,然后我会select你的答案之一。 再次,谢谢你的所有build议:)