从文章"避免复制与粘贴"到文章"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 ...
随机推荐
- word模版另存为网页(*.htm,*.html),转为jsp页面并加入数据后导出成word
word模版另存为网页之后,将html格式的文件转为jsp页面,在页面上加入相应的动态值,加入的值中包含图片,这个该怎么处理??另外导出的文件需要拷贝到不同的地方(无法联网)使用. <%@ pa ...
- 一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频
博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:一个使用C#的TPL Dataflow Library的例子:分析文本文件中词频.
- Qt编写串口通信程序全程图文解说
(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...
- Windows 7系统下局域网文件共享设置方法
今天给家里增添了一台组装机,小试了一下win7局域网文件共享功能,很爽的说. 记录一下实现方法: 1.关闭防火墙 2.启用共享. 控制面板 – 网络和共享中心 – 更改高级共享设置,将图中的几个选项选 ...
- 15分钟弄懂 const 和 #define
什么是const ? 什么是#define? 他们有什么用? 他们有什么区别? 应该怎么用? 总结 1. 什么是const ? const是C/C++中的一个关键字(修饰符), const一般用来定义 ...
- Python爬虫获取知乎图片
前段时间想抓点知乎问题中的图片,了解了下爬虫,发现还是Python的简单方便,于是做了点尝试. #coding=utf-8 import urllib import re def getHtml(ur ...
- linux tar 压缩解压缩
解压 .tar.bz tar zxvf file.tar.gz .tar.gz2 tar jxvf file.tar.bz2 .bz gzip -d file.bz .gz2 bzip2 -d fil ...
- Mybatis中实现oracle的批量插入、更新
oracle 实现在Mybatis中批量插入,下面测试可以使用,在批量插入中不能使用insert 标签,只能使用select标签进行批量插入,否则会提示错误 ### Cause: java.sql.S ...
- U3D 抛物线的方法
本文转载:http://www.manew.com/thread-44642-1-1.html 无论是愤怒的小鸟,还是弓箭发射功能,亦或者模拟炮弹受重力影响等抛物线轨迹,都可以使用本文的方法,模拟绝对 ...
- PHP 根据值查找键名
array_search (PHP 4 >= 4.0.5, PHP 5) mixed array_search ( mixed $needle , array $haystack [, bool ...