为什么在函数中避免嵌套块是一个好主意?(菲律宾比索)[已关闭]
我安装了 Netbeans 7.4 beta 版,并且有一个新的提示,上面写着“函数声明中的嵌套块太多 - 引入新功能是一种很好的做法......”。
为了提高可读性,我确实试图避免在函数中嵌套块,但是如果这很重要,还有什么其他原因可以解释为什么这将是一个更好的“想法”,特别是对于PHP。
我安装了 Netbeans 7.4 beta 版,并且有一个新的提示,上面写着“函数声明中的嵌套块太多 - 引入新功能是一种很好的做法......”。
为了提高可读性,我确实试图避免在函数中嵌套块,但是如果这很重要,还有什么其他原因可以解释为什么这将是一个更好的“想法”,特别是对于PHP。
它的正式名称是Cyclomatic Complexity。
这是基于函数中“决策点”数量的函数复杂程度的度量。数字越大,函数越复杂。
复杂性由方法中的决策点数加上方法条目的 1 个确定。决策点是“如果”、“同时”、“为”和“案例标签”。一般来说,1-4表示低复杂度,5-7表示中等复杂度,8-10表示高复杂度,11+表示非常高的复杂度。
(摘自 http://phpmd.org/rules/codesize.html)
复杂度值过高被认为是不好的原因是因为它使函数难以测试。
为了充分测试函数的潜力,您需要对每个可能的代码路径进行单独的测试。代码路径的数量随着每个新的决策点呈指数级增长,这意味着当你在单个函数中有多个决策时,你开始需要数百个测试,以确保你已经涵盖了它可能执行的整个功能范围。
对单个函数的数百个测试显然太多了,因此更好的选择是通过将每个函数拆分为几个较小的函数来减少每个函数的决策点数,每个函数的决策较少。
您还需要使函数离散,以便它们不依赖于彼此运行。这允许它们彼此隔离地进行测试。(否则你仍然有一个电话中太多决定的原始问题)
然后,您可以仅使用最初需要的少量测试来测试这些函数中的每一个。
相互隔离地测试函数的过程称为单元测试。这本身就是一个非常大的话题,但如果你想更多地了解良好的软件开发实践,那么值得研究。
既然你已经标记了这个问题PHP,我将为你指出一些mgiht帮助你的工具的方向:
还有许多其他工具可用,但这可能足以开始使用;首先了解这些。当你研究这个话题时,你会自然而然地遇到其他人。
通常,如果函数/方法只做一件事但做得很好,那么它们就写得很好。
当一个方法开始表现出超过1或2个级别的嵌套时,这是一个明确的迹象,它试图同时做多件事。
当一个函数中有很多嵌套和条件时,它也会使它的逻辑更加复杂和难以遵循,并且更难以进行健壮的测试。
最后,如果在另一种方法的巢中深埋了功能,则无法轻易重用它。您必须将其剪切并粘贴到要使用它的位置(这总是会导致维护噩梦),或者在托管方法中添加一些额外的开关和另一个条件开关(这只会加剧问题)。如果您将该功能重构为自己的方法,则重用它是微不足道的。