你写的函数这么长,你们老板知道吗?

本文转载自公众号  程序员练功房

文中的“我”不是小灰,而是原文作者

在项目当中,函数应该短到什么程度合适?

太长的函数是不好的,这一点大家都能认同。Martin Fowler在《重构》里这样说起函数的长短问题:

活得最长最好的程序,其中的函数都比较短……早在编程的洪荒年代,程序员们就已认识到:函数越长,就越难理解。……最终的效果是:你应该更积极地分解函数。……哪怕函数调用动作比函数自身还长,只要函数名称能够解释其用途,我们也该毫不犹豫地那么做【把代码提取到函数中】。

Martin Fowler,《重构》(第二版)

不过Fowler先生没有具体说,到底多长的函数算是“太长”。我觉得这是外国同行的一个习惯问题,他们不太喜欢给一个具体的数字,而是说“一个函数做一件事”。结果就是,到底什么算“一件事”,其实大家的理解还挺不一样的。

没有一个可以量化的数字,一旦到了要定一个具体数字的时候,大家就会有不同的想法。比如DZG同学说,他打算把函数的长度作为一个KPI来要求, 每个函数不超过15行,最好控制在10行以内

TV同学就觉得,“每个函数不超过10行”这个要求,是不是有点太过分了。他的感觉是,“ 这不是要求所有功能都抽离出独立的函数么 ”。JO同学也说,“ 15行有点矫枉过正了吧 ”。

这个讨论反映出了我经常说的一个问题:讨论不能空对空,最好要拿出可度量的数字来。 大家都在谈“简短的函数”,但大家谈的行数,可能有很大差距 。比如SonarLint缺省的门限值是80行,CheckStyle缺省的门限值是150行,文档里给了一个例子是60行。DZG同学表示,60行的函数才告警,已吓尿。

《软件开发沉思录》里有一章“对象健身操”,那里面是这样说的:

一个常见的原则是将方法的行数控制在5行之内

《软件开发沉思录》

我想说,其实这才是我真正推荐的标准……比如 我2008年9月有个项目,当时的统计是平均每个函数7行 。当然那是个Ruby项目,不过现在的Java和JavaScript也有相似水平的表达力了。

(遇事不明读文集,古人诚不我欺)

我的观点, 函数的长度,其实是反映一个表达能力的问题 。一个善于表达的人,哪怕就跟你讲5分钟事,也能讲个清晰的一二三,听着很明白。那么,怎么样一件事,需要讲10句话(甚至15句话)还讲不清楚?我觉得大多数时候这反映出讲这个事的人(即:写这个代码的人)脑子里没想清楚。

其实长函数是一个 特别简单的坏味道。简单体现在两方面:

  • 发现很简单 。在持续集成里设置一个检查,就可以随时发现过长的函数。

  • 消除很简单 。基本上一招Extract Function(提炼函数)就可以通吃。

当然简单不等于容易……比如说,有很多遗留代码,不管因为什么原因,已经长长的在那里了。比如我当年辅导中兴一个团队,Java的系统,达到全部函数60行以下,花了好几个月的时间。

然后……大家开心地摆起了鬼故事……

“我听说,手Q第一版,一个ManActivity,10000+代码”

“我以前遇到过一个好几十K的SQL,大家都在上面改啊改啊,改到某个时候突然就fail了,查好久查不出原因,后来发现是超过65535字符了”

“李剑当年在华为就靠一招Extract Method一礼拜干掉了三千多行代码”

“李光磊以前劝华为的同志用Eclipse,人家打死不肯用。他自己搞起来,给人家说,你看,多方便。华为的同志默默输入一个文件名,跳过去,Eclipse崩溃了。文件太大。”

网友无责任鬼故事

(hmm……为什么鬼故事讲到最后总是扯到华为……)

然后大家开始好奇,这个IPD,和敏捷差距这么大么?

我在《敏捷中国史》里早都说了嘛。 当年搞软件工程这帮人,是一点基本功都不管 。其结果就是,中国软件业在腾飞的十年中没有打牢基本功,到今天来补各种各样基本功的课。

又跑题了……所以,今天的问题: 每个函数不超过10行,你感觉怎么样

喜欢本文的朋友们,欢迎长按下图关注公众号 程序员小灰 ,收看更多精彩内容