更多与更少功能

时间:2009-10-14 03:40:26

标签: c++ function preferences

我有一点争论,想知道那里的人们在想什么:

在C ++(或一般情况下)中,您是否更喜欢将代码分解为许多较短的函数,main()仅包含函数列表,按逻辑顺序,或者您是否仅在必要时更喜欢函数(即,什么时候它们会被重复使用)?或者介于两者之间?

8 个答案:

答案 0 :(得分:13)

小功能,请

传统观念认为小功能更好,我认为这是真的。事实上,有一家公司有一个分析工具,根据他们做出的决策与他们所拥有的单元测试数量相比,对各个函数进行评级。

理论上,您可能会或可能不会降低整个应用程序的复杂性,但您可以完全控制任何给定函数的复杂程度。

一种名为 cyclomatic complexity 的测量被认为与不良代码正相关...具体而言,通过某种方法获得的路径越多,其CCN数越高,其越差。如果写得越来越难以理解,从而改变甚至是正确的开始,并且需要更多的单元测试。

好的,找到了工具。它被称为ahem, C hange R isk A nalysis和 P 重做索引。

最近,只对信息进行一次编码的原则已经成长为新的首字母缩略词,特别是DRY (Don't Repeat Yourself) and DIE (Duplication is Evil) ...... 我相信我们可以部分感谢RoR社区推广这一理念......

答案 1 :(得分:4)

拆分功能,但绝不拆分功能。

功能可以分为多个层,然后每个层可以分成不同的功能。例如,当我们处理sine series时,求和和减法的主循环应该在主函数中。这可以视为第1层。现在,用于查找功率的功能可以分类到第2层。这可以实现为子功能。类似地,寻找因子也属于第2层,它将是另一个子函数。始终考虑功能,永远不要计算行数。线数可以从3到300不等,无关紧要。这将为我们的代码增加更多的可读性和可维护性。这是我关于分裂的想法。

答案 2 :(得分:3)

我认为唯一的答案是介于两者之间。如果你每次都破坏功能,那就变得难以理解了。同样,如果你从未分手,它也变得不可读。

我喜欢将功能分组为语义差异。它是一些计算的逻辑单元。保持单位小,但大到足以实际做一些有用的事情。

答案 3 :(得分:3)

我最喜欢的一个功能的粒度经验法则是“每行不超过24行<80个字符” - 这不仅仅是因为80 x 24终端在我开始时“回来了”;我认为这是一个合理的功能准则,你可以“抓住一只眼睛”,至少在C语言或不比C丰富的语言。“一个功能只做一件事”,AKA“一个功能有一个功能”(播放在“功能”作为“角色”或“目的”的含义! - )是我在语言中使用的次要规则,其中“太多功能”可以轻松地打包成24行。但“词汇满眼”指南 - 24 x 80 - 仍然是我的主要指南。

答案 4 :(得分:1)

小功能是好的,小功能更好。

大约五到八行代码是我的功能大小上限。除此之外,它太复杂了。你应该能够:

  1. 假设被叫方执行其名称所指示的内容,
  2. 在几秒钟内阅读函数的定义,
  3. 快速说服自己,第一个假设意味着目前的功能是正确的。
  4. 另一件事是你应该在编写代码之前使用你的功能。当您看到打算如何使用该函数时,您将看到函数必须遵守的前后条件。

    乍一看不明显正确的事情应该在正在运行的评论中证明是正确的。如果这很困难,因子子功能就会消失。

答案 5 :(得分:0)

无论代码重用和可读性有何帮助都是最好的,我相信。

创建一行函数只是为了做到这一点对可读性没有帮助,因此应将它们分组到有意义的类中,然后将函数拆分,以便您可以快速理解该函数中正在发生的事情。

如果你必须全身心地去了解发生了什么,那么你的设计是有缺陷的。

答案 6 :(得分:0)

我更喜欢适合一屏代码的函数(或方法),因此我可以一目了然地看到我需要引用的任何内容,以了解该函数的工作原理。我的编辑器窗口通常有大约50行空间,通常也是80列,所以我可以将两个并排放在显示器上,并在两段代码之间进行交叉引用。

所以,我通常认为50行是最大的。我考虑允许更多的唯一一次是当你有一个很长的初始化函数或完全线性的东西(没有变量,条件或循环),因为那不是你需要所有那么多上下文而某些API需要一个整体的东西一堆初始化启动并运行,并将其拆分为较小的函数并没有多大帮助。

总的来说,好的,小的,易于理解的功能做了一件事并且命名很好,远远超过数百行长的庞大怪物和数十个变量来跟踪缩进10水平很深。

答案 7 :(得分:0)

另一个简单的原因:当一块代码被重复使用多次或两次时,应该创建一个函数。对于非常小的代码(例如一个或两个语句),宏通常可以缓解这个问题。