一个函数/过程/方法应该有多少行代码? [复制]

Posted

技术标签:

【中文标题】一个函数/过程/方法应该有多少行代码? [复制]【英文标题】:How many lines of code should a function/procedure/method have? [duplicate] 【发布时间】:2010-10-11 07:27:38 【问题描述】:

可能重复:When is a function too long?

我最近接到了一项令人羡慕的任务,即审查另一位开发人员编写的糟糕代码并记录不良做法。 (当然,这完全是为了摆脱为开发人员的工作付出的代价,而不是任何利他的理由!)

审查过的代码有几个程序,都是很多行代码——最长的差不多有 600 行。我想到的几个问题是可维护性和可读性。

诀窍在于,我需要向外行解释为什么这是一种不好的做法,并在可能的情况下用一本备受推崇的最新参考书来支持它。类比也不错。

有什么想法吗?

复制: When is a function too long?复制: Best rule for maximum function size?

【问题讨论】:

也可以查看Cyclomatic Complexity ***.com/questions/610588/… 至少一个。更多,如有必要。 @Alex - 我知道这很糟糕,我对你有感觉,但我只是指出,确保质量的时间不是事后。此外,关于什么是好的代码并没有达成共识,因此在法庭上证明代码是坏的(假设代码有效)将非常困难。 并且不接受不符合合同规定的最低标准的代码。一旦您接受了代码,您就很不走运了,因为作为合同方,您有责任确保您在接受产品之前收到了您所支付的费用。 【参考方案1】:

这与代码行无关。正如Steve Mcconnell 和Bob Martin 所说(关于编码最佳实践的两个很好的参考资料),一个方法应该做一件事,而且只做一件事。然而,做这件事需要多少行代码是它应该有多少行。如果那个“一件事”可以分解成更小的事物,那么每个事物都应该有一个方法。

很好的线索你的方法做的不止一件事:

一个方法中有多个缩进级别(表示逻辑分支太多而只能做一件事) “段落分隔符”- 逻辑代码组之间的空格表示该方法正在做不止一件事

仅举几例。 Bob Martin 还说要保持在 10 左右。就我个人而言,我通常会尝试投 10 分。如果它开始接近 20 分,那就是要密切注意这种方法的精神标志。但归根结底,代码行数对于几乎任何事情都是一个糟糕的衡量标准。它只是一个有用的指标,可以潜在地指出真正的问题。

【讨论】:

但是如果我的方法有 200 行代码(它不是设计人员生成的。它是纯业务逻辑)怎么办?你还觉得,我不应该用代码行数来衡量吗? @SunilBuddala 答案是“一个方法应该做一件事,而且只做一件事。不管做一件事需要多少行代码,它应该有多少行。”【参考方案2】:

真正的答案

没有具体数字。

一个具体的答案

如果您必须向律师或其他人证明某个数字的合理性,请找出适合您商店的典型开发编辑器窗口的最大行数,然后使用它。

一般实践

你甚至不应该这样看待它,但任何一个函数都不应该发生非常复杂的事情。

每个工作单元都应该委派给它自己的可单元测试的描述性命名方法。 这样做,你的所有方法最终都会变得很小且可读,而无需计算行数......

我看到的最大问题是在 if 语句中间爆炸了 3-4+ 个布尔条件。用一个好名字将所有这些都封装在一个布尔值中,然后将任何组成它的部分都封装起来。

【讨论】:

【参考方案3】:

首先,请注意,长度限制完全不同于通常的度量标准,即“函数是否只做一件事,并且做得很好?”如果该问题的答案不是肯定的,那么无论长度如何,该函数都可能不是一个好的函数。

与最大长度相关,引用自 Code Complete,通常被认为是关于编码实践主题的最佳书籍之一:

有时,复杂的算法会导致更长的例程,在这种情况下,应该允许例程有机地增长到 100-200 行。 (一行是源代码的非注释、非空白行。)数十年的证据表明,这种长度的例程并不比较短的例程更容易出错。让嵌套深度、变量数量和其他与复杂性相关的考虑因素决定例程的长度,而不是对其本身施加长度限制。

如果您要编写超过 200 行的例程,请小心。没有一项研究报告降低了成本、降低了错误率,或者两者兼而有之,较大的例程可以区分大小超过 200 行的代码,并且当您传递 200 行代码时,您必然会遇到可理解性的上限。

【讨论】:

【参考方案4】:

尽可能少。

【讨论】:

【参考方案5】:

自从我读到这篇文章已经很多年了,但我认为在 Learning Perl 中,他们建议制作的程序不要超过您一次可以将整个内容显示在屏幕上的时间。我认为这是一个很好的衡量标准。我见过由于重复代码(例如数据库访问和分配属性值)而仍然可读的较长函数,但这些是例外而不是常态。

【讨论】:

【参考方案6】:

为了补充 Rex 的观点,它也应该尽可能短。 Bob Martin 说 10 或更少

Object Mentor - How big should a function be?

【讨论】:

以上是关于一个函数/过程/方法应该有多少行代码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

fastreport中列宽固定 根据字段内容多少自动调整行高

在nodejs中逐行读取文件没有简单的方法吗? [复制]

为啥从类构造函数调用的方法应该是最终的? [复制]

为啥复制构造函数应该在 C++ 中通过引用来接受它的参数?

在文件中查找重复行并计算每行重复了多少次?

软工alpha阶段个人总结