重构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;}

如您所见,AcceptPayment方法包含多个功能,可以被分解为多个子方法。因此我们

多次使用提取方法重构,结果如下:

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;}

来自为知笔记(Wiz)

时间: 2024-10-15 02:56:42

重构22-Break Method(重构方法)的相关文章

cocos2d-x 源码 :可以循环的CCScrollView (代码已经重构过,附使用方法)

1.准备工作 想弄懂可循环的CCscrollView,首先请阅读cocos2d-x本身的CCscrollView源码http://blog.csdn.net/u011225840/article/details/30033501(我已经添加注释,方便阅读). 2.源码展示 因为源码我想放到git上,所以注释都是用的英文,如果这部分源码有人有问题,请在评论区留言,我会逐一回答. 总体说下,CCCycleScrollview继承了CCscrollView以及CCscrollViewDelegate,

重构第二天:移动方法

原文地址:http://www.refactoring.com/catalog/moveMethod.html 在类A中,当一个方法正在用,或者将要用到的功能和资源大部分存在于另一个类B中,而非A类中时,这时我们要考虑把这个方法移到B类中去. 举一个例子: 1 class Project { 2 Person[] participants; 3 } 4 5 class Person { 6 int id; 7 boolean participate(Project p) { 8 for(int

大话重构连载7:重构是一系列的等量变换

系统重构要求我们对代码的每一步修改,都不能改变软件的外部行为,因此在系统重构中的所有方法,都是一种代码的等量变换.重构的过程,就好像在做数学题,一步一步地进行算式的等量变换.经过一系列等量变换,最终的结果虽然在形式上与原式不一样,但通过计算可以得到与原式完全相同的结果. 这种等量变换对于重构来说非常重要,它使得我们进行重构以后,程序还是那些程序,代码还是那些代码.但是,等量变换不等于原地踏步.正如矩阵通过等量变换可以得到方程组的解,微积分可以通过等量变换计算最终的结果,重构通过等量变换,在保证代

代码重构(二):类重构规则(Swift版)

在上篇博客<代码重构(一):函数重构规则(Swift版)>中,详细的介绍了函数的重构规则,其中主要包括:Extract Method, Inline Method, Inline Temp, Replace Temp with Query, Introduce Explaining Variable, Split Temporary Variable, Remove Assignments to Parameters, Replace Method with Method Object等.关于

说说什么是重构(一)重构的起点

序 最近,在看一本叫做<重构:改善既有代码的设计>的书,虽然是电子版的,但是依然不影响看书的积极性.可以说,老早之前就知道什么是重构了,但是总感觉那会的重构就是把整个项目都推翻重来一遍,或许是改变架构,或许是改变设计思路,也或许是业务的改变等等.但是,看完这本书之后,你就不会那么看了. 背景 其实,这本书早就已经下载下来了,一直没有时间到现在看来也的确是一大损失.我觉得,这本书最好是在有过实际经验之后,再看的话,会更加深有体会. 什么是重构 那么,什么才是真正的重构呢?从这本书里可以找到答案.

代码重构(一):函数重构规则

重构是项目做到 一定程度后必然要做的事情.代码重构,可以改善既有的代码设计,增强既有工程的可扩充.可维护性.随着项目需求的不断迭代,需求的不断更新,我们在项目中 所写的代码也在时时刻刻的在变化之中.在一次新的需求中,你添加了某些功能模块,但这些功能模块有可能在下一次需求中不在适用.或者你因为需求迭代与变 更,使你原有的方法或者类变得臃肿,以及各个模块或者层次之间耦合度增加.此时,你要考虑重构了. 重构,在<重构,改善既有代码的设计>这本经典的书中给出了定义,大概就是:在不改变代码对外的表现的情

Factory Method 工厂方法模式

Factory method工厂方法模式是一种实现了“工厂”概念的面向对象设计模式.就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题.工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类.工厂方法让类的实例化推迟到子类中进行.” 创建一个对象常常需要复杂的过程,所以不适合包含在一个复合对象中.创建对象可能会导致大量的重复代码,可能会需要复合对象访问不到的信息,也可能提供不了足够级别的抽象,还可能并不是复合对象概念的一部分.工厂方法模式通

说说什么是重构(三)重构的结果

序 说到重构,大家自然而然会想到很多,不管是怎么开始的,也不管是怎么个重构的过程,到最后都会是两种结果,其一是,重构的很成功,冗余代码得到了简化,代码的可读性.可维护性也有了很大的提高.其二嘛,都能想的到,就是重构失败,这个失败的原因可能有很多. 背景 前两篇文章中,分别说明了重构的开始和重构的过程,至于重构的结果嘛,不用我说,大家也都可以想到有两种情况,成功和失败嘛.但是,为什么这里还是要说说结果呢,是因为,对于我来说,我认为,重构的结果固然重要,但是,在重构过程中,你学到的东西要比结果更重要

重构摘要12_大型重构

<重构-改善既有代码的设计>Martin Fowler 摘要:   第十二章 大型重构 特点 依据须要安排自己的工作,仅仅在须要加入新功能或修补错误时才进行重构. 进行大规模重构时,有必要为整个开发团队建立共识.意识到:重构正在进行,每一个人都应该对应地安排自己的行动. Tease Apart Inheritance 梳理并分解继承体系 某个继承体系同一时候承担两项责任 建立两个继承体系,并通过托付关系让当中一个能够调用还有一个. 假设继承体系中的某一特定层级上的全部类,其子类名称都以同样的形

(转)Java.lang.reflect.Method invoke方法 实例

背景:今天在项目中用到Method 的invoke方法,但是并不理解,查完才知道,原来如此! import java.lang.reflect.Method; /** * Java.lang.reflect.Method invoke方法 实例 * 程序中配置文件中有对实体对象的get,set方法的描述,通过应用invoke()方法调用实体对象的method方法 return * m_oGetter.invoke(oSrc, null); oSrc为实体对象,Method m_oGetter *