- 浏览: 232006 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
-
飞出四季做的茧:
只是转移了恶心的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 代码重构-第一章(类自己该做自己的事)
下一篇文章:java 代码重构-第一章(去除临时变量)
提炼「常客积点计算」代码
下一步要对「常客积点计算」做类似处理。点数的计算视影片种类而有不同,不过不像收费规则有那么多变化。看来似乎有理由把积点计算责任放在Rental class 身上。首先我们需要针对「常客积点计算」这部分代码(以下粗体部分)运用 Extract Method 重构准则。
再一次我又要寻找局部变量。这里再一次用到了each ,而它可以被当作参数传入新函数中。另一个临时变量是frequentRenterPoints。本例中的它在被使用之前已经先有初值,但提炼出来的函数并没有读取该值,所以我们不需要将它当作参数传进去,只需对它执行「附添赋值动作」(appending assignment,operator+=)就行了。
我完成了函数的提炼,重新编译并测试;然后做一次搬移,再编译、再测试。重构时最好小步前进,如此一来犯错的几率最小。
好,下面来代码了 Customer
/** * 通计清单 * * @return */ public String statement() { double totalAmount = 0;// 合计 int frequentRentePoints = 0; Enumerationenu_rentals = rentals.elements(); String result = "Rental Record for " + this.getName() + " \n"; while (enu_rentals.hasMoreElements()) { double thisAmount = 0; Rental each = enu_rentals.nextElement(); thisAmount = each.getCharge();// 计算一笔租片费 frequentRentePoints++; if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) && each.getDaysRented() > 1) { frequentRentePoints++; } result += "\t" + each.getMovie().getTitle() + "\t" + String.valueOf(thisAmount) + "\n"; totalAmount += thisAmount; } result += "Amount owed is " + String.valueOf(totalAmount) + "\n"; result += "You earned " + String.valueOf(frequentRentePoints) + " frequent renter points"; return result; }
看到段代码吗?
frequentRentePoints++; if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) && each.getDaysRented() > 1) { frequentRentePoints++; }
我们要把这段代码提炼出去,好,那么我们的代码变成这样
首先我们在Rental里添加方法
package com.mkfree.refactoring.shap1; /** * 租凭 * * @author hk * * 2012-12-25 下午10:57:00 */ public class Rental { /** * * @return */ int getFrequentRenterPoints() { if ((getMovie().getPriceCode() == Movie.NEW_RELEASE) && getDaysRented() > 1) return 2; else return 1; } }
然后在customer 里 Statment方法调用,看下面代码
/** * 通计清单 * * @return */ public String statement() { double totalAmount = 0;// 合计 int frequentRentePoints = 0; Enumerationenu_rentals = rentals.elements(); String result = "Rental Record for " + this.getName() + " \n"; while (enu_rentals.hasMoreElements()) { double thisAmount = 0; Rental each = enu_rentals.nextElement(); thisAmount = each.getCharge();// 计算一笔租片费 /* * 刚刚把代码提炼,现在注释起来 frequentRentePoints++; * * if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) && * each.getDaysRented() > 1) { frequentRentePoints++; } */ frequentRentePoints += each.getFrequentRenterPoints(); result += "\t" + each.getMovie().getTitle() + "\t" + String.valueOf(thisAmount) + "\n"; totalAmount += thisAmount; } result += "Amount owed is " + String.valueOf(totalAmount) + "\n"; result += "You earned " + String.valueOf(frequentRentePoints) + " frequent renter points"; return result; }
我利用重构前后的UML(Unified Modeling Language ,统一建模语言)图形(图1.4 至图1.7〕总结刚才所做的修改。
修改前的uml
修改后的um
l
那么最后的代码
Customer
package com.mkfree.refactoring.shap1; import java.util.Enumeration; import java.util.Vector; /** * 顾客 * * @author hk * * 2012-12-25 下午10:59:03 */ public class Customer { private String name; private Vectorrentals = new Vector<>(); public Customer(String name) { this.name = name; } /** * 添加 * * @param rental */ public void addRentals(Rental rental) { rentals.add(rental); } public String getName() { return name; } /** * 通计清单 * * @return */ public String statement() { double totalAmount = 0;// 合计 int frequentRentePoints = 0; Enumerationenu_rentals = rentals.elements(); String result = "Rental Record for " + this.getName() + " \n"; while (enu_rentals.hasMoreElements()) { double thisAmount = 0; Rental each = enu_rentals.nextElement(); thisAmount = each.getCharge();// 计算一笔租片费 /* * 刚刚把代码提炼,现在注释起来 frequentRentePoints++; * * if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) && * each.getDaysRented() > 1) { frequentRentePoints++; } */ frequentRentePoints += each.getFrequentRenterPoints(); result += "\t" + each.getMovie().getTitle() + "\t" + String.valueOf(thisAmount) + "\n"; totalAmount += thisAmount; } result += "Amount owed is " + String.valueOf(totalAmount) + "\n"; result += "You earned " + String.valueOf(frequentRentePoints) + " frequent renter points"; return result; } }
Rental 类
package com.mkfree.refactoring.shap1; /** * 租凭 * * @author hk * * 2012-12-25 下午10:57:00 */ 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; } double getCharge() { double result = 0; switch (getMovie().getPriceCode()) { case Movie.REGULAR: result += 2; if (getDaysRented() > 2) result += (getDaysRented() - 2) * 1.5; break; case Movie.NEW_RELEASE: result += getDaysRented() * 3; break; case Movie.CHILDRENS: result += 1.5; if (getDaysRented() > 3) result += (getDaysRented() - 3) * 1.5; break; } return result; } /** * * @return */ int getFrequentRenterPoints() { if ((getMovie().getPriceCode() == Movie.NEW_RELEASE) && getDaysRented() > 1) return 2; else return 1; } }
Movie
package com.mkfree.refactoring.shap1; /** * 电影类 * @author hk * * 2012-12-25 下午10:55:14 */ 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; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public int getPriceCode() { return priceCode; } public void setPriceCode(int priceCode) { this.priceCode = priceCode; } }
最后是调用的Client
package com.mkfree.refactoring.shap1; import org.junit.Test; public class Client { @Test public void testStatement() { Movie movie1 = new Movie(); movie1.setTitle("少林足球"); movie1.setPriceCode(1); Rental rental1 = new Rental(movie1, 2); Movie movie2 = new Movie(); movie2.setTitle("大话西游"); movie2.setPriceCode(2); Rental rental2 = new Rental(movie2, 3); Customer customer = new Customer("oyhk"); customer.addRentals(rental1); customer.addRentals(rental2); String statement = customer.statement(); System.out.println(statement); } }
好了,代码提炼完了...你们有什么感觉...
发表评论
-
springMvc 注解配置例子(hello world)
2013-02-21 10:53 2800oyhk 学习笔记 用spring mvc 已经有一段时间 ... -
Spring Data MongoDB 去掉_class属性字段
2013-02-08 10:03 12691oyhk 学习笔记 Spring Dat ... -
springMvc 三种接收客户端参数方法
2013-02-04 12:23 2539oyhk学习笔记springMvc 三种接收客户端参数方法 ... -
spring MongoDB 集成(分页)
2013-01-26 08:42 15242oyhk 学习笔记 spring MongoDB 集成(分 ... -
spring MongoDB 集成crud操作(简单封装)
2013-01-23 08:35 7657oyhk 学习笔记 这两 ... -
elasticsearch结合spring springmvc jest 使用做成WEB架构
2013-01-17 12:16 5287oyhk 学习笔记 上一篇文章,说到了先利用jest ju ... -
elasticsearch RESTful搜索引擎-(java jest 使用[入门])
2013-01-14 10:01 21225oyhk学习笔记 elasticsearch简称ES ... -
eclispe freemarker ide 插件安装
2013-01-12 11:44 2327oyhk学习笔记 由于本网站(http://blog. ... -
elasticsearch RESTful搜索引擎-安装
2013-01-11 09:53 1846oyhk 学习笔记... 1.首先下载e ... -
elasticsearch RESTful搜索引擎-简介
2013-01-10 11:31 1724oyhk学习笔记 搜索了一些资料...关于elasti ... -
java把html标签字符转普通字符(反转换成html标签)
2013-01-09 08:28 13578oyhk 学习笔记 下面是java把html标签字符转 ... -
spring 结合 Redis 例子,简单入门例子
2013-01-07 09:25 11313oyhk 学习笔记 好了费话不多说了,介绍下sprin ... -
java 代码重构-第一章(使用策略模式,把恶心的switch代码去掉...) 二
2013-01-07 09:13 3004上一篇文章:java 代码重构-第一章(使用策略模式,把 ... -
java 代码重构-第一章(使用策略模式,把恶心的switch代码去掉...) 一
2013-01-06 09:49 5777上一篇文章:java 代码重构-第一章(终于…我们来到继 ... -
java 代码重构-第一章(终于…我们来到继承(Inheritance))
2013-01-05 09:18 1755上一篇文章:java 代码重构-第一章(运用多态(Pol ... -
java 代码重构-第一章(运用多态(Polymorphism)取代与价格相关的条件逻辑)
2013-01-04 18:40 2068上一篇文章:java 代码重 ... -
java 代码重构-第一章(去除临时变量)
2013-01-04 01:33 1240上一篇文章:java 代码重 ... -
java 代码重构-第一章(类自己该做自己的事)
2012-12-30 22:19 1800重构小提示:重构技术系以微小的步伐修改程序。如果你犯下错 ... -
java 代码重构-第一章(分解并重组statement())
2012-12-28 11:34 1332上一篇文章:java 代码重构-第一章(起点) 下一篇 ... -
java 代码重构-第一章(起点)
2012-12-27 12:57 1601oyhk 学习笔记 对于重构,大家应该都一些认识了吧. ...
相关推荐
第1章 重构,第一个案例 1 1.1 起点 1 1.2 重构的第一步 7 1.3 分解并重组statement() 8 1.4 运用多态取代与价格相关的条件逻辑 34 1.5 结语 52 第2章 重构原则 53 2.1 何谓重构 53 2.2 为何重构 ...
第1章 重构,第一个案例 1.1 起点 1.2 重构的第一步 1.3 分解并重组Statemen 1.4 运用多态取代与价格相关的条件逻辑 1.5 结语 第2章 重构原则 2.1 何谓重构 2.2 为何重构 2.3 何时重构 2.4 怎么对经理说 2.5 重构的...
#### 第2章:代码重构的方法 **2.1 重构的基本概念** - **提炼函数**:将函数的一部分代码抽取出来,形成一个新的独立函数。 - **搬移字段**:将一个类中的字段移动到另一个类中。 - **封装类**:为类中的字段和...
#### 第一章:简介 **代码重构与性能优化概述** - **代码重构**:是指在不改变软件外部行为的前提下,对内部结构进行调整,以提高代码质量的过程。这通常涉及到对代码结构的改善、减少冗余、提高可读性和可维护性...
根据提供的文件信息,我们可以从中提炼出与Java开发相关的多个知识点,包括但不限于单元测试的重要性、单元测试的设计原则以及如何提升测试的可读性、可维护性和可靠性等。下面将对这些内容进行详细的阐述。 ### 一...
以下是根据课件内容提炼的一些核心知识点: 1. **软件体系结构定义**:软件体系结构是软件系统的高级构造,它是软件系统的主要组成部分和它们之间的关系,定义了系统的基本结构和交互方式。 2. **基本元素**:软件...