重构13-Extract Method Object(提取方法对象)

重构来自于Martin Fowler的重构目录。你可以在这里找到包含简介的原始文章。

在我看来,这是一个比较罕见的重构,但有时却终能派上用场。当你尝试进行提取方法的重构时,需要引入大量的方法。在一个方法中使用众多的本地变量有时会使代码变得丑陋。因此最好使用提取方法对象这个重构,将执行任务的逻辑分开

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)

时间: 2024-10-29 10:46:57

重构13-Extract Method Object(提取方法对象)的相关文章

提取方法对象

概念:本文中的"提取方法对象"是指当你发现一个方法中存在过多的局部变量时,你可以通过使用"提取方法对象"重构来引入一些方法,每个方法完成任务的一个步骤,这样可以使得程序变得更具有可读性. 正文:如下代码所示,Order 类中的Calculate方法要完成很多功能,在之前我们用"提取方法"来进行重构,现在我们采取"提取方法对象"来完成重构. using System.Collections.Generic; namespace

重构改善既有代码设计--重构手法08:Replace Method with Method Object (以函数对象取代函数)

你有一个大型函数,其中对局部变量的使用,使你无法釆用 Extract Method. 将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的值域(field) 然后你可以在同一个对象中将这个大型函数分解为数个小型函数. class Order... double price() { double primaryBasePrice; double secondaryBasePrice; double tertiaryBasePrice; // long computation; ... }

重构改善既有代码设计--重构手法01:Extract Method (提炼函数)

背景: 你有一段代码可以被组织在一起并独立出来.将这段代码放进一个独立函数,并让函数名称解释该函数的用途. void PrintOwing(double amount) { PrintBanner(); //print details Console.WriteLine("name:"+_name); Console.WriteLine("amount:"+_amount); } void PrintOwing(double amount) { PrintBanne

『重构--改善既有代码的设计』读书笔记----Replace Method with Method Object

有时候,当你遇到一个大型函数,里面的临时变量和参数多的让你觉得根本无法进行Extract Method.重构中也大力的推荐短小函数的好处,它所带来的解释性,复用性让你收益无穷.但如果你遇到上种情况,你可能会天真的以为我只要适当的进行Replace Temp with Query,就可以把这种现象给化解.但情况往往事与愿违,不能达到你所理想的高度.这个时候你需要用到重构中的杀手锏--Replace Method with Method Object,这个手法出自Kent Beck [Beck].

读书笔记-重构方法之一:提炼方法(Extract Method)

第六章 重新组织你的函数 6.1  Extract Method(提炼方法) 对付过长函数,一般重要的重构方法就是Extract Method,他把一段代码从原先的函数中提取出来,放在单独的函数中.简洁而清晰,短小而精炼. 1 void printOwing (douoble amount) 2 { 3 printBanner(); 4 //print details 5 System.out.println(“name:”+_name); 6 System.out.println(“amoun

小酌重构系列[2]&mdash;&mdash;提取方法、提取方法对象

前言 "艺术源于生活"--代码也源于生活,你在生活中的一些行为习惯,可能会恰如其分地体现在代码中.当实现较为复杂的功能时,由于它包含一系列的逻辑,我们倾向于编写一个"大方法"来实现.为了使项目便于维护,以及增强代码的可读性,我们有必要对"大方法"的逻辑进行整理,并提取出分散的"小方法".这就是本文要讲的两种重构策略:提取方法.提取方法对象. 如何快速地找到想读的书? 在生活中,我是一个比较随意的人,平时也买了不少书去看.我的书

『重构--改善既有代码的设计』读书笔记----Extract Method

在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处理长函数--Extract Method,抽取成一个独立的小函数. 我个人来说也很喜欢短小函数,因为他们代表了高强度的复用与灵活性.对于短小函数来说最最关键的就是短小函数的命名,其实你就是给了这些短小函数自我解释的机会,所以你如果给这些短小函数起一个接近其语义的名字,那当你读起长函数来说,就像是阅读

Objective -C Object initialization 对象初始化

Objective -C Object initialization 对象初始化 1.1 Allocating Objects  分配对象 Allocation is the process by which a new object is born. allocation 是新对象诞生的过程. Sending the alloc message to a class causes that class to allocate a chunk of memory large enough to

[转载]Python方法绑定——Unbound/Bound method object的一些梳理

本篇主要总结Python中绑定方法对象(Bound method object)和未绑定方法对象(Unboud method object)的区别和联系.主要目的是分清楚这两个极容易混淆的概念,顺便将Python的静态方法,类方法及实例方法加以说明 OK,下面开始 1. 一个方法引发的"血案" 类中所定义的函数称为方法举例: >>>class Foo(object): ... def foo(): ... print 'call foo' 然后令人困惑的地方就来了:当