`
zhykhs
  • 浏览: 61753 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

重构第一例

 
阅读更多

定义:在不改变代码外在行为的前提下,对代码做出修改,以改进程序内部结构。

 

重构第一例。

 

Movie:

package refactoring;



public class Movie {

	public static final int CHILDRENS = 2;
	public static final int REGULAR = 0;
	public static final int NEW_RELEASE = 1;
	
	private String title;
//	private int priceCode;
	private Price price;
	
	public Movie(String title, int priceCode) {
		this.title = title;
//		this.priceCode = priceCode;
		setPriceCode(priceCode); // self encapsulate field
	}
	
	public int getPriceCode() {
//		return priceCode;
		return price.getPriceCode();
	}
	
	public void setPriceCode(int priceCode) {
//		this.priceCode = priceCode;
		switch(priceCode) {
		case REGULAR:
			price = new RegularPrice();
			break;
		case CHILDRENS:
			price = new ChildrensPrice();
			break;
		case NEW_RELEASE:
			price = new NewReleasePrice();
			break;
		default:
			throw new IllegalArgumentException("Incorrect Price Code");
		}
	}
	
	public double getCharge(int daysRented) {
		return price.getCharge(daysRented);
	}
	
	public String getTitle() {
		return title;
	}
	
	public int getFrequentRenterPoints(int daysRented) {
		return price.getFrequentRenterPoints(daysRented);
	}
}

 

2.Customer:

 

package refactoring;

import java.util.Enumeration;
import java.util.Vector;

public class Customer {
	
	private String name;
	private Vector<Rental> rentals = new Vector<Rental>();
	
	public Customer(String name) {
		this.name = name;
	}
	
	public void addRental(Rental rental) {
		this.rentals.add(rental);
	}
	
	public String getName() {
		return this.name;
	}
	
	public String statement() {
		Enumeration<Rental> rens = this.rentals.elements();
		String result = "Rental Record for " + getName() + "\n";
		while(rens.hasMoreElements()) {
			Rental ren = rens.nextElement();
			// replace temp with query
//			double thisAmount = ren.getCharge(); // 就函数的引用点ren.getCharge();
			// 在每次循环的时候 frequentRenterPoints已经有一个初始值 所以此处直接进行一个 附添赋值操作 
			
			result += "\t" + ren.getMovie().getPriceCode() + "\t" + ren.getCharge() + "\t";
		}
		
		// 共金额
		result += "Amount owed is " + getTotalCharge() + "\n";
		// 总积分
		result += "You earned " + getTotalFrequentRenterPoints() + " frequent renter points";
		return result;
	}
	
	// query method (replace temp with query)
	private double getTotalCharge() {
		double result = 0;
		Enumeration<Rental> rens = rentals.elements();
		while(rens.hasMoreElements()) {
			Rental rental = (Rental) rens.nextElement();
			result += rental.getCharge();
		}
		return result;
	}
	
	private int getTotalFrequentRenterPoints() {
		int result = 0;
		Enumeration<Rental> rens = rentals.elements();
		while(rens.hasMoreElements()) {
			Rental rental = (Rental) rens.nextElement();
			result += rental.getFrequentRenterPoints();
		}
		return result;
	}
}

 

 

3.Rental:

package refactoring;

/**
 * 租赁实体
 * @author zhy
 *
 */
public class Rental {

	private Movie movie;
	private int daysRented;
	
	public Rental(Movie movie, int daysRented) {
		this.movie = movie;
		this.daysRented = daysRented;
	}

	public Movie getMovie() {
		return movie;
	}

	public int getDaysRented() {
		return daysRented;
	}
	
	// 付的总金额
	public double getCharge() {
		return movie.getCharge(daysRented);
	}
	
	// 客户的积分总和
	public int getFrequentRenterPoints() {
		return movie.getFrequentRenterPoints(daysRented);
	}
}

 

 

4.Price:

package refactoring;

public abstract class Price {
	
	abstract int getPriceCode();
	
	//replace Conditional with Polymorphism
	abstract double getCharge(int daysRented);
	
	public int getFrequentRenterPoints(int daysRented) {
		return 1;
	}
}

 

 

5.ChildrensPrice

package refactoring;

public class ChildrensPrice extends Price {

	@Override
	int getPriceCode() {
		return Movie.CHILDRENS;
	}

	public double getCharge(int daysRented) {
		double result = 1.5;
		if(daysRented > 3) {
			result = (daysRented - 3) * 1.5;
		}
		return result;
	}
}

 

 

6.NewReleasePrice

package refactoring;


public class NewReleasePrice extends Price {

	@Override
	int getPriceCode() {
		return Movie.NEW_RELEASE;
	}

	public double getCharge(int daysRented) {
		return daysRented * 3;
	}
	
	public int getFrequentRenterPoints(int daysRented) {
		return daysRented > 1 ? 2 : 1;
	}
}

 

 

7.RegularPrice:

package refactoring;

public class RegularPrice extends Price {

	@Override
	int getPriceCode() {
		return Movie.REGULAR;
	}

	public double getCharge(int daysRented) {
		double result = 2;
		if(daysRented > 2) {
			result += (daysRented - 2) * 1.5;
		}
		return result;
	}
}

 

分享到:
评论
1 楼 xuskyline 2011-04-13  
请教一下 如何比较重构前后的优劣?我如何测试?单有三个类得代码我不知道怎么测试? 先谢了!

相关推荐

    重构改善既有代码的设计(PDF)

    1. 代码坏味道的识别与处理:这是重构的第一步,需要识别代码中不健康的模式(即“坏味道”),如冗余代码、过长的方法、过大的类等。一旦识别出来,可以采用特定的重构手法来改善这些问题。 2. 提炼方法(Extract ...

    “深度学习”理念下的名著教学课堂重构——以《智取生辰纲》教学为例.pdf

    重构的第一步是立足于名著整体,教师需全面理解名著,寻找节选章节与全书的关联,以此引导学生有目的地阅读整个作品。例如在《智取生辰纲》的教学中,不仅关注故事情节、人物性格,还要探讨小说主题,引导学生深入...

    SRCNN.zip_SRCNN_matlab shave_超分辨率_超分辨率重构_超分辨重构

    第一层用于从低分辨率图像中学习基本特征,第二层进行非线性变换,第三层则将这些特征转换为高分辨率图像。SRCNN的训练过程是端到端的,直接优化像素级别的损失函数,比如均方误差,以最小化HR和SR图像之间的差异。 ...

    matlab图像分解与重构.doc

    - 例如,执行第一次分解时:`[cA1,cH1,cV1,cD1]=dwt2(C,'db1')`,其中`C`是转换后的浮点型灰度图像。 - `cA1`表示近似系数,即低频分量。 - `cH1`, `cV1`, `cD1`分别表示水平细节系数、垂直细节系数和对角线细节...

    最优小波树重构信号.txt

    使用`xlsread`函数从Excel文件`moni2.xls`的E列第1行至第32行读取数据,并存储为变量`num`。这一步是信号数据的预处理阶段。 #### 2.2 一维小波包分解 通过`wpdec`函数对信号`num`进行3层的小波包分解,使用的是`...

    多尺度小波分解重构

    - `cd1 = detcoef(c,l,1)`:提取第一层的高频系数。 #### 四、强阈值去噪 在小波分析中,阈值去噪是一种常见的信号去噪方法。其基本思想是通过设定一个阈值,将低于此阈值的小波系数置零,从而达到去噪的目的。本例...

    组织重构与学习型组织创建的研究.doc

    在第一章中,研究背景被设定在全球化进程加速和知识经济崛起的背景下,项目开发与实施成为各行各业的主要生产运营方式。作者引用赫伯特·西蒙的观点强调,有效的组织结构是获取竞争优势和实施战略的关键。论文旨在...

    关于团队岗位聘任与基层组织重构的实践与思考——以宁波大学为例.doc

    宁波大学在2010年进行的第四轮岗位聘任制度改革中,针对以往高校人事分配制度存在的问题,如过度重视个人、轻视团队,重科研轻教学,以及基层组织责权利不明晰等问题,采取了团队岗位聘任和基层组织重构的策略。...

    第14章企业业务流程重构.pptx

    企业业务流程重构(BPR,Business Process Reengineering)是一种对企业现有的业务流程进行彻底改革和创新的方法,旨在提高效率、降低成本并提升企业的竞争力。这一概念由Michael Hammer教授在1990年提出,随后与...

    DSP FPGA系统中FPGA的动态重构设计.pdf

    因此,本文提出了第三种方法,即通过DSP的外部高速EMIF总线,在从串配置模式下对FPGA进行在线动态重构。 为了深入理解FPGA的动态重构设计,首先需要了解FPGA的配置原理。以Xilinx公司的Virtex-5系列XCSVLX30 FPGA...

    考虑网络动态重构含多异质可再生分布式电源参与调控的配电网多时空尺度无功优化.pdf

    针对这些挑战,华北电力大学的研究人员颜湘武和徐韵提出了一种多时空尺度无功优化模型,并发表在《电工技术学报》第34卷第20期上,这篇文章探讨了如何在多异质可再生分布式电源参与调控的配电网中实施有效的无功电压...

    软件工程中的代码重构与性能优化方法.pptx

    #### 第1章 软件工程概述 **软件工程概念** - **定义**:软件工程是一门应用计算机科学、数学及管理科学等原理,以系统化、规范化、可度量化的方法进行软件的开发、运行和维护的学科。 - **目的与意义**:旨在提高...

    db4.rar_MATLAB去除噪音_db4_db4分解_matlab db4_信号重构

    本教程主要探讨如何使用MATLAB中的小波分析工具来去除信号中的噪声,以"db4"小波为例,进行信号的分解与重构。"db4"是Daubechies小波的一种,具有较好的时间频率局部化特性,适用于信号的精细分析。 首先,我们要...

    [js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例

    第一种是简单的实现,其中Site订阅者列表是扁平的,所有订阅者都添加到一个数组中,不论订阅者对什么类型的事件感兴趣。在发布者调用publish时,会遍历userList数组,并将所有的订阅者函数应用当前的参数执行。这种...

    基于Ioc模式的软件开发框架重构

    在IoC模式中,组件不再直接创建或管理其依赖项,而是由一个称为IoC容器的第三方组件来负责这些任务。IoC容器的作用是管理应用程序中的对象生命周期,并在适当的时候为组件提供所需的依赖项。 #### IoC容器的应用 ...

    软件工程与软件重构.pptx

    #### 第一章:软件工程概述 **软件工程定义:** - **定义:** 软件工程是一门综合性的学科,它研究如何运用科学的方法来指导软件的开发、运行及维护。该学科旨在通过系统化、标准化的方式,提高软件产品的质量和...

    公考行测空间重构类题目解题技巧.doc

    箭头法的画法,重点是选择一个特征面(明显与其他面区别开的面),并且在这个面上画一个具有唯一确定性性的箭头,画法分为三步,第一步选起点,第二步画直线,第三步在末端画箭头。我们可以发现 A、B、C 三个选项...

Global site tag (gtag.js) - Google Analytics