从文章"避免复制与粘贴"到文章"Extract Method"的反思(1)
看了一个比我牛的人的博客园的博文"避免复制和粘贴".里面提到了重构手法Extract Method. 所以又搜了一下Extract Method. 这里先自我理解Extract Method 再自我反思博文"避免复制和粘贴"
先插一个题外话就是我们为啥要重构,否则真没看文章的必要了.....
1.更方便地添加新的功能,在添加新的功能之前,查看以前实现的相关代码,如果发现可以通过重构使得添加新功能更加简单,那就应该先重构。重构完成后,以前的测试用于保证重构没有破坏原来的功能。如通过重构,实现抽象工厂,添加新的子类时,就会很方便。达到事半功倍的效果。
2.改进已有代码的设计。经过多次的迭代以后,代码在不停地增加,原有设计无法再适应当前的代码,使得结构无序杂乱,重构可以改进设计,使得架构更加合理,更容易添加新的功能。
3.有助于更好的理解代码。
4.干净的代码可以使程序员有更好的心情。
Extract Method 的中文名叫做 "提炼函数". 那么在什么情况下需要提炼函数呢
第一个类型: 函数过长
函数过长的话有两种解决办法 驱除临时变量 和 提炼函数(提炼函数的话就是本文讲的,所有pass).所有先聊一聊 驱除临时变量
例子: 驱除临时变量的专业名词叫做 以查询取代临时变量

把从一行代码basePrice=_quantity*_itermPrice 变成了一个函数.然后在重构前的所有引用变量的地方让其调用函数.这么做的目的是:由于临时变量是暂时的仅在一个{}中有效,为了访问临时变量,就有用更多代码的趋势,而且如果改成是从临时变量替换成查询式,那么同一个类中所有函数都将可以获得这份信息。从而优化代码结构,显得更清晰;而且这种提炼方式是你的代码提炼成函数的基础,因为太多的临时变量导致你的代码要提炼成函数都会变得很难.这里需要注明的是这种方法最后适用于临时变量在函数中只是被赋值了一次的情况
那么应该如何进行替换呢(这里主要是指的是已经写完了代码,再进行重构)
第一步(1):找出只是被赋值一次的临时变量.
第二步(2): 把这个临时变量声明为final (int a = 1--> final int a = 1;)
第三步(3):编译(如果编译错误或者警告那就是这个变量被赋值了多次.final导致的.)
第四步(4):把临时变量等号右边的东西用提炼成一个独立的函数(首先将函数声明为private。日后你可能会发现还有好多地方需要使用它,那时放松对它的保护也很容易;确保提炼出的函数无任何副作用,即该函数不修改任何对象内容)
第五步(5):编译 确保没错
第六步(6):对该临时变量实施“内联临时变量”重构方法。
ps: 我们常常使用临时变量保存循环中的累加信息。在这种情况下,整个循环都可以被提炼为一个独立的函数,这可以减少原函数中几行循环逻辑代码。该手法的使用可能会让你担心性能上的问题。就像和其它性能问题一样,我们现在不用管它,因为十有八九根本没有造成任何影响。就算真的出问题了,你也可以在优化时期解决它。代码组织良好,你也会发现更有效的优化方案;如果没有进行重构,好的优化方案就可能与你失之交臂。
举一个例子我们希望把临时变量 basePrice discountFactor 给去掉.那么首先在两个之前加上finanl然后编译确保没错误(即:仅被赋值一次)
------>
然后一个一个的开始替换.首先替换basePrice .先把赋值动作右侧表达式提炼出来.然后编译测试,再开始使用内联临时变量。首先把临时变量basePrice的第一个引用点替换掉:编译、测试,然后进行下一个。由于下一个是最后一个引用点,所以把basePrice临时变量的声明式一并去掉:
------>
------>
完成basePrice之后,以类似的方法提炼出discountFactor(): 你会发现,如果没有把临时变量basePrice替换为一个查询式,将多么难以提炼discountFactor()! (因为在discountFactor里面调用了basePrice() ) 最终,getPrice()变成这样:
------->
在篇幅2里面就来谈一谈 把代码从函数中提炼出来组成函数,恩,有叫做 以函数对象取代函数.
从文章"避免复制与粘贴"到文章"Extract Method"的反思(1)的更多相关文章
- 从文章"避免复制与粘贴"到文章"Extract Method"的反思(3)
在牛人的博客中提到了..如果你的代码可以copy-past的时候,那么久证明你的代码出现了重复.而这种重复仅仅是虚假的代码行的增加而不是像其他的代码复用那样降级成本. copy-pase代码意味着你违 ...
- 从文章"避免复制与粘贴"到文章"Extract Method"的反思(2)
好了.在上一篇里面讲了讲怎么把临时变量应该从函数里面剔除去.这个过程叫做从临时变量变成查询 那么接下来我们聊聊把代码提炼成函数,有叫做用函数对象取代函数 那么,问题来了:在函数中什么样的代码是需要被提 ...
- 如何在eclips下将一段代码抽取为方法Extract Method
最近读了读关于重构的文章,做了个小总结(在编程思想目录下<从文章"避免复制与粘贴"到文章"Extract Method"的反思 系列>). 然后因为 ...
- Laravel大型项目系列教程(四)显示文章列表和用户修改文章
小编心语:不知不觉已经第四部分了,非常感谢很多人给小编提的意见,改了很多bug,希望以后能继续帮小编找找茬~小编也不希望误导大家~这一节,主要讲的 是如何显示文章列表和让用户修改文章,小编预告一下(一 ...
- 用python+selenium登录cnblog后新增文章后再次删除该文章
目的:登录cnblog后新增文章后再次删除该文章并验证 代码如下: #coding: utf-8 from selenium import webdriver from time import sle ...
- dedecms文章页调用地址(当前文章URL)如何操作?
我们在建站时经常会在文末加一个本文地址,那么dedecms文章页如何调用当前文章URL呢?这样做的好处是增加文章的唯一标识,更进一步的做法是在head中加个cannacial标签,告诉搜索引擎url的 ...
- VS Extract Method
前言 看重构6.4Replace Temp with Query(以查询取代临时变量)中提到Replace Temp with Query往往是你运用Extract Method之前必不可少的一个步骤 ...
- 『重构--改善既有代码的设计』读书笔记----Extract Method
在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...
- Refactoring #001 Extract Method
Example public void startup() { ServerSocket serverSocket = null; try { serverSocket = new ServerSoc ...
随机推荐
- Staitic(静态) 相关知识点介绍
一.什么是 Static? Static 关键字:表明一个成员变量或者是成员方法可以在没有所属的类的实例的情况下直接被访问 当成员被静态修饰后,就多了一个调用方式,除了可被对象调用外还可以直接被类名调 ...
- 用Android++在Visual Studio中用C/C++开发Android应用
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Android++在Visual Studio中用C/C++开发Android应用.
- iOS socket原理及连接过程详解
连接过程图解(度娘的拿过来用)
- Unity3d + NGUI 多分辨率适应
更多型号适合的移动终端 现在我们要介绍的<链战争>游戏改编方法,这种适应方法UI这是一个基本维度,背景是一个基本的尺寸.背景比UI没有实际影响某一部分的额外部分,这样就避免了适应iPhon ...
- Android TextView中有图片有文字混合排列
Android TextView中有图片有文字混合排列 1.使用html.fromHtml 2.新建ImageGetter 3.使用<img src>标签 demo: 1.设置文字 ((T ...
- 使用QEMU调试Linux内核代码
http://blog.chinaunix.net/uid-20729583-id-1884617.html http://www.linuxidc.com/Linux/2014-08/105510. ...
- CentOS远程系统管理之VNC
写这篇有摘自他人的地方,如若侵犯请立即告知,第一时间下降!! 现在比较好用的用的广泛的是SSH和PUTTY,通过这些客户端来管理LINUX服务器的,下面主要介绍另一款VNC软件,主要由两个部分组成:V ...
- spring beans源码解读之--bean definiton解析器
spring提供了有两种方式的bean definition解析器:PropertiesBeanDefinitionReader和XmLBeanDefinitionReader即属性文件格式的bean ...
- linux shell less 命令---转
less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...
- runtime重写description方法打印model属性和值
在开发过程中, 往往会有很多的model来装载属性. 而在开发期间经常会进行调试查看model里的属性值是否正确. 那么问题来了, 在objective-c里使用NSLog("%@" ...