- 浏览: 230337 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
飞出四季做的茧:
只是转移了恶心的switch吧,并没有去除掉
java 代码重构-第一章(使用策略模式,把恶心的switch代码去掉...) 一 -
niqingyang:
https://www.cnblogs.com/xueduan ...
百度搜索url编码解密(url encode decode) -
niqingyang:
function urldecode(str, charset ...
百度搜索url编码解密(url encode decode) -
ttdeye:
private Jedis getJedis(){if(jed ...
spring 结合 Redis 例子,简单入门例子 -
adair_java:
最近手机baidu,搜索关键字编码好像加密了比如这个:http ...
各搜索引擎referer关键字,编码
上一篇文章: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>
发表评论
-
springMvc 注解配置例子(hello world)
2013-02-21 10:53 2757oyhk 学习笔记 用spring mvc 已经有一段时间 ... -
Spring Data MongoDB 去掉_class属性字段
2013-02-08 10:03 12637oyhk 学习笔记 Spring Dat ... -
springMvc 三种接收客户端参数方法
2013-02-04 12:23 2507oyhk学习笔记springMvc 三种接收客户端参数方法 ... -
spring MongoDB 集成(分页)
2013-01-26 08:42 15162oyhk 学习笔记 spring MongoDB 集成(分 ... -
spring MongoDB 集成crud操作(简单封装)
2013-01-23 08:35 7627oyhk 学习笔记 这两 ... -
elasticsearch结合spring springmvc jest 使用做成WEB架构
2013-01-17 12:16 5244oyhk 学习笔记 上一篇文章,说到了先利用jest ju ... -
elasticsearch RESTful搜索引擎-(java jest 使用[入门])
2013-01-14 10:01 21187oyhk学习笔记 elasticsearch简称ES ... -
eclispe freemarker ide 插件安装
2013-01-12 11:44 2299oyhk学习笔记 由于本网站(http://blog. ... -
elasticsearch RESTful搜索引擎-安装
2013-01-11 09:53 1811oyhk 学习笔记... 1.首先下载e ... -
elasticsearch RESTful搜索引擎-简介
2013-01-10 11:31 1683oyhk学习笔记 搜索了一些资料...关于elasti ... -
java把html标签字符转普通字符(反转换成html标签)
2013-01-09 08:28 13531oyhk 学习笔记 下面是java把html标签字符转 ... -
spring 结合 Redis 例子,简单入门例子
2013-01-07 09:25 11287oyhk 学习笔记 好了费话不多说了,介绍下sprin ... -
java 代码重构-第一章(使用策略模式,把恶心的switch代码去掉...) 二
2013-01-07 09:13 2977上一篇文章:java 代码重构-第一章(使用策略模式,把 ... -
java 代码重构-第一章(终于…我们来到继承(Inheritance))
2013-01-05 09:18 1728上一篇文章:java 代码重构-第一章(运用多态(Pol ... -
java 代码重构-第一章(运用多态(Polymorphism)取代与价格相关的条件逻辑)
2013-01-04 18:40 2043上一篇文章:java 代码重 ... -
java 代码重构-第一章(提炼代码)
2013-01-04 01:39 1095上篇文章说了,类做回自己的事 上一篇文章:jav ... -
java 代码重构-第一章(去除临时变量)
2013-01-04 01:33 1191上一篇文章:java 代码重 ... -
java 代码重构-第一章(类自己该做自己的事)
2012-12-30 22:19 1761重构小提示:重构技术系以微小的步伐修改程序。如果你犯下错 ... -
java 代码重构-第一章(分解并重组statement())
2012-12-28 11:34 1294上一篇文章:java 代码重构-第一章(起点) 下一篇 ... -
java 代码重构-第一章(起点)
2012-12-27 12:57 1541oyhk 学习笔记 对于重构,大家应该都一些认识了吧. ...
相关推荐
《.java代码重构》 代码重构是软件开发过程中的一个重要环节,它涉及到对现有代码的改进,以提高代码的可读性、可维护性,同时并不改变其外在行为。在Java编程中,代码重构是一种常见的实践,尤其在大型项目中,...
MySQL Connector/J是MySQL数据库与Java应用程序之间的重要桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够通过编写Java代码来访问和操作MySQL数据库。标题中的"mysql-...
### Java代码重构:掌握优化现有代码的艺术 #### 引言 在软件开发的过程中,随着项目的不断演进,代码库往往会出现复杂度增加、可读性和可维护性下降的问题。这时,进行代码重构变得至关重要。重构是指在不改变...
### Java代码重构经验总结 在软件开发过程中,代码重构是一项重要的技能,它旨在不改变代码外部行为的前提下,改进其内部结构,从而提升代码质量和可维护性。本文将深入探讨Java代码重构的关键点,涵盖重构原则、...
本书《从Java到Kotlin:重构指南》由Duncan McGregor与Nat Pryce共同编写,是一本专为已经熟悉Java编程语言并希望将其现有代码转换为Kotlin的开发者准备的书籍。书中不仅提供了丰富的重构技巧,还包括了实用的示例和...
Java 代码重构经验分享 Java 代码重构是指在不改变外部行为的情况下,修改代码的内部结构,以提高代码的可维护性、可读性和可扩展性。本文总结了 Java 代码重构的经验和技术规范,包括重构要求、重构的工作、代码的...
《重构-第3章 代码的坏味道》是软件开发领域的一本经典著作,由Martin Fowler所著。这本书深入探讨了如何识别并消除代码中的不良设计模式,以提高代码质量、可读性和可维护性。在第三章中,作者详细列举了多种"代码...
重构-改善既有代码的设计.pdf重构-改善既有代码的设计.pdf
《重构-改善既有代码的设计》是一本专注于Java编程领域的经典著作,主要探讨了如何通过重构技术来提升既有代码的质量和可维护性。重构是软件开发过程中一个至关重要的环节,它旨在不改变代码外在行为的前提下,改进...
JavaParser 是一个强大的开源库,专门用于解析、分析和修改 Java 源代码。这个工具在 Java 开发中尤其有用,因为它允许程序员在运行时或构建过程中动态处理和操作 Java 代码。`javaparser-core-3.6.16.jar` 文件是 ...
Java代码重构是一种优化编程实践,旨在改进代码的结构和可读性,而不改变其外部行为。重构对于提高软件质量和维护性至关重要,尤其是在大型项目中。以下是一些在Java重构中的关键原则和技巧,通过实例来展示如何应用...
2. **简化条件表达式**: 当条件语句过于复杂时,可以使用策略模式或者引入枚举类型来简化。例如,将多层嵌套的if-else结构替换为更清晰的决策表或函数对象。 3. **提取方法**: 如果一个函数或方法包含多个步骤,将...
阿里巴巴的p3c-pmd-2.1.1.jar是一款专为Java开发者设计的代码质量检测工具,旨在提升代码质量并遵循阿里巴巴内部的编码规范。该插件是基于开源项目PMD进行定制和优化,旨在帮助开发团队在早期阶段发现并修复潜在的...
《代码重构》一书由Martin Fowler编写,是软件开发领域中关于代码质量提升的经典之作。书中详细阐述了重构代码的必要性、重构的时机以及如何安全地重构代码。重构指的是在不改变软件外部行为的前提下,改进其内部...
Java代码重构是软件开发过程中的一个关键环节,它旨在改进代码的结构,提高代码的可读性和可维护性,而不改变其外部行为。这个过程对于长期的项目维护和团队协作至关重要。以下是对“Java代码重构要求简要汇总”文档...
Java作为一种广泛使用的编程语言,重构其代码尤为重要,因为Java应用往往生命周期较长,需要不断适应变化的需求。 重构改善代码结构的基本原则包括: 1. 保持代码清晰:确保代码易于理解,每个方法和类都拥有明确...
《重构:改善既有代码的设计》是一本在IT领域广受推崇的经典著作,专注于软件开发中的重构实践,尤其针对Java编程语言。重构是软件开发过程中的一个重要环节,它旨在提升代码的可读性、可维护性和整体质量,而不会...
Java 8 OpenJDK AMD64 是一个针对64位AMD架构的开源Java开发和运行环境,由OpenJDK项目提供。OpenJDK是Java Development Kit(JDK)的一个实现,它遵循GNU General Public License(GPL)条款,旨在提供一个免费、...