在牛人的博客中提到了..如果你的代码可以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. Android 系统名字、版本、API level的对应关系

    从官网上找到的,具体地址是: http://source.android.com/source/build-numbers.html Code name Version API level Lolli ...

  2. MyEclipse10搭建Strust2开发环境

    一.创建一个JavaWeb项目 启动MyEclipse10    ,然后在MyEclipse中创建一个JavaWeb项目,点击[File]---->[New]---->[WebProjec ...

  3. 再谈内存管理与ARC运行机制(一)

    内存管理 内存在Objective-C开发中是一种相对稀缺的资源,拿Iphone4为例,它的内存只有512mb,所以妥善的处理好所创造,所使用的每个对象与变量都将成为一个问题.在ARC出现以前,同大部 ...

  4. MySQL 5.6 SQL 优化及 5.6手册

    http://blog.chinaunix.net/uid-259788-id-4146363.html http://www.cnblogs.com/Amaranthus/p/4028687.htm ...

  5. 【转】cocos2d-x学习笔记03:绘制基本图元

    第一部分:基本图形绘制 cocos2dx封装了大量opengl函数,用于快速绘制基本图形,这些代码的例子在,tests\DrawPrimitivesTest目录下 注意,该方法是重载node的draw ...

  6. Java动态调用webService,axis2动态调用webService

    Java动态调用webService axis2动态调用webService >>>>>>>>>>>>>>>& ...

  7. HDU-1012(水题)

    http://acm.hdu.edu.cn/showproblem.php?pid=1012 分析:就按题目给的公式一步步输出就行了. #include<stdio.h> #include ...

  8. web前端:css

    css简介: web文档的结构由html元素定义,而这些html元素是如何显示的,则是由层叠样式表css来定义,这样就实现了结构与表现的分离. 1.外部样式表 可以将样式定义放在一个单独的文件中,并且 ...

  9. [Session] SessionHelper---C#操作Session的帮助类 (转载)

    点击下载 SessionHelper.rar 下面是代码大家看一下 这个类主要是关于Session的基本操作比如:1.获取Session值2.设置一个Session的值3.清空所有的Session4. ...

  10. # Day04-Android

    Day04-Android 标签(空格分隔): andrroid 1.制作界面 2.在写Activity. Logcat LayoutInflate把Xml转换纯成View的工具. 自定义吐司 Lay ...