`
381895649
  • 浏览: 230307 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 代码重构-第一章(使用策略模式,把恶心的switch代码去掉...) 一

    博客分类:
  • java
 
阅读更多

 

上一篇文章:java 代码重构-第一章(终于…我们来到继承(Inheritance))

下一篇文章:java 代码重构-第一章(使用策略模式,把恶心的switch代码去掉...) 二

 

现在我加入新class,并在Price 对象中提供「与型别相依的行为」。为了实现这一点,我在Price 内加入一个抽象函数(abstract method ),并在其所有subclasses 中加上对应的具体函数(concrete method):

首先我创建一个类

Price

 

package com.mkfree.refactoring.shap1;

/**
 * 金额
 * 
 * @author hk
 * 
 *         2013-1-4 下午7:30:53
 */
public abstract class Price {
	abstract int getPriceCode(); // 取得价格代号
}

 下面用了java设计模式中的策略模式,如果有很大疑问可以参考:java设计模式 策略模式(strategy pattern)

 

RegularPrice

 

package com.mkfree.refactoring.shap1;

/**
 * 普通电影
 * 
 * @author hk
 * 
 *         2013-1-4 下午7:35:26
 */
class RegularPrice extends Price {
	int getPriceCode() {
		return Movie.REGULAR;
	}
}

 

 ChildrensPrice

 

package com.mkfree.refactoring.shap1;

/**
 * 儿童电影
 * 
 * @author hk
 * 
 *         2013-1-4 下午7:35:08
 */
public class ChildrensPrice extends Price {

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

 

 NewReleasePrice

 

package com.mkfree.refactoring.shap1;

/**
 * 新发布电影
 * 
 * @author hk
 * 
 *         2013-1-4 下午7:34:55
 */
class NewReleasePrice extends Price {

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

 现在我可以编译这些新classes了。

 

现在,我需要修改Movie class 内的「价格代号」访问函数(get/set函数,如下),让它们使用新class。

 

下面是重构前的样子:

Movie

 

private int priceCode;

	public String getTitle() {
		return title;
	}

	public int getPriceCode() {
		return priceCode;
	}

 

这意味我必须在Movie class 内保存一个Price 对象,而不再是保存一个priceCode 变量。此外我还需要修改访问函数(译注:即get/set函数):

重构如下代码:

 

private int priceCode;

	public int getPriceCode() {
		return price.getPriceCode();
	}

	/**
	 * priceCode就new那种price出来(策略模式)
	 * 
	 * @param priceCode
	 */
	public void setPriceCode(int 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");
		}
	}
 

 

 

现在我可以重新编译并测试,那些比较复杂的函数根本不知道世界巳经变了个样儿。

结果:

 

Rental Record for oyhk 
	少林足球	6.0
	大话西游	1.5
Amount owed is 7.5
You earned 3 frequent renter points
------------------------------------------------
<H1>Rentals for <EM>oyhk</EM></ H1><P>
少林足球: 6.0<BR>
大话西游: 1.5<BR>
<P>You owe <EM>7.5</EM><P>
On this rental you earned <EM>3</EM> frequent renter points<P>

 证明重构成功啦...结果还是一样,没变...

 

 

好了,下面到移动方法了,要对getCharge() 实施Move Method

 

Movie 重构前代码:

 

class Movie...
   double getCharge(int daysRented) {
       double result = 0;
       switch (getPriceCode()) {
           case Movie.REGULAR:
               result += 2;
               if (daysRented > 2)
                   result += (daysRented - 2) * 1.5;
               break;
           case Movie.NEW_RELEASE:
               result += daysRented * 3;
               break;
           case Movie.CHILDRENS:
               result += 1.5;
               if (daysRented > 3)
                   result += (daysRented - 3) * 1.5;
               break;
       }
       return result;
   }

 搬移动作很简单。下面是重构后的代码。

 

 

Priice 添加一个方法

 

package com.mkfree.refactoring.shap1;

/**
 * 金额
 * 
 * @author hk
 * 
 *         2013-1-4 下午7:30:53
 */
public abstract class Price {
	abstract int getPriceCode(); // 取得价格代号

	/**
	 * 获取收费
	 * 
	 * @param daysRented
	 * @return
	 */
	double getCharge(int daysRented) {
		double result = 0;
		switch (getPriceCode()) {
		case Movie.REGULAR:
			result += 2;
			if (daysRented > 2)
				result += (daysRented - 2) * 1.5;
			break;
		case Movie.NEW_RELEASE:
			result += daysRented * 3;
			break;
		case Movie.CHILDRENS:
			result += 1.5;
			if (daysRented > 3)
				result += (daysRented - 3) * 1.5;
			break;
		}
		return result;

	}
}

 搬移之后,我就可以开始运用Replace Conditional with Polymorphism了。下面是重构前的代码。
Movie 

 

Movie{.....	
        /**
	 * 获取收费
	 * 
	 * @param daysRented
	 * @return
	 */
	double getCharge(int daysRented) {
		return price.getCharge(daysRented);
	}
}
 

 

 

搬移完成后,再运行代码,测试下是否正常,结果如下,正常...

 

Rental Record for oyhk 
	少林足球	6.0
	大话西游	1.5
Amount owed is 7.5
You earned 3 frequent renter points
------------------------------------------------
<H1>Rentals for <EM>oyhk</EM></ H1><P>
少林足球: 6.0<BR>
大话西游: 1.5<BR>
<P>You owe <EM>7.5</EM><P>
On this rental you earned <EM>3</EM> frequent renter points<P>
 

 

1
4
分享到:
评论
1 楼 飞出四季做的茧 2018-08-03  
只是转移了恶心的switch吧,并没有去除掉

相关推荐

    .java代码重构

    《.java代码重构》 代码重构是软件开发过程中的一个重要环节,它涉及到对现有代码的改进,以提高代码的可读性、可维护性,同时并不改变其外在行为。在Java编程中,代码重构是一种常见的实践,尤其在大型项目中,...

    mysql-connector-java-5.1.22-bin.jar

    MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。标题中的"mysql-...

    java代码重构一到六章

    ### Java代码重构:掌握优化现有代码的艺术 #### 引言 在软件开发的过程中,随着项目的不断演进,代码库往往会出现复杂度增加、可读性和可维护性下降的问题。这时,进行代码重构变得至关重要。重构是指在不改变...

    java代码重构经验总结

    ### Java代码重构经验总结 在软件开发过程中,代码重构是一项重要的技能,它旨在不改变代码外部行为的前提下,改进其内部结构,从而提升代码质量和可维护性。本文将深入探讨Java代码重构的关键点,涵盖重构原则、...

    一本介绍如何将现有的 Java 代码重构为 Kotlin 代码的书籍

    本书《从Java到Kotlin:重构指南》由Duncan McGregor与Nat Pryce共同编写,是一本专为已经熟悉Java编程语言并希望将其现有代码转换为Kotlin的开发者准备的书籍。书中不仅提供了丰富的重构技巧,还包括了实用的示例和...

    java代码重构经验分享

    Java 代码重构经验分享 Java 代码重构是指在不改变外部行为的情况下,修改代码的内部结构,以提高代码的可维护性、可读性和可扩展性。本文总结了 Java 代码重构的经验和技术规范,包括重构要求、重构的工作、代码的...

    重构-第3章 代码的坏味道-读书笔记

    《重构-第3章 代码的坏味道》是软件开发领域的一本经典著作,由Martin Fowler所著。这本书深入探讨了如何识别并消除代码中的不良设计模式,以提高代码质量、可读性和可维护性。在第三章中,作者详细列举了多种"代码...

    重构-改善既有代码的设计.pdf

    重构-改善既有代码的设计.pdf重构-改善既有代码的设计.pdf

    重构-改善既有代码的设计

    《重构-改善既有代码的设计》是一本专注于Java编程领域的经典著作,主要探讨了如何通过重构技术来提升既有代码的质量和可维护性。重构是软件开发过程中一个至关重要的环节,它旨在不改变代码外在行为的前提下,改进...

    javaParser 包 javaparser-core-3.6.16.jar

    JavaParser 是一个强大的开源库,专门用于解析、分析和修改 Java 源代码。这个工具在 Java 开发中尤其有用,因为它允许程序员在运行时或构建过程中动态处理和操作 Java 代码。`javaparser-core-3.6.16.jar` 文件是 ...

    Java 代码重构实例

    Java代码重构是一种优化编程实践,旨在改进代码的结构和可读性,而不改变其外部行为。重构对于提高软件质量和维护性至关重要,尤其是在大型项目中。以下是一些在Java重构中的关键原则和技巧,通过实例来展示如何应用...

    《重构——改善既有代码的设计》第一个案例代码

    2. **简化条件表达式**: 当条件语句过于复杂时,可以使用策略模式或者引入枚举类型来简化。例如,将多层嵌套的if-else结构替换为更清晰的决策表或函数对象。 3. **提取方法**: 如果一个函数或方法包含多个步骤,将...

    阿里巴巴Java代码质量检测插件:p3c-pmd-2.1.1.jar

    阿里巴巴的p3c-pmd-2.1.1.jar是一款专为Java开发者设计的代码质量检测工具,旨在提升代码质量并遵循阿里巴巴内部的编码规范。该插件是基于开源项目PMD进行定制和优化,旨在帮助开发团队在早期阶段发现并修复潜在的...

    代码重构.pdf

    《代码重构》一书由Martin Fowler编写,是软件开发领域中关于代码质量提升的经典之作。书中详细阐述了重构代码的必要性、重构的时机以及如何安全地重构代码。重构指的是在不改变软件外部行为的前提下,改进其内部...

    Java代码重构要求简要汇总.zip

    Java代码重构是软件开发过程中的一个关键环节,它旨在改进代码的结构,提高代码的可读性和可维护性,而不改变其外部行为。这个过程对于长期的项目维护和团队协作至关重要。以下是对“Java代码重构要求简要汇总”文档...

    java 重构改善既有代码的设计.pdf

    Java作为一种广泛使用的编程语言,重构其代码尤为重要,因为Java应用往往生命周期较长,需要不断适应变化的需求。 重构改善代码结构的基本原则包括: 1. 保持代码清晰:确保代码易于理解,每个方法和类都拥有明确...

    重构_改善既有代码的设计 Java

    《重构:改善既有代码的设计》是一本在IT领域广受推崇的经典著作,专注于软件开发中的重构实践,尤其针对Java编程语言。重构是软件开发过程中的一个重要环节,它旨在提升代码的可读性、可维护性和整体质量,而不会...

    java-8-openjdk-amd64

    Java 8 OpenJDK AMD64 是一个针对64位AMD架构的开源Java开发和运行环境,由OpenJDK项目提供。OpenJDK是Java Development Kit(JDK)的一个实现,它遵循GNU General Public License(GPL)条款,旨在提供一个免费、...

Global site tag (gtag.js) - Google Analytics