重构2-重新组织函数

重构的基本技巧--小步前进,频繁测试。

模式是你希望到达的目标,重构则是到达之路。

在单进程软件中,你永远不必操心多么频繁地调用某个函数,因为函数的调用成本很低。但在分布式软件中,函数的往返必须被减至最低限度。

(Extract Method)提炼函数

含义:将一个复杂的大函数,提取整合为多个简单的小函数,通过函数名很明显的显示出此小函数要表达或者要展示的作用。

特别注意事项:

  • 小函数的命名,要让别人立马可以看到函数要表达的含义。
  • 对于大函数中的局部变量要特别小心,看是如何被调用和使用的。
  • 对于需要返回参数的函数,尽可能使用多个小函数来处理返回值,尽量不要使用一个函数返回多个参数。

(Inline Method)内联函数

含义:函数的内部要表达的代码和函数名称一样简单时,就不需要单独使用函数,而直接使用本体就可。

        int _nNumberOfLateDeliveries=10;
private int GetRating()
{
return (moreThanFiveLateDeliveries()) ? 2 : 1;
}
private bool moreThanFiveLateDeliveries()
{
return _nNumberOfLateDeliveries > 5;
}

对于上面的代码,在函数moreThanFiveLateDeliveries()中的函数主体特别简单,很容易看懂,那么此时就不需要使用此函数,直接在调用者GetRating()中,直接使用函数主体,以减少内联函数的使用。

特别注意事项

  • 并不是所有的内联函数都没有价值,你需要找到有意义的内联函数,将无意义无用的内联函数优化掉。

(Replace Temp with Query)以查询取代临时变量

含义:如果函数中有临时变量保存着某一表达式的运算结果,则需要将此表达式提炼到一个独立函数中,将这个临时变量所有的引用点都替换为这个独立函数。

特别注意事项:

  • 临时变量只是暂时的,而且只能在函数内部使用,如果将其所代表的表达式优化为一个单独的函数则可以多方进行调用。
  • 确保提炼出来的函数无任何副作用。(该函数并不修改任何对象内容)

(Replace Method with Method Object)以函数对象取代函数

含义:对于大型函数,往往代码比较臃肿,那么就需要将大函数进行拆分,放再对象中成为对象中的字段,然后就可以在同一个对象中将这个大型函数分解为多个小型函数。

(Substitute Algorithm)替换算法

含义:如果想 将某一个算法替换为另一个更清晰的算法,将函数本体替换为另一个算法即可。

(Remove Assignments To Parameters)移除对参数的赋值

含义:代码对一个参数进行赋值,以一个临时变量取代该参数的位置。其实就是对于参数而已,如果可以在函数主体中之间使用,则就不需要在先将其赋值给参数,后使用参数。而且对于参数,最好只赋值一次,让其表示的函数单一。

(Split Temporary Variable)分解临时变量

含义:临时变量只能代表单一的表达式,如果它既不是循环变量,又不被用于收集计算结果。那么针对每次赋值,创造一个独立,对应的临时变量。

每个变量只承担一个责任,同一个临时变量承担俩件不同的事情,会另代码阅读者混乱糊涂。

(Introduce Explaining Variable)引入解释性变量

含义:对于函数中的复杂表达式,需要进行优化,将其重构成函数,赋值给一个临时变量,用临时变量来代替这个复杂表达式来向程序解释具体的用途。

对于临时变量,应该创建一个具体特殊含义,可以表达此复杂表达式的变量来用以说明。

小寄语

一个人的奋斗,像怀孕一样,日子久了,总会被看出来的。

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

我是哉说,感谢您的阅读,如果对你有帮助,麻烦点赞,转发 谢谢。

写Bug时,需要注意的几点 02的更多相关文章

  1. 写Bug时,需要注意的几点3

    在对象之间搬移特性 类往往会因为承担过多责任而变得臃肿不堪. (Move Method)搬移函数 含义:在程序中,里面的一个函数与其类外面的一个类或函数有着紧密的调用或者被调用,则需要对其函数内部的表 ...

  2. STM32用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain现象和解决方案

    现象 CPU: STM32107VC 用JLINK 烧写程序时出现NO Cortex-m device found in JTAG chain 如图无法查找到硬件就是CPU 提示1:NO Cortex ...

  3. 写css时要注意数字的浮动方向

    写css时要注意数字的浮动方向  当数字位数增加时他的方向才是正确的 text-align:right;padding-right:29px;

  4. object-c cocos2d-x 写程序时注意调试的技巧

    (1)写程序时最好在类的init函数中显示类名,表明现在在执行哪个类,样例代码 CCLOG(@"cocos2d: Using Director Type:%@", [self cl ...

  5. input标签写CSS时需要注意的几点(先收藏)

    (从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-05-05) 飞鱼的声纳顶部的搜索框让我头疼了很长时间,原因是总不能获得跨浏览器的统一样式.主要的问题有这么两个:一是inpu ...

  6. sharepoint 2010 在aspx 写lambda 时错误

    在sharepoint 2010 中,写lambda时,遇到错误.在aspx里面,写lambda表达式, 运行时报错,就不明道理了.经过百般测试,终于找到方法: 错误提示: "/" ...

  7. java写文件时,输出不完整的原因以及解决方法

    在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bo=new BufferedWriter(new FileWriter("sql语句.txt")) ...

  8. java写文件时,输出不完整的原因以及解决方法close()或flush()

    在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bw=new BufferedWriter(new FileWriter("sql语句.txt")) ...

  9. 写插件时遇到的一个小问题,关于animate和css3的问题

    昨天写代码时,偶然想到了如果我们把css3属性放在animate中,指定时间.能否实现动画呢.举个例子吧: <script> $(".box").animate({ & ...

随机推荐

  1. 【pytest官方文档】解读fixtures - 11. fixture的执行顺序,3要素详解(长文预警)

    当pytest要执行一个测试函数,这个测试函数还请求了fixture函数,那么这时候pytest就要先确定fixture的执行顺序了. 影响因素有三: scope,就是fixture函数的作用范围,比 ...

  2. 1-3 Postman 注册账号与登录

    1.为什么要注册postman账号 注册postman账号是免费的.当注册并登陆一个postman账号后,用户可以获得如下权限. (1)同步和备份历史,集合,环境,和预置头. (2)可以轻松的处理来自 ...

  3. @unittest.skip(reason):强制跳转。reason是跳转原因

    在执行测试用例时,有时候有些用例是不需要执行的,那我们怎么办呢?难道删除这些用例?那下次执行时如果又需要执行这些用例时,又把它补回来?这样操作就太麻烦了. unittest提供了一些跳过指定用例的方法 ...

  4. vue2整个项目中,数据请求显示loading图----------未完成阅读,码

    一般项目中,有时候会要求,你在数据请求的时候显示一张gif图片,然后数据加载完后,消失.这个,一般只需要在封装的axios中写入js事件即可.当然,我们首先需要在app.vue中,加入此图片.如下: ...

  5. ARM汇编中的:比较指令--CMN / CMP / TEQ / TST

    1. 简介 CMP / CMN : 算术指令 TEQ / TST : 逻辑指令      它们总是会影响CPSR条件标志位. APSR(CPSR)与condition的关系图: 2. CMN -- 比 ...

  6. Tomcat管理弱口令页面Getshell

    目录 弱口令Getshell 利用Burpsuite对tomcat账号密码进行爆破 弱口令Getshell Tomcat安装完成后会有如下页面,点击该页面的 Manager App 处会弹出输入用户名 ...

  7. 5.IA-32寄存器

    寄存器(Register)是CPU内部用来存放数据的一些小型存储区域,它与RAM(Random Access Memory,随机存储器.内存)略有不同.CPU访问(Access)RAM中的数据时要经过 ...

  8. java8中的Optional

    Optional类主要解决空指针异常NullPointerException.Optional 类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用 null 表示一 ...

  9. 源码简析XXL-JOB的注册和执行过程

    一,前言 XXL-JOB是一个优秀的国产开源分布式任务调度平台,他有着自己的一套调度注册中心,提供了丰富的调度和阻塞策略等,这些都是可视化的操作,使用起来十分方便. 由于是国产的,所以上手还是比较快的 ...

  10. 墙裂推荐一波mysql学习资源

    在日常工作与学习中,无论是开发.运维.测试,还是架构师,数据库是一门必不可少的"必修课", 也是必备的涨薪神器.在互联网公司中,开源数据库用得比较多的当属 MySQL 了. 但my ...