Coding style 一个函数最多应该有多少行?

Coding style 一个函数最多应该有多少行?,coding-style,Coding Style,有没有一种好的编码技术可以指定一个函数应该有多少行?我认为这无关紧要,谁说一旦函数长度超过一定数量的行,它就违反了规则 一般来说,只需编写易于使用和重用的干净函数。我认为这并不重要,谁说函数长度一旦超过一定数量的行,就会违反规则呢 一般来说,只需编写易于使用和重用的干净函数。没有。代码行对于任何东西都是一个非常糟糕的指标。例外可能是有成千上万行的函数——你可以很肯定这些函数写得不好 然而,有一些好的编码技术通常会减少每个函数的代码行数。比如DRY(不要重复你自己)和Unix哲学(“编写能做一件事

有没有一种好的编码技术可以指定一个函数应该有多少行?

我认为这无关紧要,谁说一旦函数长度超过一定数量的行,它就违反了规则


一般来说,只需编写易于使用和重用的干净函数。

我认为这并不重要,谁说函数长度一旦超过一定数量的行,就会违反规则呢


一般来说,只需编写易于使用和重用的干净函数。

没有。代码行对于任何东西都是一个非常糟糕的指标。例外可能是有成千上万行的函数——你可以很肯定这些函数写得不好


然而,有一些好的编码技术通常会减少每个函数的代码行数。比如DRY(不要重复你自己)和Unix哲学(“编写能做一件事并且做得很好的程序。编写能协同工作的程序。编写能处理文本流的程序,因为这是一个通用接口。”摘自Wikipedia)。在这种情况下,将“程序”替换为“函数”。

没有。对于任何东西来说,代码行都是一个非常糟糕的指标。例外可能是有成千上万行的函数——你可以很肯定这些函数写得不好


然而,有一些好的编码技术通常会减少每个函数的代码行数。比如DRY(不要重复你自己)和Unix哲学(“编写能做一件事并且做得很好的程序。编写能协同工作的程序。编写能处理文本流的程序,因为这是一个通用接口。”摘自Wikipedia)。在这种情况下,将“程序”替换为“函数”。

反对函数“过长”的主要理由是将函数细分为较小的函数,这些函数只执行整个作业的一小部分,从而提高了可读性(通过给出这些小部分的实际名称,并帮助读者将注意力集中在较小的行为上,特别是当第1532行可以更改第45行变量的值时)

在函数式编程语言中,这一点是没有意义的:

  • 您可以将函数细分为在较大函数体中定义的较小函数,从而不减少原始函数的长度

  • 函数应该是纯函数,因此不存在X行更改在Y行读取的值的实际风险:Y行变量的值可以很容易地追溯到定义列表,即使在循环、条件或递归函数中也是如此


因此,我怀疑答案是“没有人真正关心”。反对函数“太长”的主要理由是将函数细分为较小的函数,这些函数只完成整个任务的一小部分,从而提高可读性(通过给出这些小部分的实际名称,并帮助读者将注意力集中在较小的行为上,特别是当第1532行可以更改第45行变量的值时)

在函数式编程语言中,这一点是没有意义的:

  • 您可以将函数细分为在较大函数体中定义的较小函数,从而不减少原始函数的长度

  • 函数应该是纯函数,因此不存在X行更改在Y行读取的值的实际风险:Y行变量的值可以很容易地追溯到定义列表,即使在循环、条件或递归函数中也是如此

因此,我怀疑答案是“没有人真正关心”。一个函数应该有一个明确的目的。也就是说,尝试创建只做一件事的函数,要么自己做,要么把工作委托给其他一些函数

大多数函数编译器在内联方面都很优秀。因此,分解代码没有内在的代价:编译器通常在决定函数调用是否应该是一个函数调用或是否可以立即内联代码方面做得很好

函数的大小不太相关,尽管FP中的大多数函数往往较小、精确且切中要害。

函数应该有明确的目的。也就是说,尝试创建只做一件事的函数,要么自己做,要么将工作委托给其他多个函数

大多数函数编译器在内联方面都很优秀。因此,分解代码没有内在的代价:编译器通常在决定函数调用是否应该是一个函数调用或是否可以立即内联代码方面做得很好


函数的大小不太相关,尽管FP中的大多数函数往往较小、精确且切中要害。

有一个圈复杂度的McCabe度量,您可以在这里阅读

该指标衡量一个例程中存在多少测试和循环。经验法则可能是,10以下的复杂度是可以管理的,而11以上的复杂度则更容易出错

我见过复杂度超过50的可怕代码(容易出错,难以理解或更改)。重新编写代码并将其分解为子例程将复杂度降低到8


请注意,复杂性度量通常与代码行成比例。它将为您提供复杂性度量,而不是代码行。

有一个圈复杂度的McCabe度量,您可以在这里阅读

该指标衡量一个例程中存在多少测试和循环。经验法则可能是,10以下的复杂度是可以管理的,而11以上的复杂度则更容易出错

我见过复杂度超过50的可怕代码(容易出错,难以理解或更改)。重新编写代码并将其分解为子例程将复杂度降低到8