源地址:http://kb.cnblogs.com/page/154245/

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

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

  我对函数的核心思路:我提出代码最小处理单元的概念:一个基本操作(赋值,比较等),一个函数调用(包括调用后判断返回值进行判断)都看成一个最小处理单元。那么,一个函数,最小处理单元合理的个数范围在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, int b)
{  return a > b ? a : b;
}  

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

  小函数的最大障碍:性能

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

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

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

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

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

  最后的建议:

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

转载于:https://www.cnblogs.com/ruby-huang/archive/2012/08/18/2645561.html

函数要多小才够好——谈小函数之道相关推荐

  1. 转:函数要多小才够好——谈小函数之道

    转载自: http://justjavac.com/other/2012/05/29/to-use-little-function.html "设计良好的函数往往比较小,而过大函数的设计往往 ...

  2. 函数要多小才够好——谈小函数之道[性能?]

    "设计良好的函数往往比较小,而过大函数的设计往往一塌糊涂,或者存在很大的优化空间." 也许你认为讨论函数的大小没有必要,原因是函数设计的本质是内聚,它的大小只是它的表现形式.而上面 ...

  3. c语言函数编正切余切运算,浅谈正切函数与余切函数的应用

    九年义务教育三年制初级中学"数学"课本中,对正切函数和余切函数的定义是这样下的:在RtABC中,∠C=90°,a,b,c分别是∠A,∠B,∠C所对的边,那么tanA==或tanB= ...

  4. c语言malloc函数用法_C语言内存模型!小本本记起来啊!

    一.C语言的内存分配模型 1.程序代码区:存放函数体的二进制代码. 2.全局区数据区:全局数据区划分为三个区域.全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全 ...

  5. python返回unicode_Python 中通过 unicode 码返回单字符的函数是 ,返回单字符 unicode 码的函数是 。_学小易找答案...

    [单选题]哪一个命令能用来查找在文件TESTFILE中只包含四个字符的行?( ) [单选题]修改以太网卡mac地址的命令为( ). [单选题]Python 字符串支持切片操作,如有字符串 s &quo ...

  6. C/C++ sizeof函数解析——解决sizeof求结构体大小的问题

    C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 参考文章: (1)C/C++ sizeof函数解析--解决sizeof求结构体大小的问题 (2)https://www.cnbl ...

  7. matlab 小波滤波器系数导出函数,小波基函数和滤波系数.ppt

    小波基函数和滤波系数 小波分析及其应用 Wavelet Analysis andIt's Applications同济大学 计算机系宣国荣 2003年 6月10日 研究生讲座(2009年11月10日 ...

  8. 小程序云函数获取用户昵称_小程序云开发云函数进阶

    " 云函数(官方文档说明) 云函数即在云端(服务器端)运行的函数.在物理设计上,一个云函数可由多个文件组成,占用一定量的 CPU 内存等计算资源:各云函数完全独立:可分别部署在不同的地区.开 ...

  9. PHP的chunk_split() 函数把字符串分割为一连串更小的部分

    chunk_split() 函数把字符串分割为一连串更小的部分.chunk_split(string,length,end) string 必需.规定要分割的字符串. length 可选.数字值,定义 ...

最新文章

  1. Quick-cocos2d-x3.3 Study (一) --------- 创建一个UI标签
  2. PostgreSQL在何处处理 sql查询之三十九
  3. undefined 和null的区别?
  4. 2019-06-26 某小型支付公司面试经历
  5. 在.NET里用XSLT时怎么使用msxsl:script
  6. Spark2.3.0的DataFrame去哪了,DataSet是哪位?
  7. 微服务架构---服务降级
  8. Ubuntu 16.04.5部署Django环境
  9. angular4之管道
  10. 搭建Android开发环境——Eclipse
  11. 成为一名机器学习算法工程师,你需要这些必备技能
  12. maven实现对js文件进行变量替换和文件压缩
  13. wpsppt页面卷曲在哪里_用PPT制作页面卷角效果,你会吗?
  14. cmd通过安装choco 安装 helm
  15. 2021年第十二届蓝桥杯大赛软件赛决赛C/C++大学A组 个人部分题解
  16. ROS学习之路的整理
  17. macOS分发app打包+签名+公证+添加票据+生成dmg文件
  18. Linux:shell编程(shell基本语法)
  19. new Proxy()代理
  20. iOS 应用架构谈:view 层的组织和调用方案

热门文章

  1. 通过Ajax来简单的实现局部刷新(主要为C#中使用的UpdatePanel控件和ScriptManager控件)...
  2. markdown转html
  3. boost线程之类成员函数
  4. ES6--函数的扩展
  5. 基于 Lucene 的桌面文件搜索
  6. Hello World!!
  7. linux 自学系列:chown 目录权限设置
  8. (winform cookie)如何向某网址Post信息,并得到CookieContainer以便以后直接通过验证...
  9. 解决忘记oracle管理员密码(转)
  10. JS函数式编程概念理解:函子(Functor)