重构22-Break Method(重构方法)
这个重构是一种元重构(meta-refactoring),它只是不停地使用提取方法重构,直到将一个大的方法分解成若干个小的方法。下面的例子有点做作,AcceptPayment方法没有丰富的功能。因此为了使其更接近真实场景,我们只能假设该方法中包含了其他大量的辅助代码。 下面的AcceptPayment方法可以被划分为多个单独的方法。
public class CashRegister {
public CashRegister() {
Tax = 0.06d;
}
private Double Tax;
public void AcceptPayment(Customer customer, List<Product> products,Double payment) {
Double subTotal = 0d;
for(Product product : products) {
subTotal += product.Price;
}
for(Product product : products) {
subTotal -= product.AvailableDiscounts;
}
Double grandTotal = subTotal * Tax;
customer.DeductFromAccountBalance(grandTotal);
}
}
public class Customer {
public void DeductFromAccountBalance(Double amount) {
// deduct from balance
}
}
public class Product {
public Double Price;
public Double AvailableDiscounts;
}
public class CashRegister {
public CashRegister() {
Tax = 0.06d;
}
private Double Tax;
private List<Product> Products;
public void AcceptPayment(Customer customer, List<Product> products, Double payment) {
Double subTotal = CalculateSubtotal();
subTotal = SubtractDiscounts(subTotal);
Double grandTotal = AddTax(subTotal);
SubtractFromCustomerBalance(customer, grandTotal);
}
private void SubtractFromCustomerBalance(Customer customer, Double grandTotal) {
customer.DeductFromAccountBalance(grandTotal);
}
private Double AddTax(Double subTotal) {
return subTotal * Tax;
}
private Double SubtractDiscounts(Double subTotal) {
for(Product product : Products){
subTotal -= product.AvailableDiscounts;
}
return subTotal;
}
private Double CalculateSubtotal() {
Double subTotal = 0d;
for(Product product : Products){
subTotal += product.Price;
}
return subTotal;
}
}
public class Customer {
public void DeductFromAccountBalance(Double amount) {
// deduct from balance
}
}
public class Product {
public Double Price;
public Double AvailableDiscounts;
}
重构22-Break Method(重构方法)的更多相关文章
- 重构3-Pull Up Method(方法上移)
上移方法(Pull Up Method)重构是将方法向继承链上层迁移的过程.用于一个方法被多个实现者使用时 public abstract class Vehicle { // other metho ...
- 重构4-Push Down Method(方法下移)
我们介绍了将方法迁移到基类以供多个子类使用的上移方法重构,今天我们来看看相反的操作.重构前的代码如下: public abstract class Animal { public void Bark( ...
- 《重构》的读书笔记–方法列表
第5章 重构列表 5.1 重构的记录格式103 5.2 寻找引用点105 5.3 这些重构手法有多成熟106 第6章 重新组织函数 6.1 (P110)Extract Method(提炼函数) 6.2 ...
- .NET重构—单元测试的代码重构
阅读目录: 1.开篇介绍 2.单元测试.测试用例代码重复问题(大量使用重复的Mock对象及测试数据) 2.1.单元测试的继承体系(利用超类来减少Mock对象的使用) 2.1.1.公用的MOCK对象: ...
- Factory Method 工厂方法模式
Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象 ...
- (转)Java.lang.reflect.Method invoke方法 实例
背景:今天在项目中用到Method 的invoke方法,但是并不理解,查完才知道,原来如此! import java.lang.reflect.Method; /** * Java.lang.refl ...
- java.lang.reflect.Method.getAnnotation()方法示例【通过反射获取到方法对象再获取方法对象上的注解信息】
转: java.lang.reflect.Method.getAnnotation()方法示例 java.lang.reflect.Method.getAnnotation(Class <T&g ...
- java.lang.reflect.Method.getAnnotation()方法示例
转: java.lang.reflect.Method.getAnnotation()方法示例 作者: 初生不惑 Java技术QQ群:227270512 / Linux QQ群:479429477 ...
- 错误:Attempt to resolve method: [XXX方法] on undefined variable or class name: [XXX类]的解决(IDEA打包jar问题)
问题: 使用JMeter调用jar包的时候,报错误信息Typed variable declaration : Attempt to resolve method:[XXX方法] on undefin ...
- 重构第22天 分解方法(Break Method)
理解:如果一个功能,里面比较复杂,代码量比较多,我们就可以把这个功能分解成多个小的method,每个方法实现该功能的一个小小的部分,并且方法命名成容易理解,和方法内容相关的名称,更有助于维护和可读性提 ...
随机推荐
- yii缓存设置使用
'filecache'=>array( 'class'=>'system.caching.CFileCache', 'directoryLevel'=>'3',), //在main. ...
- struts2 下载时报java.lang.IllegalStateException
-----------------------------------------struts2 下载时报java.lang.IllegalStateException---------------- ...
- kafka分布式消息队列 — 基本概念介绍
[http://www.inter12.org/archives/818] 这个应该算是之前比较火热的词了,一直没时间抽出来看看.一个新东西出来,肯定是为了解决某些问题,不然不会有它的市场.先简单看下 ...
- js 原型的内存分析
使用构造器的弊端:http://www.cnblogs.com/a757956132/p/5258897.html 示例 将行为设置为全局的行为,如果将所有的方法都设计为全局函数的时候, 这个函数就可 ...
- Mysql的存储过程(以Mysql为例进行讲解)
我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储 在数据库中,用户通过指定存 ...
- 10 个基于 jQuery 的 Web 交互插件推荐
英文原文:10 jQuery for Web Interaction Plugins “用户交互”在现代的 Web 设计中占据了很大比例,这是互联网产品不可或缺的关键,对 Web 设计师也提出了更高的 ...
- uoj #9. 【UTR #1】vfk的数据 水题
#9. [UTR #1]vfk的数据 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/9 Description ...
- .NET程序性能的基本要领
前几天在老赵的博客上看到,Bill Chiles (Roslyn 编译器的Program Manager)写了一篇文章叫做<Essential Performance Facts and .NE ...
- 【项目实例】使用C#开发纽曼USB来电通来电弹屏客户端小结
基于CRM客户和咨询者的普遍需求,老板决定在CRM系统上加入来电弹屏功能,所谓来电弹屏,就是当一个电话打入时,电脑会弹出该电话号码对应的客户.联系人或者供应商详细信息,如果是新号码,则添加一个新的客户 ...
- OS_TASK.C
/*************************************************************************************************** ...