函数要尽量设计得短小精悍

小函数之道
服务器君一共花费了536.776 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

“设计良好的函数往往比较小,而过大函数的设计往往一塌糊涂,或者存在很大的优化空间。”

也许你认为讨论函数的大小没有必要,原因是函数设计的本质是内聚,它的大小只是它的表现形式。而上面的原因有必要让我们讨论一下函数的大小问题。

我对函数的核心思路:我提出代码最小处理单元的概念:一个基本操作(赋值,比较等),一个函数调用(包括调用后判断返回值进行判断)都看成一个最小处理单元。那么,一个函数,最小处理单元合理的个数范围在7以内。如果超过了7,你就要考虑把他们拆分成多个函数了(为什么是7?人同时能够处理的信息不超过7个)。

最小数目没有限制,即便是只有1个,也有存在的必要。

在下面的情况下我会将函数拆分为更小的函数:

  1. 一眼不能够看到函数所有的代码。如果函数过长,无法一眼看到一个函数所有的代码,我会毫不犹豫的拆分。我不想让读者去翻屏,也不想让读者前顾后盼,顾此失彼。漂亮的函数应该让读者一眼就知道他在做什么以及怎么做的。
  2. 局部变量过多。如果局部变量超过七个,我会考虑拆分函数。变量过多意味着我要记录太多的状态,这会加重我大脑的负担,同时要考虑太多的东西。这也同时意味着我可能没有对函数功能进行深入的思考。
  3. 太多的缩进。太多的缩进意味着太多的嵌套,要么是循环,要么是判断,都会导致复杂的逻辑。
  4. 如果你在使用ctrl+c和ctrl+v。那你写的代码不够拽(DRY,Don't Repeat Yourself)。这个时候,你要把你复制的部分拆分为新的函数。
  5. 不处于同一抽象层次。举例,有一个初始化函数,需要初始化配置数据,套接字,数据库连接,通道状态。
void init()  
{  
	config_init();  
	socket_init();  
	db_init();  
	int i = 0;  
	for (i = 0;i < max_chn_num; i++)//初始化所有通道  
	{  
		g_user_chn[i].status = status_init;  
	 	……  
	}  
} 

上个函数中对所有通道的初始化一块代码就和其他的不处于一个抽象层次,我们应该将它封装起来:

void chn_init()  
{  
	int i = 0;  
	for (i = 0;i < max_chn_num; i++)//初始化所有通道  
	{  
		g_user_chn[i].status =status_init;  
 		……  
	}  
}  

函数最小可以有多小,它存在的意义

我见过的最优秀的函数:

int max(int a, intb)  
{  
	return a > b?a:b;  
}  

这个函数很小,只有一行,但是他存在的意义在于:在函数的调用点,我们一眼就知道是获取a和b中的最大值,而不是分析a > b?a:b的逻辑。这样可以节省程序员的脑力成本,从而达到一个目的:漂亮的函数应该让读者一眼就知道他在做什么以及怎么做的。

小函数的最大障碍:性能

对于程序员新手,小函数的最大障碍在于没有经验体会不到小函数的优势,没有经验拆分大函数为更小的函数。

对于有一定经验的程序员,小函数的最大障碍也许是对性能的忧虑。

对于性能,切记,不要过早优化。我们一般认为的程序的瓶颈,一般并不是程序的瓶颈:我们需要工具来确定真正的瓶颈所在,20%的代码耗费了80%的性能,优化之前首先要找到那20%的代码。函数调用会产生资源和性能的损耗,但是这是不是程序的性能瓶颈?消耗的性能占总体的性能百分比为多少?这一切在代码编写时并不清楚,所以,我的观点是宁可选择简短的函数来获得清晰简单的设计,以便在项目后期能够更快,更好的进行性能优化。

很多人都在质疑我上面列举的max函数的实例,如果说他在运行期间调用次数不大,则对性能的影响基本可以忽略,而获得的可读性,清晰性这极具价值;反过来,如果他的调用次数是否庞大,以致成为了性能的瓶颈,则完全可以在程序编写完成后,很快的用其他的方法优化。程序的瓶颈不会很多。

关于函数调用产生的性能消耗,我会抽时间测试一下,看到底占用多少。

最后的建议:在对新员工培训的过程中,发现程序员新手一般对函数的大小不够敏感。所以,我建议你可以多尝试编写10行左右(甚至更小)的函数,慢慢你会发现小函数原来具有大威力。

本文地址:http://www.nowamagic.net/librarys/veda/detail/90,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/90

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《代码整洁之道》 马丁(Robert C. Martin) (作者), 韩磊 (译者)

软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关。这一点,无论是敏捷开发流派还是传统开发流派,都不得不承认。《代码整洁之道》提出一种观念:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。作为编程领域的佼佼者,《代码整洁之道》作者给出了一系列行之有效的整洁代码操作实践。这些实践在《代码整洁之道》中体现为一条条规则(或称“启示”),并辅以来自现实项目的正、反两面的范例。只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量。

更多计算机宝库...