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

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

详解

重构前代码:

 1 public class Receipt
 2     {
 3         private IList<decimal> Discounts { get; set; }
 4         private IList<decimal> ItemTotals { get; set; }
 5
 6         public decimal CalculateGrandTotal()
 7         {
 8             decimal subTotal = 0m;
 9             foreach (decimal itemTotal in ItemTotals)
10                 subTotal += itemTotal;
11
12             if (Discounts.Count > 0)
13             {
14                 foreach (decimal discount in Discounts)
15                     subTotal -= discount;
16             }
17
18             decimal tax = subTotal * 0.065m;
19
20             subTotal += tax;
21
22             return subTotal;
23         }
24     }

我们看到CalculateGrandTotal方法,里面用到了2个foreach循环,看一下,还真不宜理解,不晓得每个foreach主要做什么。

看看重构后的代码:

 1 public class Receipt
 2     {
 3         private IList<decimal> Discounts { get; set; }
 4         private IList<decimal> ItemTotals { get; set; }
 5
 6         public decimal CalculateGrandTotal()
 7         {
 8             decimal subTotal = CalculateSubTotal();
 9
10             subTotal = CalculateDiscounts(subTotal);
11
12             subTotal = CalculateTax(subTotal);
13
14             return subTotal;
15         }
16
17         private decimal CalculateTax(decimal subTotal)
18         {
19             decimal tax = subTotal * 0.065m;
20
21             subTotal += tax;
22             return subTotal;
23         }
24
25         private decimal CalculateDiscounts(decimal subTotal)
26         {
27             if (Discounts.Count > 0)
28             {
29                 foreach (decimal discount in Discounts)
30                     subTotal -= discount;
31             }
32             return subTotal;
33         }
34
35         private decimal CalculateSubTotal()
36         {
37             decimal subTotal = 0m;
38             foreach (decimal itemTotal in ItemTotals)
39                 subTotal += itemTotal;
40             return subTotal;
41         }
42     }

重构后,我们把CalculateGrandTotal方法分解成3个小方法,每个方法名称根据其功能命名。CalculateTax顾名思义,就是计算税收,CalculateDiscounts就是计算折扣金额。

这样就把逻辑剥离的很清楚了。

时间: 2024-08-10 02:21:35

重构第10天:提取方法(Extract Method)的相关文章

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

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

读书笔记-重构方法之一:提炼方法(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

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

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

Extract Method

[Extract Method]

重构改善既有代码设计--重构手法16:Introduce Foreign Method (引入外加函数)&amp;&amp; 重构手法17:Introduce Local Extension (引入本地扩展)

重构手法16:Introduce Foreign Method (引入外加函数)你需要为提供服务的类增加一个函数,但你无法修改这个类.在客户类中建立一个函数,并以第一参数形式传入一个服务类实例. 动机:这种事情发生了太多次了,你正在使用一个类,它真的很好,为你提供了需要的所有服务.而后,你又需要一项新服务,这个类却无法供应.于是你开始咒骂“为什么不能做这件事?”如果可以修改源码,你便可以自行添加一个新函数:如果不能,你就得在客户端编码,补足你要的那个函数. 如果客户类只使用这项功能一次,那么额外

大话重构连载10:小设计而不是大布局

开车的朋友一定深有体会,驾驶汽车其实就是在不断矫正汽车行驶方向的一个过程.在整个驾驶过程中,你必须全神贯注地紧盯前方,通过方向盘不断矫正方向,否则即使行驶在直线路段也可能偏离车道.那些疲劳驾驶的司机,因为进入睡眠状态,无法再矫正方向,车辆就会越来越偏离航向.这种情况下,即使数秒钟的小盹,也能造成车毁人亡的严重后果. 重构与驾车虽然属于完全不同的领域,但其道理是相同的.我们在运用重构方法修改代码的过程中也是经常会犯错的(是人就会犯错).犯错就如同偏离了航向一样,因此我们需要不断去矫正.既然是矫正,

Refactoring #001 Extract Method

Example public void startup() { ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(10000); System.out.println("The server is listening on 10000 port ..."); while (true) { serve(serverSocket.accept()); } } catch (IOException

extract method - 提取方法

以获取一个商品的价格为例:如果用户已登录并且是vip,得到vip价,否则正常价: 处理前: public function getPrice() { if (Auth::user()) { $userId = Auth::user()->UserID; $customerIds = $this->supplier->customers->map(function ($item) { return $item->format(['customer_id']); })->t

extract method(重新组织函数)

最常用的重构手法之一,当我们需要一段注释才能看明白一个函数,或者一个函数过长时,就需要将这段代码放到一个新的函数中去. 做法: 构造一个以函数意图命名的方法 讲需要提炼的代码复制到这个函数中 检查提炼的代码是否引用了作用于限于原函数的field或者method,如果有,将其声明为临时变量. 检查被提炼的代码是否修改了局部变量,如有则可以将被提炼代码处理为一个查询,或者使用split temporary value或者replace temp with query处理,并将这些局部变量传给目标函数