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

copy-pase代码意味着你违法了不重复自己的原则(DRY原则).

而一旦你在你的方法中或者方法直接开始了copy-past,那么久意味着你的代码需要Extract Method. 恩在文章(1)(2)中介绍了部分的重构方法.

在提取放置之后呢,还可以根据情况利用Move Method重构手法,将其搬移到一个类中,然后在原来的调用处转为对该类方法的调用。或者利用Replace Method with Method Object,将这些职责封装为专有的类。关于Move Method重构手法  和  Replace Method with Method Object  会在 文章<从文章"避免复制与粘贴"到文章"Move Method"的反思>系列中自我理解.这里就先放一放.

这里呢牛人举了一个自己的实际的工作的例子来说明如何避免的copy-past.我讲理解性的描述一下他的过程

首先他有一个a 类 ,其中有个私有方法是设置参数变量unit的单位是rmb还是dollar. 然后这个方法被他的另一个函数creatUnit调用

class a

{

private void setUnitType( Unit unit)

  {

string type = "rmb";

     String moneyType = resource.getMoneyType();

if (moneyType.toLowerCase().equals(type)){

unit.setReportType(Unit.china_money);

else {

unit.setReportType(Unit.usa_money);

}

  }

protected void creatUnit()

{

      Unit unit;

unit.setCreditAmount = 100;

setUnitType( unit);

}

}

但是呢,悲剧的是他发现在b类中的某个函数也需要给Unit对象设置单位

class b

{

protected void changeUnit()

{

Unit unit;

      //需要调用一个给Unit设置单位的函数

}

}

我发现在b类中同样需要设置unit的类型。然而,setUnitType()方法却被定义为a的私有方法,无法被b对象调用。最简单的做法是采用复制的方式,将这段代码复制到b中。好了,如果此时我们不能忍住copy-paste的简便所带来的诱惑,或许就会陷入重复的泥沼了。Copy的动作绝对应该鸣起刺耳的警声。我们需要对这一做法保持足够的警惕。

然后呢..大牛就干了之下的事情

在他看了呢setUnitType干的事情无法就是给UnitType的对象赋值单位..因为他的UnitType中已经有了set和get方法,他只要再次在unitType中写一个私有方法让get函数返回就可以了. {Move method 重构}

class Unit

{

public: setUnitType()

  {

  }

public: getUnitType()

{

return getUnitTypeByInfo();

}

private void getUnitTypeByInfo( Unit unit)  //由于从a挪到了unit类这里需要Rename Method以及Extract Method等重构手法。

  {

string type = "rmb";

     String moneyType = resource.getMoneyType();

if (moneyType.toLowerCase().equals(type)){

      self.type = Unit.china_money

else {

      self.type = Unit.usa_money

}

  }

}

这样的话类a改为

class a

{

protected void creatUnit()

{

      Unit unit;

unit.setCreditAmount = 100;

unit.setUnitType( unit.getUnitType() )

}

}

class b

{

protected void changeUnit()

{

Unit unit;

      unit.setUnitType( unit.getUnitType() )

}

}

由于大牛的例子比较繁琐,所以就用这个简化的有错误的例子来说明原理,心领意会即可..

简单的说就是a类的一个函数功能 和 b类的一个函数功能是一样的..那么你可以把a类的函数功能拷贝到b类中,但是这样的话就是copy-past.很不好.但是他发现a类的这个函数功能和b类的这个函数功能都是对c类对象的操作.所有他就想法设法的把这部分操作挪到了c类自身中进行..这样的话在a类和b类中仅仅调用c类的方法即可.而不用有两份相同的代码了.

从文章"避免复制与粘贴"到文章"Extract Method"的反思(3)的更多相关文章

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

    看了一个比我牛的人的博客园的博文"避免复制和粘贴".里面提到了重构手法Extract Method.  所以又搜了一下Extract Method. 这里先自我理解Extract ...

  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. Day 2 @ RSA Conference Asia Pacific & Japan 2016

    上午有两场summits,议题分别是: sum-w01: G2B: Cyber-Business in Myanmar, Indonesia and Thailand sum-w02: Achievi ...

  2. Android 动画及属性动画

    Android 平台提供了一套完整的动画框架,在Android3.0之前有两种动画Tween Animation(补间动画)和Frame Animation(帧动画), 对应SDK中的View Ani ...

  3. python 面向对象深入理解

    面向过程 函数式编程 面向对象编程:面向对象是由类和对象组成,只要用类和对象实现的,就是面向对象编程 def  Bar():     print  "This is  Bar " ...

  4. [压缩解压缩] SharpZip--压缩、解压缩帮助类

    里面有三个类都是用于压缩和解压缩的.大家看下图片 看下面代码吧 /// <summary> /// 类说明:SharpZip /// 编 码 人:苏飞 /// 联系方式:361983679 ...

  5. [Excel] CsvHelper---C#关于CSV文件的导入和导出以及转化 (转载)

    点击下载 CsvHelper.rar 这个类是关于Csv文件的一些高级操作1.DataTable导出到CSV2.将Csv读入DataTable看下面代码吧 /// <summary> // ...

  6. Jsoup解析Html教程

    Jsoup应该说是最简单快速的Html解析程序了,完善的API以及与JS类似的操作方式,为Java的Html解析带来极大的方便,结合多线程适合做一些网络数据的抓取,本文从一下几个方面介绍一下,篇幅有限 ...

  7. 三种C#.net生成静态页面的方法

    ASP.NET生成静态页面方法主要有三种   第一种方法:向服务器的动态页面发送请求,获取页面的html代码.这种方法缺点显而易见:速度慢.另外如果请求的动态页面有验证控件的话,返回的html页面却无 ...

  8. ecshop添加自定义lbi文件

    1.找到 admin下面 includes\lib_template.php 找到 $page_libs = array( 这里…. 给您需要的页面加上 你自己的 boke365.lbi 2.找到 l ...

  9. VS2008中MFC界面编程Caption中文全是乱码的解决办法 -转载

    一.问题 在预览状态下可能看到中文,但是编译运行后对话框中的中文全是问号.即使你用的VS中文版,即使你也用了Unicode编码,即使有条件编译 #ifdef _WIN32LANGUAGE LANG_C ...

  10. python隐含的特性

    本文源自(http://stackoverflow.com/questions/101268/hidden-features-of-python)希望介绍Python非常有用,而比较忽视的Python ...