是否有一种好的编码技术可以指定函数应该有多少行?
答案 0 :(得分:7)
没有。对于几乎任何事情,代码行都是一个非常糟糕的指标。例外情况可能是拥有成千上万行的函数 - 你可以非常肯定这些函数编写得不好。
然而,良好的编码技术通常会导致每个函数的代码行数减少。像DRY(不要重复自己)和Unix哲学(“编写程序,做一件事,做得好。编写程序一起工作。编写程序来处理文本流,因为这是一个通用的接口。”来自维基百科)。在这种情况下,将“程序”替换为“函数”。
答案 1 :(得分:2)
我认为这不重要,是谁说一旦函数长度超过一定数量的行就会违反规则。
一般来说,代码清理功能易于使用和重用。
答案 2 :(得分:1)
一个函数应具有明确定义的目的。也就是说,尝试通过自己做事或将工作委托给许多其他函数来创建完成单一事情的函数。
大多数功能编译器都非常出色。因此,分解代码没有固有的代价:编译器通常可以很好地决定函数调用是否真的应该是一个,或者它是否可以立即内联代码。
尽管FP中的大多数函数都很小,很精确并且非常重要,但函数的大小不太相关。
答案 3 :(得分:1)
您可以在此Wikipedia article阅读有关Cyclomatic Complexity的McCabe指标。
该指标衡量例程中存在多少个测试和循环。根据经验,10以下是可控制的复杂程度,而超过11则更容易出错。
我见过可怕的代码,其复杂度指标高于50.(这很容易出错,很难理解或改变。)重写它并将其分解为子程序会将复杂性降低到8。
请注意,复杂性度量标准通常与代码行成比例。它将为您提供复杂性而非代码行的度量。
答案 4 :(得分:1)
当在Forth工作(或玩因子)时,我倾向于不断重构,直到每个函数都是单行!事实上,如果你浏览因子库,你会发现大多数单词是单行的,几乎没有什么是几行。在具有内部函数且几乎为零的调用成本的语言中(即,隐式没有堆栈帧的线程代码[仅返回指针堆栈],或者使用积极的内联),没有充分的理由在每个函数都很小之前不进行折射。
答案 5 :(得分:1)
根据我的经验,具有大量代码行(超过几页)的函数是维护和测试的噩梦。但话说回来,我认为没有一条严格的规则。
我在我以前的公司遇到过一些VB.NET代码,其中一个功能是13页,但我的记录是我刚刚收到的一些VB6代码,大约有40页!想象一下,如果 Else 属于 Else 属于哪个 Else 属于他们在屏幕上分页的 语句。
答案 6 :(得分:0)
反对具有“太长”的函数的主要论点是将函数细分为较小的函数,只执行整个作业的一小部分,提高了可读性(通过给这些小部分实际名称,并帮助读者包裹他的思想围绕较小的行为,特别是当行1532可以改变第45行上的变量值时。
在函数式编程语言中,这一点没有实际意义:
您可以将函数细分为较大函数体内定义的较小函数,从而不会缩短原函数的长度。
函数应该是纯粹的,所以X行没有改变Y行读取值的实际风险:Y行变量的值可以非常容易地追溯到定义列表中,即使在循环中也是如此,条件或递归函数。
所以,我怀疑答案是“没有人真正关心”。
答案 7 :(得分:0)
我认为长期的功能是一面红旗,值得更多审查。如果我在代码审查期间遇到超过一两页长的函数,我会寻找将其分解为更小函数的方法。
但也有例外。一个很长的函数,包括大多数简单的赋值语句,比如初始化,最好保持不变。
答案 8 :(得分:0)
我的(诚然粗略的)指南是一系列代码。我见过有关页面功能的代码。这是催吐的,是慈善的。功能应该有一个专注的目的。如果你想要做一些复杂的事情,请有一个“队长”函数给助手打电话。
良好的模块化使朋友和影响人。
答案 9 :(得分:0)
另一方面,将方法细分为较小的部分只有在这些较小的部分可以与调用它们的代码分开分析时才有用。将方法拆分为子方法只会在调用它们的上下文中有意义,这种方法容易损害而不是提高易读性。即使在拆分之前,该方法将超过250行,将其分成十个单独的单独处理将简单地将同步分析要求从250行增加到300+(取决于为方法添加了多少行)标题,调用它们的代码等等。)在决定是否应该细分方法时,考虑这些方法是否有意义,而不是考虑方法是否“太长”,更为重要。大约20行例程可能会因为被分成两个十行例程和一个调用它们的两行例程而受益,但是一些250行例程可能会因为完全保留原样而受益。
btw需要考虑的另一点是,在某些情况下,程序所需的行为可能不适合它所用语言中可用的控制结构。大多数应用程序都很大“不要 - 护理“他们的行为方面,通常可以分配适合语言可用控制结构的行为,但有时候如果没有尴尬的代码,行为要求可能无法满足。在某些这样的情况下,将尴尬局限于一个膨胀的单一方法,但是围绕行为要求构建,可能比在许多与整体行为没有明确关系的小方法中分散它更好。