认知复杂性及其对代码的影响

W.r.t到其中一个java项目,我们最近开始使用SonarLint。代码分析的输出显示过多的关键代码异味警报。

Critical code smell: Refactor this method to reduce its Cognitive Complexity.

我听说过Cyclomatic Complexity,但没有听说过Cognitive Complexity。我向小组提出的问题:

  • 认知复杂性是行业标准吗?
  • 除了可读性和可维护性之外,认知复杂性对代码的影响。
  • 认知复杂性是否仅适用于方法或代码的任何其他部分?
  • 认知复杂性所依赖的任何特定标准?
  • 提高代码认知复杂性的最佳实践。

我已经浏览了此链接,但无法获得所有问题的答案。

提前致谢。


答案 1

人类可以很容易地记住7个实体+/- 2(维基百科)。当有人需要阅读代码时,他们可能会遇到此限制。有时有太多的局部变量需要跟踪,或者有太多的if/for语句。在所有情况下,它都使得理解代码应该做什么变得更加困难,因为很难保持算法的心理图景。

行业标准:否。

可读性和可维护性:调试/改进简单易读的代码更容易。

适用于方法或其他部分:某些人可能想要理解的所有内容。如果你试图解释你的设计,而我需要跟踪20多个类,我会迷失方向。如果我需要快速使用您的界面,但我需要记住10位状态,我将无法做到。

它所依赖的任何特定标准:理解代码需要记住的事项的数量。

最佳实践:制作更多更好的定义函数。将相关概念提取到组/包中。减少代码中嵌套级别的数量(如果您阅读嵌套代码,则需要记住使您到达那里的条件)。减少任何一点的正在使用的变量的数量(与提取函数配合使用非常有用)。


答案 2

如果你正在编写“旧式”java,代码复杂性是一个有用的指标,这意味着大量的if和循环。当你编写更多“新风格”的java时,使用流,过滤器,映射,reduce和其他lambda,认知复杂性不是很有用。

例如,我有一个大约350个有效线的类,有35种方法,总认知复杂度为14。我向你保证,代码比几个循环和if更难理解。实际上,这35种方法中有25种的认知复杂度为0...