【技术前沿】函数结构的优化革命
研发部 孙辉
我们经常会发现有些函数的结构不是很好,有的需要传入很多参数,可函数体的代码很少;有的函数体又长又乱,不便于理解和维护。索性,我们就这些情况的函数进行一场结构优化革命。
下面介绍函数结构优化时需要关注的几个方面:
1、又臭又长的函数
如果发现一个函数的代码很长, 很可能的一种情况是这个函数做了很多事情,如果注释又不多,其他人将很难理解函数到底做了什么。应该严格按照面向对象五大基本原则中的单一职责原则 (Single Responsibility Principle)进行编码,这样就能解决这个问题。比如下面的代码:
修改后:
是不是更加清晰?
2、内联函数
有些函数很短,只有一两行,而且代码的意图也非常明显,这时可以考虑将这个函数干掉,直接使用函数中的代码。过多的函数会让人感到不舒服,干掉完全不必要的函数后代码会更简洁。
3、去掉临时变量
如果有一个临时变量 (Temp)用来表示某个函数的返回值,一般来说,这样的做法挺好,但如果这个临时变量实在多余,将它变量内联之后毫不影响代码的阅读,甚至这个临时变量妨碍了其它重构工作,就应该将这个临时变量内联化。
把这个临时变量干掉的好处在于减少了函数的长度,有时可以让其它重构工作更顺利地进行。比如:
return (employee.Salary > 10000);
4、不要给参数赋值
传入参数分“传值”和“传址”两种,如果是“传址”,在函数中改变参数的值无可厚非,因为我们就是想改变原来的值。但如果是“传值”,在代码中为参数赋值,就会令人产生疑惑,所以在函数中应该用一个临时变量代替这个参数,然后对这个临时变量进行其它赋值操作。
5、替换算法
有时候花费大量的代码实现的一个算法,很可能有其他的更简单的方式来实现同样的功能。有这么一个笑话:
某跨国日化公司,肥皂生产线存在包装时可能漏包肥皂的问题,肯定不能把空的肥皂盒卖给顾客,于是该公司总裁命令组成了以博士牵头的专家组对这个问题进行攻关,该研发团队使用了世界上最高精尖的技术(如红外探测,激光照射等),在花费大量美金和半年的时间后终于完成肥皂盒检测系统,探测到空的肥皂盒以后,机械手会将空盒推出去。这一办法将肥皂盒空填率有效降低至5%以内,问题基本解决。
而某乡镇肥皂企业也遇到类似问题,老板命令初中毕业的流水线工头想办法解决之, 经过半天的思考,该工头拿了一台电扇到生产线的末端对着传送带猛吹,那些没有装填肥皂的肥皂盒由于重量轻就都被风吹下去了。
这个笑话可以很好的解释 Substitute Algorithm,对于函数中复杂的算法,尽量想办法将这个算法简单化,从而达到与之前同样甚至更好的效果。