函数要多小才够好——谈小函数之道

本文探讨了函数设计中的核心问题,提出了代码最小处理单元的概念,并详细解释了如何根据单元数量、局部变量数量、缩进层级及抽象层次来判断是否应将函数进一步拆分。此外,文章还分享了一个优秀函数的例子,强调了小函数的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

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

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

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

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

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行左右(甚至更小)的函数,慢慢你会发现小函数原来具有大威力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值