看了一个比我牛的人的博客园的博文"避免复制和粘贴".里面提到了重构手法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)的更多相关文章

  1. 从文章"避免复制与粘贴"到文章"Extract Method"的反思(3)

    在牛人的博客中提到了..如果你的代码可以copy-past的时候,那么久证明你的代码出现了重复.而这种重复仅仅是虚假的代码行的增加而不是像其他的代码复用那样降级成本. copy-pase代码意味着你违 ...

  2. 从文章"避免复制与粘贴"到文章"Extract Method"的反思(2)

    好了.在上一篇里面讲了讲怎么把临时变量应该从函数里面剔除去.这个过程叫做从临时变量变成查询 那么接下来我们聊聊把代码提炼成函数,有叫做用函数对象取代函数 那么,问题来了:在函数中什么样的代码是需要被提 ...

  3. 如何在eclips下将一段代码抽取为方法Extract Method

    最近读了读关于重构的文章,做了个小总结(在编程思想目录下<从文章"避免复制与粘贴"到文章"Extract Method"的反思 系列>). 然后因为 ...

  4. Laravel大型项目系列教程(四)显示文章列表和用户修改文章

    小编心语:不知不觉已经第四部分了,非常感谢很多人给小编提的意见,改了很多bug,希望以后能继续帮小编找找茬~小编也不希望误导大家~这一节,主要讲的 是如何显示文章列表和让用户修改文章,小编预告一下(一 ...

  5. 用python+selenium登录cnblog后新增文章后再次删除该文章

    目的:登录cnblog后新增文章后再次删除该文章并验证 代码如下: #coding: utf-8 from selenium import webdriver from time import sle ...

  6. dedecms文章页调用地址(当前文章URL)如何操作?

    我们在建站时经常会在文末加一个本文地址,那么dedecms文章页如何调用当前文章URL呢?这样做的好处是增加文章的唯一标识,更进一步的做法是在head中加个cannacial标签,告诉搜索引擎url的 ...

  7. VS Extract Method

    前言 看重构6.4Replace Temp with Query(以查询取代临时变量)中提到Replace Temp with Query往往是你运用Extract Method之前必不可少的一个步骤 ...

  8. 『重构--改善既有代码的设计』读书笔记----Extract Method

    在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...

  9. Refactoring #001 Extract Method

    Example public void startup() { ServerSocket serverSocket = null; try { serverSocket = new ServerSoc ...

随机推荐

  1. TCP/UDP是如何传输的?

    一.网络模型: OSI参考模型 TCP/IP参考模型 二.网络通讯要素 IP地址: 网络中设备的标识 不易记忆,可用主机名 本机回环地址:127.0.0.1 主机名: localhost 端口号: 用 ...

  2. Spring XD 1.1 M2 and 1.0.3 released---support kafka

    官方地址:http://spring.io/blog/2014/12/23/spring-xd-1-1-m2-and-1-0-3-released On behalf of the Spring XD ...

  3. win7家庭版升级旗舰版

    点“开始”——在“所有程序”点"Windows Anytime Update"——点“输入升级密钥”,然后就出现一个密钥框,输入一个旗舰版的密钥,确定就行了,10分钟左右就升级好了 ...

  4. Cracking the coding interview

    写在开头 最近忙于论文的开题等工作,还有阿里的实习笔试,被虐的还行,说还行是因为自己的水平或者说是自己准备的还没有达到他们所需要人才的水平,所以就想找一本面试的书<Cracking the co ...

  5. 配置toad进行导入导出数据库操作

    最近需要对oracle进行导入导出操作,于是研究使用toad进行导入导出oracle数据库操作,现稍作记录. oracle的导入导出不管是否使用toad还是pl/sql工具进行操作,实际上最终都是通过 ...

  6. Tomcat 的 SSL 配置

    本教程使用 JDK 6 和 Tomcat 7,其他版本类似. 基本步骤: 使用 java 创建一个 keystore 文件 配置 Tomcat 以使用该 keystore 文件 测试 配置应用以便使用 ...

  7. JS1 js获取dom元素方法

     js获取dom元素方法  1.通过ID选取元素(getElementById) 1)使用方法:document.getElementById("domId")         其 ...

  8. Java-struts2 之值栈问题

    这里是根据一个小项目,将数据库的值查出来,然后在页面前台进行遍历的方法 放入值的几种方式: Struts2的三种存值取值的方式 值栈: 栈上下文: ActionContext: package com ...

  9. H TML5 之 (6)下雨效果

    在对HTML5进行研究之后,有了一点想法,思考出游戏其实感觉就是四个步骤 1.创建一个你需要的对象,赋予属性(一些影响方法的属性),方法(运动,叫....) 2.实例化这个对象,让它成为一个或者多个个 ...

  10. C#语法糖之第四篇: 扩展方法

    今天继续分享C#4.0语法糖的扩展方法,这个方法也是我本人比较喜欢的方法.大家先想想比如我们以前写的原始类型不能满足现在的需求,而需要在该类型中添加新的方法来实现时大家会怎么做.我先说一下我没有学习到 ...