写Bug时,需要注意的几点 02
重构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的更多相关文章
- 写Bug时,需要注意的几点3
在对象之间搬移特性 类往往会因为承担过多责任而变得臃肿不堪. (Move Method)搬移函数 含义:在程序中,里面的一个函数与其类外面的一个类或函数有着紧密的调用或者被调用,则需要对其函数内部的表 ...
- 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 ...
- 写css时要注意数字的浮动方向
写css时要注意数字的浮动方向 当数字位数增加时他的方向才是正确的 text-align:right;padding-right:29px;
- object-c cocos2d-x 写程序时注意调试的技巧
(1)写程序时最好在类的init函数中显示类名,表明现在在执行哪个类,样例代码 CCLOG(@"cocos2d: Using Director Type:%@", [self cl ...
- input标签写CSS时需要注意的几点(先收藏)
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期2014-05-05) 飞鱼的声纳顶部的搜索框让我头疼了很长时间,原因是总不能获得跨浏览器的统一样式.主要的问题有这么两个:一是inpu ...
- sharepoint 2010 在aspx 写lambda 时错误
在sharepoint 2010 中,写lambda时,遇到错误.在aspx里面,写lambda表达式, 运行时报错,就不明道理了.经过百般测试,终于找到方法: 错误提示: "/" ...
- java写文件时,输出不完整的原因以及解决方法
在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bo=new BufferedWriter(new FileWriter("sql语句.txt")) ...
- java写文件时,输出不完整的原因以及解决方法close()或flush()
在java的IO体系中,写文件通常会用到下面语句 BufferedWriter bw=new BufferedWriter(new FileWriter("sql语句.txt")) ...
- 写插件时遇到的一个小问题,关于animate和css3的问题
昨天写代码时,偶然想到了如果我们把css3属性放在animate中,指定时间.能否实现动画呢.举个例子吧: <script> $(".box").animate({ & ...
随机推荐
- 《TCP/IP网络编程》学习笔记整理
简介 本笔记目前已包含 <TCP/IP网络编程>中的前 5 章,后续章节会在近期内补充完整. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔 ...
- C语言小知识(基于Linux)——个人笔记,不定时更新
一.switch case语法,在case中定义变量时,需要在case的有效范围内使用花括号包起来,否则会编译报错: switch (name){ case "zhangSan": ...
- JDBC_05_ResorceBundle(资源绑定器) 绑定配置文件
ResorceBundle(资源绑定器) 绑定配置文件 jdbc.proprtise 需要在src目录下新建一个文件夹然后将jdbc.proprtise放在文件中然后右键该文件夹选择 Rebuild ...
- 使用vue-element-admin框架从后端动态获取菜单
1.前言 vue-element-admin是一个纯前端的框架,左侧菜单是根据路由生成的.实际开发中经常需要根据当前登陆人员的信息从后端获取菜单进行展示,本文将详细介绍如何实现该功能. 2.详解 ...
- 被动信息搜集 - Python安全攻防
概述: 被冻信息搜集主要通过搜索引擎或者社交等方式对目标资产信息进行提取,通常包括IP查询,Whois查询,子域名搜集等.进行被动信息搜集时不与目标产生交互,可以在不接触到目标系统的情况下挖掘目标信息 ...
- 『动善时』JMeter基础 — 3、JMeter插件管理
JMeter是一个Java开发的开源软件,开源的软件有一个好处,就是会有很多第三方开发出来的插件,使得JMeter在处理某一些功能的时候更加的方便.并且这些插件拿过来就可以使用,完全免费的. 我们安装 ...
- 【SpringBoot】Springboot2.x整合Redis(一)
备注: springboto整合redis依赖于spring-boot-starter-data-redis这个jar 一,项目环境和依赖 1.POM.xml配置 <parent> < ...
- C/C++ 进程代码注入与提权/降权
如果将shellcode注入到具有特定权限的进程中,我们就可以获得与该进程相同的权限,此方法可以用于提权与降权操作,注入有多种方式,最简单的是直接将metasploit生成的有效载荷直接注入到目标进程 ...
- 病毒木马查杀实战第016篇:U盘病毒之逆向分析
比对脱壳前后的程序 我们这次所要研究的是经过上次的脱壳操作之后,所获取的无壳病毒样本.其实我们这里可以先进行一下对比,看看有壳与无壳的反汇编代码的区别.首先用IDA Pro载入原始病毒样本: 图1 可 ...
- Python第四章-字典
第四章 字典-当索引不好用时 4.0 字典可以理解成是C++里的map,可以映射任何类型.字典这种结构类型称为映射(mapping). 字典是Python中唯一内建的映射类型,字典中的值并 ...