• 1.7 以函数对象取代函数


    【1】源代码

     1 // 重构前
     2 class Account
     3 {
     4 public:
     5     // 以下函数没有实际意义,为了演示使用过多的局部变量
     6     int gamma(int inputVal, int quantity, int yearTodate);
     7     {
     8         int importantValue1 = (inputVal * quantity) + delta();
     9         int importantValue2 = (inputVal * yearToDate) + 100;
    10         if ((yearToDate - importantValue1) > 100)
    11             importantValue2 -= 20;
    12 
    13         int importantValue3 = importantValue2 * 7;
    14         // do something....
    15         return importantValue3 - 2 * importantValue1;
    16     }
    17 
    18     int delta() const { return 100; }
    19 };

    【2】以函数对象取代函数

     1 // 以函数对象取代函数
     2 class Account
     3 {
     4 public:
     5     int gamma(int inputVal, int quantity, int yearTodate);
     6     int delta() const
     7     {
     8         return 100;
     9     }
    10 };
    11 
    12 // 修改Account类中的旧函数
    13 int Account::gamma(int inputVal, int quantity, int yearToDate)
    14 {
    15     Gamma gm(this, inputVal, quantity, yearToDate);
    16     return gm.compute();
    17 }
    18 
    19 // 1.声明一个新类,提供一个const字段用以保存源对象
    20 // 2.原函数的每一个参数和每一个临时变量分别以一个字段保存
    21 // 3.加一个构造函数
    22 class Gamma
    23 {
    24 public:
    25     Gamma(Account* src, int inputVal, int quantity, int yearToDate)
    26         : m_pAccount(src)
    27         , m_nInputVal(inputVal)
    28         , m_nQuantity(quantity)
    29         , m_nYearToDate(yearToDate)
    30     {}
    31 
    32     int compute()
    33     {
    34         m_nImportantValue1 = (m_nInputVal * m_nQuantity) + m_pAccount->delta(); // 调用源对象的delta()
    35         m_nImportantValue2 = (m_nInputVal * m_nYearToDate) + 100;
    36         if ((m_nYearToDate - m_nImportantValue1) > 100)
    37         {
    38             m_nImportantValue2 -= 20;
    39         }
    40 
    41         m_nImportantValue3 = m_nImportantValue2 * 7;
    42         // do something....
    43         return m_nImportantValue3 - 2 * m_nImportantValue1;
    44     }
    45 
    46 private:
    47     const Account* m_pAccount;
    48 
    49     int m_nInputVal;
    50     int m_nQuantity;
    51     int m_nYearToDate;
    52     int m_nImportantValue1;
    53     int m_nImportantValue2;
    54     int m_nImportantValue3;
    55 };

    【3】总结

    有一个大型函数,其中对局部变量的使用使你无法采用[1.1提炼函数]。

    将这个函数放进一个单独对象中,如此一来局部变量就成了对象内的字段。

    然后,你可以在同一个对象中将这个大型函数分解为多个小型函数。

    Good Good Study, Day Day Up.

    顺序 选择 循环 总结

  • 相关阅读:
    ASP.NET 2.0 X64 引起的问题
    .net 俱乐部7月份资料下载 .net 开源项目
    用schemaSpy制作数据库文档
    IbatisNet支持2.0的版本Release 发布了
    Introduction to Model Driven Development with AndroMDA
    开放源代码与.NET应用程序平台的性能测试
    sqlserver 2000/2005 Ambiguous column error错误解决办法
    ASP.NET 2.0 中 Web 事件
    使用asp.net 2.0的CreateUserwizard控件如何向自己的数据表中添加数据
    Working with Windows Workflow Foundation in ASP.NET
  • 原文地址:https://www.cnblogs.com/Braveliu/p/7340544.html
Copyright © 2020-2023  润新知