我们要介绍的重构是提取方法。这个重构极其简单但却大有裨益。首先,将逻辑置于命名良好的方法内有助于提高代码的可读性。当方法的名称可以很好地描述这部分代码的功能时,可以有效地减少其他开发者的研究时间。假设越少,代码中的bug也就越少。重构之前的代码如下:

public class Receipt {
private List<Double> Discounts;
private List<Double> ItemTotals; public Double CalculateGrandTotal() {
Double subTotal = 0d;
for(Double itemTotal : ItemTotals) subTotal += itemTotal;
if (Discounts.size() > ) {
for(Double discount : Discounts) subTotal -= discount;
}
Double tax = subTotal * 0.065d;
subTotal += tax;
return subTotal;
}
}
你会发现CalculateGrandTotal方法一共做了3件不同的事情:计算总额、折扣和发票税额。开发者为了搞清楚每个功能如何处理而不得不将代码从头看到尾。相比于此,向下面的代码那样将每个任务分解成单独的方法则要节省更多时间,也更具可读性:
public class Receipt {
private List<Double> Discounts;//getter setter
private List<Double> ItemTotals;//getter setter public Double CalculateGrandTotal() {
Double subTotal = CalculateSubTotal();
subTotal = CalculateDiscounts(subTotal);
subTotal = CalculateTax(subTotal);
return subTotal;
}
private Double CalculateSubTotal() {
Double subTotal = 0d;
for(Double itemTotal : ItemTotals){
subTotal += itemTotal;
}
return subTotal;
}
private Double CalculateDiscounts(Double subTotal) {
if (Discounts.size() > ) {
for(Double discount : Discounts){
subTotal -= discount;
}
}
return subTotal;
}
private Double CalculateTax(Double subTotal) {
Double tax = subTotal * 0.065d;
subTotal += tax;
return subTotal;
}
}

重构10-Extract Method(提取方法)的更多相关文章

  1. 从文章"避免复制与粘贴"到文章"Extract Method"的反思(1)

    看了一个比我牛的人的博客园的博文"避免复制和粘贴".里面提到了重构手法Extract Method.  所以又搜了一下Extract Method. 这里先自我理解Extract ...

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

    背景: 你有一段代码可以被组织在一起并独立出来.将这段代码放进一个独立函数,并让函数名称解释该函数的用途. void PrintOwing(double amount) { PrintBanner() ...

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

    在编程中,比较忌讳的一件事情就是长函数.因为长函数代表了你这段代码不能很好的复用以及内部可能出现很多别的地方的重复代码,而且这段长函数内部的处理逻辑你也不能很好的看清楚.因此,今天重构第一个手法就是处 ...

  4. VS Extract Method

    前言 看重构6.4Replace Temp with Query(以查询取代临时变量)中提到Replace Temp with Query往往是你运用Extract Method之前必不可少的一个步骤 ...

  5. 如何在eclips下将一段代码抽取为方法Extract Method

    最近读了读关于重构的文章,做了个小总结(在编程思想目录下<从文章"避免复制与粘贴"到文章"Extract Method"的反思 系列>). 然后因为 ...

  6. 从文章"避免复制与粘贴"到文章"Extract Method"的反思(3)

    在牛人的博客中提到了..如果你的代码可以copy-past的时候,那么久证明你的代码出现了重复.而这种重复仅仅是虚假的代码行的增加而不是像其他的代码复用那样降级成本. copy-pase代码意味着你违 ...

  7. Refactoring #001 Extract Method

    Example public void startup() { ServerSocket serverSocket = null; try { serverSocket = new ServerSoc ...

  8. Git Push问题remote: hooks/update:10 undefined method &#39;require_relative&#39; for main:Object(NomethodError)

    今天在提交代码时遇到到了一个非常蛋疼的问题,remote: hooks/update:10 undefined method 'require_relative' for main:Object(No ...

  9. 重构第10天:提取方法(Extract Method)

    理解:经常写的代码中,有一些计算逻辑比较复杂的方法,写下来一个很长很长的方法,我们可以把这个方法,根据功能,分解成单独的几个小方法.这样做不仅能够增加代码的可维护性,而且增加了易读性. 详解: 重构前 ...

  10. 重构13天 抽取方法对象(Extract Method Object)

    理解:本文中的“提取方法对象”是指当你发现一个方法中存在过多的局部变量时,你可以通过使用“提取方法对象”重构来引入一些方法,每个方法完成任务的一个步骤,这样可以使得程序变得更具有可读性. 详解:如下代 ...

随机推荐

  1. C++视频课程小结(2)

    C++远征之离港篇 章节介绍: 每章小结: 第一章:大致讲了一下本章会讲的内容:引用vs指针.const vs #define(这个我在C里都没用过).函数变得更强大.内存管理要小心之类的. 第二章: ...

  2. HDU4513吉哥系列故事――完美队形II(manacher算法)

    这个比最长回文子串就多了一个条件,就是回文字串(这里相当于人的高度)由两端向中间递增. 才刚刚看了看manacher,在用模板A了一道题后,还没有完全理解manacher,然后就准备把这道题也直接带模 ...

  3. manacher算法(转载)

    原网址:http://blog.sina.com.cn/s/blog_70811e1a01014esn.html manacher算法是我在网上无意中找到的,主要是用来求某个字符串的最长回文子串.不过 ...

  4. li在IE中底部空行的BUG

    li在IE中底部空行的BUG 但是这次li在IE中底部出现的不是3像素而是一整条空白行,如图:HTML代码: <ul> <li><a href="#" ...

  5. Codeforces Round #337 (Div. 2) C. Harmony Analysis 构造

    C. Harmony Analysis 题目连接: http://www.codeforces.com/contest/610/problem/C Description The semester i ...

  6. 学渣告诉你,到底神马是傅里叶级数!转自 新浪@工程师style

  7. Codeforces Beta Round #6 (Div. 2 Only) E. Exposition multiset

    E. Exposition Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/ ...

  8. C# GDI在控件上绘图

    本文以以在chart控件上和窗体上画矩形为例子 不多解释了,代码很简单. 还有一些童鞋要别的源码,给我发邮箱吧 using System; using System.Collections.Gener ...

  9. 有用好看的CSS+JS+table 导航

    预览效果图 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dis ...

  10. 由linux内核某个片段(container_of)引发的对于C语言的深入理解

    /usr/src/linux-source-3.8.0/drivers/gpu/drm/radeon 这个文件夹以下 去找到这个文件 mkregtable.c  打开,就能够看到了. #define ...