zoukankan      html  css  js  c++  java
  • 代码重构与单元测试——“提取方法”重构(三)

     
     

    三、重构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;
            }

     

  • 相关阅读:
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    Java实现 LeetCode 792 自定义字符串排序(暴力)
    asp.net session对象的持久化
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 791 自定义字符串排序(桶排序)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    Java实现 LeetCode 790 多米诺和托米诺平铺(递推)
    小白也能看懂的约瑟夫环问题
  • 原文地址:https://www.cnblogs.com/chillsrc/p/15015498.html
Copyright © 2011-2022 走看看