重构13-Extract Method Object(提取方法对象)
2016-08-19 09:31
381 查看
重构来自于Martin Fowler的重构目录。你可以在这里找到包含简介的原始文章。
在我看来,这是一个比较罕见的重构,但有时却终能派上用场。当你尝试进行提取方法的重构时,需要引入大量的方法。在一个方法中使用众多的本地变量有时会使代码变得丑陋。因此最好使用提取方法对象这个重构,将执行任务的逻辑分开
我们通过构造函数,将返回计算结果的类的引用传递给包含多个计算方法的新建对象,或者向方法对象的构造函数中单独传递各个参数。如下面的代码:
来自为知笔记(Wiz)
在我看来,这是一个比较罕见的重构,但有时却终能派上用场。当你尝试进行提取方法的重构时,需要引入大量的方法。在一个方法中使用众多的本地变量有时会使代码变得丑陋。因此最好使用提取方法对象这个重构,将执行任务的逻辑分开
public class OrderLineItem { public Double Price; } public class Order { private List<OrderLineItem> OrderLineItems; private List<Double> Discounts; private Double Tax; public Double Calculate() { Double subTotal = 0d; // Total up line items for(OrderLineItem lineItem : OrderLineItems) { subTotal += lineItem.Price; } // Subtract Discounts for(Double discount : Discounts) subTotal -= discount; // Calculate Tax Double tax = subTotal * Tax; // Calculate GrandTotal Double grandTotal = subTotal + tax; return grandTotal; } }
我们通过构造函数,将返回计算结果的类的引用传递给包含多个计算方法的新建对象,或者向方法对象的构造函数中单独传递各个参数。如下面的代码:
public class OrderLineItem{ public Double Price; } public class Order { public List<OrderLineItem> OrderLineItems; public List<Double> Discounts; public Double Tax; public Double Calculate() { return new OrderCalculator(this).Calculate(); } } public class OrderCalculator { private Double SubTotal; private List<OrderLineItem> OrderLineItems; private List<Double> Discounts; private Double Tax; public OrderCalculator(Order order) { OrderLineItems = order.OrderLineItems; Discounts = order.Discounts; Tax = order.Tax; } public Double Calculate() { CalculateSubTotal(); SubtractDiscounts(); CalculateTax(); return SubTotal; } private void CalculateSubTotal() { // Total up line items for(OrderLineItem lineItem : OrderLineItems) SubTotal += lineItem.Price; } private void SubtractDiscounts() { // Subtract Discounts for(Double discount : Discounts) SubTotal -= discount; } private void CalculateTax() { // Calculate Tax SubTotal += SubTotal * Tax; } }
来自为知笔记(Wiz)
相关文章推荐
- Xcode_7 iOS_9 获取设备型号 Objective-C (5)
- CCLuaObjcBridge - Lua 与 Objective-C 互操作的简单解决方案
- Distributed Objects
- Angular中使用$watch监听object属性值的变化
- iOS复杂动画之抽丝剥茧(Objective-C & Swift)
- 【CV论文阅读】+【搬运工】LocNet: Improving Localization Accuracy for Object Detection + A Theoretical analysis of feature pooling in Visual Recognition
- Xcode_7 iOS_9 工具栏_导航栏 Objective-C (4)
- IO流反序列化(objectInputStream)和序列化(ObjectOutputStream)连续存储对象StreamCorruptedException
- objective-c ——代码块
- selenium 2.0 'NoneType' object has no attribute 'send_keys'
- js中的this & var, function & object, prototype & apply
- Objective-C中的设计模式之单例模式
- Objective-C中的设计模式--NSNotification通知
- Xcode_7 iOS_9 ActiveIndicatorView_ProgressView_警告窗_操作表 控件 Objective-C (3)
- Objective-C的反射
- OC_11_1类目与延展
- 继承Object和ContextBoundObject处理效率上的差距
- Xcode_7 iOS_9 Switch_SegmentControl_Slider 控件 Objective-C (2)
- iOS开发系列--Objective-C之类和对象
- Objective-C 注释技巧