forceLength.

2016年11月30日

在我的职业生涯中,我已经听到了许多关于函数应该是多长时间的论据。这是一个更重要的问题的代理 - 我们应该在自己的函数中附上代码吗?这些指南中的一些基于长度,例如函数应不大于屏幕上的[1]。有些是基于重用 - 应该以多次使用的任何代码都在其自己的函数中,但仅使用代码应该留在内联。然而,对我来说最有意义的论点是意图与实施之间的分离。如果你必须花费努力看一个代码的片段来弄清楚什么它在做,然后你应该将它提取到函数中并在“什么”之后命名函数。那样,当你再次阅读它时,函数的目的直飞你,大部分时间都不需要关心该功能如何实现其目的 - 这是该功能的主体。

一旦我接受了这一原则,我就会制定一种写作非常小的功能的习惯 - 通常只有几线[2]。任何一个以上的函数超过半行的代码开始闻到我,我对我的函数并不罕见,这是一行代码的函数[3]。大小并不重要的事实是通过肯特贝克从原始的SmallTalk系统向我展示了我的例子来回家。在那些日子里跑上黑白系统的小托行。如果您想要突出显示某些文本或图形,则会扭转视频。SmallTalk的图形类有一种称为“突出显示”的方法,其实现只是对方法'反向'的调用[4]。该方法的名称比其实现更长 - 但这并不重要,因为代码的意图与其实现之间存在大距离。

有些人担心短缺功能,因为他们担心函数调用的性能成本。当我年轻的时候,那是偶尔是一个因素,但现在这是非常罕见的。优化编译器通常使用更短的功能更好,可以更轻松地缓存。如从前,绩效优化的一般指导方针是什么都很重要。有时在稍后输入函数是你需要做的事情,但通常较小的函数建议其他方式来加速。我记得人们反对有一个是空的常用成语用于使用时列表的方法alist.length == 0.。但是在这里使用函数的意图名称也可能支持更好的性能,如果收集是空的,则弄清楚是否为空而不是确定其长度。

如果名称好,那么这样的小功能就是工作,所以你需要仔细注意命名。这需要练习,但一旦你擅长它,这种方法可以使代码非常自我记录。更大的尺度功能可以像一个故事一样读取,并且读者可以选择潜入的功能,因为她需要更多细节。

致谢

Brandon Byars,Karthik Krishnan,Kevin Yeung,Luciano Ramalho,Pat Kua,Rebecca Parsons,Serge Gebhardt,Srikanthvenugopalan和Steven Lowe在我们的内部邮件列表中讨论了这篇文章的草案。

Christian Pekeler提醒我,嵌套功能不适合我的调整观察。

笔记

1:或者在我的第一个编程工作中:两页线打印纸 - 大约130行Fortran IV

2:许多语言允许您使用功能来包含其他功能。这通常用作减少范围,例如使用函数作为对象实现类的模式。这种功能自然是更大的。

3:我的功能的长度

最近我对构建本网站的工具链中的功能长度感到好奇。它主要是Ruby,并运行到大约15 kloc。这是方法体长度的累积频率图

如您所看到的,那里有很多小方法 - 我的代码库中的一半方法是两行或更少。(这里的行是非评论,非空白,并排除def结尾线条。)

这是粗略表格形式的数据(我感觉太懒了,可以将其变成适当的HTML表)。

行.Freq线.Cumfreq线.CumRelfreq [1,2)875 875 0.4498715 0.4498715 0.5856041 0.5856041 0.6858612 0.6858612 0.6858612 0.6858612 0.7475578 [5,6)116 1570 0.8071979 [6,7)69 1639 0.8426735 [7,8)75 1714 0.8812339 [8,9)46 1760 0.9048843 [9,10)501810 0.9305913 [10,15)98 1908 0.9809769 [15,20)24 1932 0.9933162 [20,50)12 1944 0.9994859

4:这个例子是肯特的优秀Smalltalk最佳实践模式意图揭示信息