- 浏览: 227760 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
飞出四季做的茧:
只是转移了恶心的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 2703oyhk 学习笔记 用spring mvc 已经有一段时间 ... -
Spring Data MongoDB 去掉_class属性字段
2013-02-08 10:03 12545oyhk 学习笔记 Spring Dat ... -
springMvc 三种接收客户端参数方法
2013-02-04 12:23 2460oyhk学习笔记springMvc 三种接收客户端参数方法 ... -
spring MongoDB 集成(分页)
2013-01-26 08:42 15074oyhk 学习笔记 spring MongoDB 集成(分 ... -
spring MongoDB 集成crud操作(简单封装)
2013-01-23 08:35 7565oyhk 学习笔记 这两 ... -
elasticsearch结合spring springmvc jest 使用做成WEB架构
2013-01-17 12:16 5189oyhk 学习笔记 上一篇文章,说到了先利用jest ju ... -
elasticsearch RESTful搜索引擎-(java jest 使用[入门])
2013-01-14 10:01 21121oyhk学习笔记 elasticsearch简称ES ... -
eclispe freemarker ide 插件安装
2013-01-12 11:44 2258oyhk学习笔记 由于本网站(http://blog. ... -
elasticsearch RESTful搜索引擎-安装
2013-01-11 09:53 1757oyhk 学习笔记... 1.首先下载e ... -
elasticsearch RESTful搜索引擎-简介
2013-01-10 11:31 1631oyhk学习笔记 搜索了一些资料...关于elasti ... -
java把html标签字符转普通字符(反转换成html标签)
2013-01-09 08:28 13472oyhk 学习笔记 下面是java把html标签字符转 ... -
spring 结合 Redis 例子,简单入门例子
2013-01-07 09:25 11237oyhk 学习笔记 好了费话不多说了,介绍下sprin ... -
java 代码重构-第一章(使用策略模式,把恶心的switch代码去掉...) 二
2013-01-07 09:13 2931上一篇文章:java 代码重构-第一章(使用策略模式,把 ... -
java 代码重构-第一章(终于…我们来到继承(Inheritance))
2013-01-05 09:18 1672上一篇文章:java 代码重构-第一章(运用多态(Pol ... -
java 代码重构-第一章(运用多态(Polymorphism)取代与价格相关的条件逻辑)
2013-01-04 18:40 1987上一篇文章:java 代码重 ... -
java 代码重构-第一章(提炼代码)
2013-01-04 01:39 1010上篇文章说了,类做回自己的事 上一篇文章:jav ... -
java 代码重构-第一章(去除临时变量)
2013-01-04 01:33 1100上一篇文章:java 代码重 ... -
java 代码重构-第一章(类自己该做自己的事)
2012-12-30 22:19 1673重构小提示:重构技术系以微小的步伐修改程序。如果你犯下错 ... -
java 代码重构-第一章(分解并重组statement())
2012-12-28 11:34 1204上一篇文章:java 代码重构-第一章(起点) 下一篇 ... -
java 代码重构-第一章(起点)
2012-12-27 12:57 1460oyhk 学习笔记 对于重构,大家应该都一些认识了吧. ...
相关推荐
JAVA 代码重构 JAVA 代码重构 JAVA 代码重构 JAVA 代码重构 JAVA 代码重构
关于如何重构java代码的。看过好一定很有感触。
NULL 博文链接:https://hongmingchun.iteye.com/blog/1606097
java代码重构经验分享
重构-改善既有代码的设计--高清版.pdf
重构-改善既有代码的设计(高清版)pdf 重构-改善既有代码的设计(高清版)pdf 重构-改善既有代码的设计(高清版)pdf 重构-改善既有代码的设计(高清版)pdf
讲述了java代码的重构总结 规范代码,有必要好好学习
Java 代码 重构 实例 指南 ,欢迎下载
java开发经典书籍,重构--改善既有代码的设计_中文版 java开发经典书籍,重构--改善既有代码的设计_中文版 java开发经典书籍,重构--改善既有代码的设计_中文版
重构技巧: 书中介绍了一系列将 Java 代码重构为 Kotlin 的技巧和方法,包括语法转换、代码结构调整、使用 Kotlin 的特性等方面。 实用示例: 书中通过丰富的实例和案例来演示如何进行代码重构,包括常见的 Java ...
java代码重构
Java设计模式+代码重构等PDF合集,Java设计模式+代码重构等PDF合集,Java设计模式+代码重构等PDF合集,Java设计模式+代码重构等PDF合集
绝对真实的资料!重构-.改善既有代码的设计.pdf
Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例 Java代码重构示例
java代码重构以前忽视了,最近在看 字字珠玑,相见恨晚
本代码是《重构 改善既有代码的设计》书中的第一个案例,用于影片出租点用的程序,对于原始代码的几次重构
重构是迅速发现并修复有问题的代码的一种高效的方式。在《代码重构(c # & asp.net版)》中首次提供了在c#和asp.net中进行重构的专业方法,您将学习如何运用重构技术管理和修改代码
重构-改善既有代码的设计.pdf重构-改善既有代码的设计.pdf重构-改善既有代码的设计.pdf重构-改善既有代码的设计.pdf
使用设计模式重构代码.pdf
用“策略模式”是一种好策略 第八章............反射——程序员的快乐! 第九章............会修电脑不会修收音机?——聊设计模式原则 第十章............三层架构,分层开发 ...