16

我安装了 Netbeans 7.4 测试版,并且有一个新提示说“函数声明中有太多嵌套块 - 引入新函数是个好习惯......”。

我确实尝试避免在函数中嵌套块以获得更好的可读性,但是如果这很重要,是否还有其他原因可以说明这将是一个更好的“想法”,特别是对于 PHP。

4

4 回答 4

24

它的正式名称是Cyclomatic Complexity

这是根据函数中“决策点”的数量来衡量函数的复杂程度。数字越大,功能越复杂。

复杂性由方法中的决策点数量加上方法入口的数量决定。决策点是“if”、“while”、“for”和“case 标签”。一般来说,1-4是低复杂度,5-7表示中等复杂度,8-10是高复杂度,11+是非常高复杂度。

(取自http://phpmd.org/rules/codesize.html

将复杂性值设置得太高被认为是不好的原因是因为它使函数难以测试。

为了测试一个函数的全部潜力,您需要对每个可能的代码路径进行单独的测试。代码路径的数量随着每个新的决策点呈指数增长,这意味着当您在单个函数中获得多个决策时,您开始需要数百次测试以确保您已经涵盖了它可能执行的全部功能。

对单个函数进行数百次测试显然太多了,因此更好的选择是减少每个函数的决策点数量,方法是将其分成几个较小的函数,每个函数的决策更少。

您还需要使函数离散化,这样它们就不会相互依赖才能运行。这允许它们彼此隔离地进行测试。(否则你仍然会遇到一次调用中决策过多的原始问题)

然后,您可以只用最初需要的少量测试来测试这些功能中的每一个。

相互隔离地测试功能的过程称为单元测试。这本身就是一个非常大的话题,但是如果您想了解更多关于良好软件开发实践的信息,则非常值得研究。

既然您已经标记了这个问题 PHP,我将向您指出一些 mgiht 可以帮助您的工具的方向:

  • PHP Unit - 这是 PHP 的事实上的标准单元测试包。
  • PHPMD - “PHP 混乱检测器”;一种用于分析代码以查找诸如过度复杂性之类的东西的工具。
  • pDepend - 另一个类似的工具。

还有很多其他可用的工具,但这可能已经足够开始了;先了解这些。当您研究该主题时,您会自然而然地遇到其他人。

于 2013-08-15T16:22:42.890 回答
3

一般来说,如果函数/方法只做一件事但做得很好,那么它们就写得很好。

当一个方法开始表现出超过 1 或 2 层的嵌套时,这是一个确定的信号,它试图一次做不止一件事。

当函数中存在大量嵌套和条件时,也会使其逻辑更加复杂且难以遵循,并且更难以进行健壮测试。

最后,如果在另一种方法中将功能深埋在一个嵌套中,您将无法轻松地重用它。您必须将其剪切并粘贴到您想要使用它的位置(这总是会导致维护噩梦),或者添加一些额外的开关和另一个有条件的托管方法(这只会加剧问题)。如果您将该功能重构为自己的方法,重用它是微不足道的。

于 2013-08-15T16:17:46.543 回答
1

一个很好的好处是限制范围。通过将块简化为单独的方法,您可以让未来的读者清楚地知道这段代码只取决于给定的参数。

在伪代码中

$some_variable = "something";
$some_other_variable = "something else";
if(x < y) {
  ... lots of code ...
  some_method($some_variable);
  ... more code ...
}

通过将条件提取到单独的方法,很明显该分支中的逻辑不依赖于$some_other_variable.

如果您有具有大量分支和大量变量的大型方法,则维护该方法变得更加困难,并且您更有可能无意中破坏某些东西。

于 2013-08-15T16:11:59.843 回答
1

花式代码导致维护噩梦...至少在 KISS 模型中,保持简单,您的调试将变得轻而易举。

这个答案保持了 KISS 模型,这是一个简单的答案

于 2013-08-15T16:16:47.097 回答