`
artdialog
  • 浏览: 105089 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

 

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

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

我对函数的核心思路:我提出代码最小处理单元的概念:一个基本操作(赋值,比较等),一个函数调用(包括调用后判断返回值进行判断)都看成一个最小处理单元。 那么,一个函数,最小处理单元合理的个数范围在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行左右(甚至更小)的函数,慢慢你会发现小函数原来具有大威力。

18
23
分享到:
评论
4 楼 justjavac 2012-08-13  
tonly85 写道
在优秀的Function也抵不过操蛋的Requirement和Change。做产品和做外包是完全不同的。

不解?
3 楼 tonly85 2012-08-13  
在优秀的Function也抵不过操蛋的Requirement和Change。做产品和做外包是完全不同的。
2 楼 chengchuang闯闯 2012-08-13  
1 楼 hyj1254 2012-08-13  
根据需求来,有时看似已经很小了,需求一来,其实还可以拆分。

相关推荐

    指数函数及其应用——比较大小PPT学习教案.pptx

    指数函数及其应用——比较大小PPT学习教案 指数函数是数学中一个重要的概念,它广泛应用于科学、工程、经济、金融等多个领域。指数函数的应用非常广泛,例如在经济学中,指数函数可以用来计算经济指标、预测经济...

    java8函数式编程(csdn)————程序.pdf

    函数式编程将值传递给函数,该函数然后生成新值但从不修改自身外部的任何东西,不可变对象和无副作用范式解决了并发编程中最基本和最棘手的问题之一。 函数式编程的特点: * 不可变数据:在函数式编程中,所有数据...

    Python程序基础:函数综合案例.pptx

    关键字lambda用于定义一种特殊的函数——匿名函数,又称lambda函数。匿名函数并非没有名字,而是将函数名作为函数结果返回,其语法格式如下:;1.导入整个模块;2.导入特定的函数;3.导入模块中所有函数;在Python中...

    dlut可视化大作业3————复变函数积分可视化

    【标题】"dlut可视化大作业3————复变函数积分可视化"揭示了本次作业的核心内容,即通过可视化技术展示复变函数的积分过程。在计算机图形学和科学计算领域,可视化是一种强大的工具,它能够帮助我们理解复杂的...

    danfangf ——c语言程序设计精品课件之函数

    C语言程序是由多个函数组成的,其中包含了库函数(如标准输入输出函数)和用户自定义函数。`main()`函数是每个C程序的入口点,而其他自定义函数则可以根据需求进行创建,以实现特定任务。例如,一个学生成绩管理系统...

    python (匿名函数,偏函数(csdn)————程序.pdf

    匿名函数和偏函数是Python编程中的两种特殊函数形式,它们为程序员提供了更加灵活和简洁的代码编写方式。 匿名函数,也称为lambda函数,是Python中一种简洁定义小型单行函数的方式。它的主要特点是没有显式的函数...

    神经网络遗传算法函数极值寻优——非线性函数极值寻优36.7z

    在提供的压缩包文件"神经网络遗传算法函数极值寻优——非线性函数极值寻优36.7z"中,很可能包含了相关的源代码、实验数据以及详细说明文档,可以帮助读者更深入地理解并实践这一技术。通过学习和应用这些资源,我们...

    python pandas库 —— loc函数的应用(csdn)————程序.pdf

    `loc`函数的强大之处在于它允许我们基于标签而非序号进行操作,这使得在处理具有明确标识符的数据时更为方便。相反,`iloc`函数则是基于位置(序号)进行操作,当我们知道确切的行或列编号时,`iloc`会非常有用。 ...

    函数重载——复数运算

    关于函数重载——复数运算的详细代码,有关于函数重载——复数运算所使用主要代码,以及重要的思想 及函数结构

    python函数高级应用(csdn)————程序.pdf

    Python 函数高级应用概述 Python 函数是基本的编程单元,用于实现代码块的复用。函数的定义格式为 `def 函数...通过这些知识点,我们可以更好地理解 Python 函数的高级应用,并更好地使用函数来编写高效、可读的代码。

    C语言实验二——函数.

    C语言实验二——函数 本实验旨在帮助学生熟悉C语言的函数编程,了解函数的定义、调用和应用。实验内容包括程序设计、程序填空和程序改错三个部分。 在程序设计部分,学生需要编写一个函数来计算并输出n(包括n)...

    excel函数——Vlookup函数

    讲述excel函数——Vlookup函数

    python 函数练习题(csdn)————程序.pdf

    在Python编程语言中,函数是组织良好、可重用的代码块,它们执行特定任务。以下是一些关于Python函数的练习题及其解析: 1. 定义了一个名为`cal`的函数,它接受两个数字`num1`和`num2`以及一个运算符`opr`作为参数...

    对数函数及其性质第一课时——对数函数概念图像性质.ppt

    "对数函数及其性质第一课时——对数函数概念图像性质.ppt" 本资源主要讲述对数函数的概念、图像和性质。它首先引入对数函数的定义,讨论对数函数的图像和性质,然后通过实例和练习巩固学生对对数函数的理解。 一、...

    PHP函数参考大全(明日科技)——光盘内容下载

    PHP函数参考大全(明日科技)——光盘源码打包下载。 我自己在卓越网买的书,把光盘打包出来给大家分享!

    js函数库——打包上传

    3. **压缩和混淆**:使用工具如UglifyJS或Terser将代码压缩成更小的大小,删除不必要的空格和注释,同时混淆变量名,提高代码的安全性。这一步骤对提升网站性能至关重要,因为文件大小直接影响加载速度。 4. **构建...

    CEC基准函数——用于算法的测试

    1. CEC2014基准函数:这部分文档主要涵盖了CEC2014年发布的基准函数,可能包括单目标和多目标优化问题,以及各种不同的约束条件。这些函数设计时考虑了复杂性、多样性以及全局优化的挑战性,旨在全面评估算法的性能...

    Excel函数应用500例 实例下载——办公人士必备

    "Excel函数应用500例 实例下载——办公人士必备"这个资源为办公人员提供了丰富的实例,旨在帮助他们解决工作中遇到的各种数据处理问题。这里我们将深入探讨其中的一些重要知识点。 1. **基本函数:** - **SUM**: ...

Global site tag (gtag.js) - Google Analytics