什么是良好的平均方法大小?

5

我建议每个方法只写1到5行代码。如果需要写更多,请通过电子邮件与开发团队沟通并解释原因。这有助于重复使用,强制命名规范,并将方法耦合。

有什么意见吗?

谢谢


2
有25个只有一行的方法和一个100行的方法,这样可以吗? - Yellowfog
15
在我看来,只要它需要,大小/行数并不像功能“只做一件事”那样重要。 - Nick Craver
1
根据你的规则和我的风格(花括号单独一行),我甚至不能在一个方法中拥有完整的if/then/else块。这对我来说似乎有点过分了。 - tvanfosson
如果你使用Allman风格,即使你只有五行代码,也无法放置一个try-catch块;如果你使用1TBS风格,也几乎不可能。 ;) - musiKk
每个方法体的平均长度在1到5行之间是一个很好的经验法则。例外总是存在的,但这并不使规则无效。那些无法想象如何在真实代码库中实现此规则的人,请阅读《Clean Code》一书,并浏览一些精心制作的开源项目,例如Fitness。在Ruby或Python等更具表现力的语言中,这一点更为重要。 - qertoip
显示剩余2条评论
6个回答

16

方法代码大小是衡量方法职责的错误度量标准。该方法应该只有一个主要的行为/创建任务,没有重复的代码。


5

对我来说,1到5行似乎太少了。如果你正在开发简单的业务应用程序,那么这似乎还可以接受;但是,如果有任何算法或处理过程,通常编写处理步骤按顺序而非分散在多个方法或类中会更易读(和可维护)- 即使它在封装,验证等方面是合理的。

在许多情况下,即使验证参数和迭代集合,5行也不足够。

我建议使用“一页左右”,20到30行是理想的。


例如:这对我来说似乎是有效的,但是你认为这不好,因为它有8行:

    // Calculates the depth of the layer in the object graph
    public int GetIndex()
    {
        int ct = 0;
        ViewLayer pos = this;
        while (pos.Parent != null)
        {
            ct++;
            pos = pos.Parent;
        }
        return ct;
    }

我知道通过发布代码我可能会招来批评,但我的观点仍然站得住脚,这是易读的代码。

2
这太长了,你应该使用类似这样的代码:public int GetIndex(ViewLayer pos = this) {\n return (pos.Parent == null) ? 0 : 1 + GetIndex(pos.Parent);\n}\n 只需要3行 :-) - paxdiablo
1
这不是干净的代码。对于如此琐碎的任务,干净的代码不需要注释。首先,名称可以是DepthInObjectGraph。其次,这可以是递归的,并且需要1或4行,具体取决于您喜欢if/else还是?:。 - qertoip
@qertiop - 干得好,你找到了改进代码的方法 - 这几乎总是可能的。你的评论与答案相关吗?也就是说,你认为没有方法应该超过1-4行? - Kieren Johnstone

2

让代码要求决定何为过长。

你真的希望你的开发人员花时间写电子邮件而不是开发代码库吗?


1
我认为,相较于代码行数,圈复杂度在5或以下是一个更合理的衡量标准。将代码分解成不到5行可能会导致其难以阅读和繁琐。我知道对此会有不同的看法,这也是为什么应该关闭这个主题的原因。

1

我认为这比那更加复杂。

首先,方法往往遵循幂律分布:在任何给定的项目中,总会有一些异常巨大的方法,它们比其他绝大多数方法要大得多,因此平均大小永远不会收敛。

其次,如果您需要发出十个API调用才能完成一个特定的任务,那么将这个调用序列分成两个方法以满足大小限制是没有意义的。当您将某些东西分成几部分时,您必须给出两个名称(甚至三个)而不是一个。您必须记录每个部分等。底线是:小是好的,但不要盲目地遵循它。最好的建议是尝试使每个方法连贯(专注)。


1

这肯定让代码更难以浏览和理解,A调用B,B调用C,然后是E,接着是D等等。我不确定它如何强制实施良好的命名,我已经很难为现有方法想出好的描述性名称了,更不用说每5行就需要一个新名称。

这也会使类变得更长,因为您必须拥有方法签名、打开和关闭大括号以及用于可读性的额外一行。

此外,我的大多数Linq语句都超过了5行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接