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

熊节 梦见 2019-05-06

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

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


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


太长的函数是不好的,这一点大家都能认同。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行,你感觉怎么样





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


    已同步到看一看

    发送中

    本站仅按申请收录文章,版权归原作者所有
    如若侵权,请联系本站删除
    觉得不错,分享给更多人看到
    梦见 热门文章:

    漫画:编程其实是文科    阅读/点赞 : 1108/17

    我是一个线程    阅读/点赞 : 693/22

    漫画:三分钟了解敏捷开发    阅读/点赞 : 644/17

    漫画:什么是中间人攻击    阅读/点赞 : 613/16

    我是一个Java class    阅读/点赞 : 552/10

    网贷遇雷潮,投资者如何避雷?    阅读/点赞 : 0/0