在牛人的博客中提到了..如果你的代码可以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. JAVA-应用easyui

    easyui下载地址:http://www.jeasyui.com/index.php 现在还easyui之后将其解压,解压之后将文件夹中的文件除了demo文件夹之外的文件放入到Eclipse的web ...

  2. TCP 连接的建立和终止

    三路握手 建立一个TCP连接时会发生下述情形. (1)服务器必须准备好接受外来的连接.这通常通过调用socket.bind和listen这3个函数来完成的,我们称之为被动打开. (2)客户通过调用co ...

  3. Lua的安装

      Lua 是一个扩展式程序设计语言,它被设计成支持通用的过程式编程,并有相关数据描述的设施. Lua 也能对面向对象编程,函数式编程,数据驱动式编程提供很好的支持.它可以作为一个强大.轻量的脚本语言 ...

  4. QT实现多语言切换

    功能需求: 网盘客户端要能够实现多国语言的切换,第一版要支持中.英文的切换.在实现过程中感觉QT对多国语言的支持还是很不错的,制作多语言包很方便,切换的逻辑也很简单.下面就来看一下QT中如何制作多语言 ...

  5. 介绍 JSON

    出自官网:http://www.json.org/json-zh.html JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于 ...

  6. USB开发——内核USB驱动+libusb开发方法

    linux内核已经具备usb驱动,所以一些设备使用可以免驱,libusb是针对linux内核中ubs驱动的一套api,会自行调用usb驱动接口,并为应用提供api接口,将usb设备开发减少为应用层开发 ...

  7. 还原或删除sql server 2008数据库时,经常烩出现: “因为数据库正在使用,所以无法获得对数据库的独占访问权”,终解决方案

    还原或删除sql server 2008数据库时,经常烩出现: “因为数据库正在使用,所以无法获得对数据库的独占访问权”,终解决方案如下 关键SQL语句: ALTER DATABASE [dateba ...

  8. 触发器-Trigger

    --触发器的实例: Create Table Student(              --学生表         StudentID int primary key,       --学号     ...

  9. Ajax结合Js操作灵活操作表格

    Table页面: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head& ...

  10. Struts2中EL表达式取值

    http://blog.csdn.net/cuihaiyang/article/details/41950141 (写的不错,可以知道为什么struts2可以用El取属性值的问题.正常el从reque ...