每个函数是否有最佳的代码行数?[关闭]


18

函数不仅用于最大程度地减少代码重复,而且还用于将长函数拆分为较小的函数以提高可读性,并使代码具有自注释性。但是,这种增益与每个函数或方法的LOC数量并不成反比;否则,我们将拥有大量功能,所有功能仅包含一行或两行代码。

这使我想知道:每个功能是否存在最优数量的LOC?如果是这样,那是什么,它在语言之间是否有差异?


6
请参考Mitch McConnell的Code Complete Vol 2第7章第4节的内容。
彼得·特纳

2
@Peter-我想你是说“史蒂夫·麦康奈尔”
JohnFx

是的,有趣的是我会在看书的时候写下来。。。。不是Witch Mitch McConnell Pres。布什的参谋长?
彼得·特纳

3
这个数字几乎肯定因语言而异:看到6行的Prolog子句会让我感到惊讶,而使用20行的Delphi方法完全可以。我对Smalltalk的回答如下:Smalltalk使用环境鼓励采用简短方法。
Frank Shearar 2010年

1
@Peter Turner:嗯... S1至S15和I1至I11。听起来他正在将临时变量与寄存器混淆。^^
gablin

Answers:


33

我要使用的标准不是行数,而是每个函数只能做一件事并且做得很好。


是的,如果我们有一个工作单元,那么我不需要在50个功能之间移动就可以了解正在发生的事情。如果使用此度量适当地分解功能,则它们的大小自然应该是合理的。
ChaosPandion 2010年

2
@ChaosPandion:但是您的工作单元可能表示为一系列更基本的步骤。如果您正在查看功能,则将查看步骤顺序,而不是每个步骤的代码。
Wizard79 2010年

2
@Lorenzo-在这种情况下,每个步骤都将成为工作单元。父功能成为工作单元的高级概述。
ChaosPandion 2010年

1
是的,的确如此。嗯,让我再改一下这个问题:对于只做一件事并且做得很好的函数,是否存在最优数量的LOC?
gablin

@gablin,很难说,LOC也依赖于语言,但是如果您遵守此原则,通常您最终会处于合理范围内,例如1〜50。
grokus 2010年

21

一个古老的经验法则是,功能应该在屏幕上完全可见,而无需滚动。

基本思想是,如果您不能一次查看整个功能,则该功能过于复杂,您应将其拆分为更多基本部分。

虽然此规则非常实用且有用,但正式规则是您应仅在函数中保留一个逻辑步骤。函数仅执行基本工作,如果您可以将工作划分为更多基本部分,则必须将函数拆分。


21
随着平均监视器大小/分辨率的提高,该指标将变得越来越无用。
亚当李尔

2
我们的编程教授前一天晚上刚刚说了这个例子:)
cdnicoll 2010年

2
@Anna:好吧,我的显示器分辨率很高,但工具栏/调色板/面板的数量却增加了。然后,现在我可以使用14磅间距字体了!:)
Wizard79

4
终端的24 x 80尺寸不会改变。
替代

1
废话,规则的重点是“您是否可以不滚动查看全部内容”。使用大型监视器,您可以在不违反该规则的情况下拥有更多功能,这并不意味着大型监视器只能查看较小的功能(尽管您的IDE具有所有工具栏和属性窗口,但可能仍然适用:- ))
gbjbaanb 2012年

15

空无一人。

屏幕越来越大,字体越来越小。当人们的拇指大小不同时,经验法则不能很好地发挥作用。

简明扼要。如果您的函数执行多项操作,则最好将其分解为较小的部分。


您至少可以告诉我为什么您认为我的答案没有用。
乔什·K

7
我认为有人因使用h1标签而感到冒犯。
ChaosPandion 2010年

@混沌:这是基本答案。
乔什(Josh K)2010年

6
也许我有点太微妙了,但我的意图是暗示没有正当理由对您的回答投反对票。契约的执行者有一些个人的随机理由。他们可能只是认为Josh是一个可怕的名字。
ChaosPandion 2010年

6

Smalltalk具有减小方法大小的不寻常方法。编写代码时,将其编写在名为“浏览器”的小部件中。浏览器有两个主要部分,水平划分。您的代码位于下半部分。

默认情况下,浏览器不是很大。您可以先放入5或6行,然后再开始滚动。滚动当然有点令人讨厌。

因此,在Smalltalk中,环境“鼓励”您编写简短的方法,最长不超过6行。(通常足够; Smalltalk是一种非常简洁的语言。)


2

方法中理想的代码行数是可变的。基本上,您只想编写足够的代码来执行在函数定义的上下文中需要执行的操作。我认为这是一种“ 单一责任原则”,仅适用于方法而不是类。

如果方法具有很多逻辑,并且需要完成许多步骤,则可以将方法分解为几个离散的步骤。这些步骤中的每一个都将根据需要提取到新方法中。

“否则,我们将拥有大量的功能,所有这些功能仅包含一行或两行代码。”

每种方法做的越少,定义就越容易,并且更易于理解和管理。如果需要,拥有数百种方法没有错。而且,与我之前提到的SRP保持一致,当方法被拆分成更小和更易于管理的片段时,提取新类变得更加容易。


1

答案当然是42

重要注意事项:任何功能都不能违反SRP,否则您将不得不面对spanisch的询问

一些提示如何减少行数:

  • 是否有注释标记各个部分?这些部分应该是函数。
  • 工厂/制造商外部是否有if-else链或switch语句?您的设计可能需要一些更好的设计模式来帮助您分担责任。
  • 您的功能易于测试吗?使您的功能易于测试,它们会崩溃。
  • 它很复杂,只有一片土地吗(1000个线怪兽)?进行废品重构-这是重构,不要保存它,以期了解有关代码职责的知识。

1
Nᴏʙᴏᴅʏ希望西班牙语...啊,臭虫,我来晚了。
左转

0

以下是一些线索:

  • 如果您在编写说明功能目的和用法的注释时遇到麻烦,则该时间太长。

  • 如果您很想编写注释来解释函数中一段代码的活动,则该函数太长。

  • 如果要从另一个函数粘贴代码,那么它们都太长了(将该代码提取为一个单独的函数)。

  • 如果您需要一种编码约定来将类数据成员与局部变量分开,则该函数过长,并且该类具有太多的成员。

  • 如果您在阅读功能时需要记笔记,则时间太长。

具有“音调”的功能(每个音调只有一两行)不一定是一件坏事。我发现这些小功能的重用远远超出了我最初的预期。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.