收藏本站腾讯微博新浪微博

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 网站开通淘帖功能 - 蓝色理想插件 论坛内容导读一页看论坛 - 给官方提建议

论坛活动及任务 地图和邮件任务 请多用悬赏提问 热夏来袭,选一款蓝色理想的个性T恤吧!

手机上论坛,使用APP获得更好体验 急需前端攻城狮,获得内部推荐机会 论坛开通淘帖功能,收藏终于可以分类了!

搜索
查看: 1873|回复: 1

[网络] 技术中的小函数之道

[复制链接]
发表于 2014-5-14 10:52:35 | 显示全部楼层 |阅读模式
曾经有人对函数方面提出代码最小处理单元的概念:一个基本操作(赋值,比较等),一个函数调用(包括调用后判断返回值进行判断)都看成一个最小处理单元。 那么,一个函数,最小处理单元合理的个数范围在7以内。 如果超过了7,你就要考虑把他们拆分成多个函数了。

设计良好的函数往往比较小,而过大函数的设计往往一塌糊涂,或者存在很大的优化空间,函数设计的本质是内聚,它的大小只是它的表现形式,讨论一下函数的大小问题很有必要。最小数目没有限制,即便是只有1个,也有存在的必要。
                                                           
4-18技术.gif
在下面的情况下我们将函数拆分为更小的函数:

1、一眼不能够看到函数所有的代码
如果函数过长,无法一眼看到一个函数所有的代码,我会毫不犹豫的拆分。 我不想让读者去翻屏,也不想让读者前顾后盼,顾此失彼。 漂亮的函数应该让读者一眼就知道他在做什么以及怎么做的。

2、局部变量过多
如果局部变量超过七个,我会考虑拆分函数。 变量过多意味着我要记录太多的状态,这会加重我大脑的负担,同时要考虑太多的东西。 这也同时意味着我可能没有对函数功能进行深入的思考。

3、太多的缩进
太多的缩进意味着太多的嵌套,要么是循环,要么是判断,都会导致复杂的逻辑。

4、不处于同一抽象层次
举例,有一个初始化函数,需要初始化配置数据,套接字,数据库连接,通道状态。

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 的逻辑。 这样可以节省程序员的脑力成本,从而达到一个目的:漂亮的函数应该让读者一眼就知道他在做什么以及怎么做的。

如果新晋的程序员对函数的大小不够敏感,那么,可以多尝试编写10行左右(甚至更小)的函数,慢慢你会发现小函数原来具有大威力。

本文为Anyforweb技术分享博客,需要了解网站建设及更多web应用相关信息,请访问anyforweb.com。
发表于 2014-5-21 17:30:23 | 显示全部楼层
好复杂,看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|Archiver|手机版|blueidea.com ( 湘ICP备12001430号 )  

GMT+8, 2020-10-21 15:38 , Processed in 0.098385 second(s), 10 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表