代码重构与单元测试——“提取方法”重构(三)

  • A+
所属分类:.NET技术
摘要

三、重构1:对Statement方法中的代码使用“提取方法”重构        我们观察 代码重构与单元测试(一) 文章中 的共享充电宝计费代码中,发现Customer类的Statement ()方法首先需要进行重构。Statement ()方法最大的问题就是这个方法里边做的事情太多,我们第一步就是对其进行拆分。也就是使用重构中的“Extract Method”(提取方法)原则对该方法进行简化和拆分。将Statement ()中可以独立出来的代码进行提取。经过仔细分析后的,我们发现如下图中所框选的代码是一个完整的功能模块,其中框1中的代码是进行单价计算的功能,红框2中的代码是进行积分计算的功能,我们可以将这两块代码分别进行提取并封装成一个新的方法。在封装成新方法时,要给这个新的方法取一个恰当的方法名,见名知意。

 
 

三、重构1对Statement方法中的代码使用“提取方法”重构

       我们观察 代码重构与单元测试(一)文章中的共享充电宝计费代码中,发现Customer类的Statement ()方法首先需要进行重构。Statement ()方法最大的问题就是这个方法里边做的事情太多,我们第一步就是对其进行拆分。也就是使用重构中的“Extract Method”(提取方法)原则对该方法进行简化和拆分。将Statement ()中可以独立出来的代码进行提取。经过仔细分析后的,我们发现如下图中所框选的代码是一个完整的功能模块,其中框1中的代码是进行单价计算的功能,红框2中的代码是进行积分计算的功能,我们可以将这两块代码分别进行提取并封装成一个新的方法。在封装成新方法时,要给这个新的方法取一个恰当的方法名,见名知意。

   代码重构与单元测试——“提取方法”重构(三)

1.下面我们就首先对方框1中的代码进行提取方法。在代码编辑器中选中方框1中的代码,并单击鼠标右键,在弹出菜单中选择“快速操作和重构”。如下图。

 代码重构与单元测试——“提取方法”重构(三)

2.使用鼠标左键点击“快速操作和重构”,代码编辑器会出现“提取方法”菜单,并会出现我们提取方法的预览代码。如下图。

代码重构与单元测试——“提取方法”重构(三)

3. 我们使用鼠标左键点击上图中的“预览更改”。如下图,我们会看到提取方法及代码更改的地方。如果确认没有问题,点击“应用”按钮。

 代码重构与单元测试——“提取方法”重构(三)

4.我们已经把这段代码提取到新的方法中。把“NewMethod”方法名改为“GetAmount”。如下图。

 代码重构与单元测试——“提取方法”重构(三)

5.  我们提取的新方法GetAmount(),具体代码如下:

  public  decimal GetAmount(Rental item)         {              decimal amount = 0M;             switch (item.Power.PriceCode)             {                  case 0:                     amount = item.RentedTime;                     if (item.RentedTime > 12)                     {                         amount = 12;                     }                      break;                  case 1:                     amount = item.RentedTime * 3;                     if (item.RentedTime > 24)                     {                         amount = 24;                     }                      break;                  case 2:                     amount = item.RentedTime * 5;                     if (item.RentedTime > 50)                     {                          amount = 50;                     }                     break;                 default:                     break;              }             return amount;         }

 

      6. 重复上面第1步到第4步的操作,我们对红框2中的代码进行提取。在提取时,将依赖于Statement()方法中的数据作为新方法的参数即可。封装后的方法如下,在Statement()方法中相应的地方调用下方的计算积分的方法即可。下方就是我们封装的计算积分的方法。代码如下:

 public  int GetFrequentRenterPoints(int frequentRenterPoints, Rental item, decimal amount)         {             //计算积分             if (item.Power.PriceCode == PowerBank.HighTraffic && item.RentedTime > 4)              {                  frequentRenterPoints += (int)Math.Ceiling(amount * 1.5M);             }              else                 frequentRenterPoints += (int)Math.Ceiling(amount);             return frequentRenterPoints;         }