《重构:改善既有代码的设计》 简化条件表达式 之 1 分解条件表达式 decompose conditional

版权声明:请注明转发出处 https://blog.csdn.net/mafucun1988/article/details/89741623

《重构:改善既有代码的设计》中提到过很多重构方法,关于简化条件表达式的方法有8种。本文介绍:
分解条件表达式 decompose conditional

  • 名称:分解条件表达式 decompose conditional
  • 概要:有一个复杂的条件(if-then-else)语句,从if, then,else三个段落中分别提炼出独立函数
  • 动机: 大型函数自身会使代码的可读性下降
  • 做法:
    • 将if段落提炼出来,构成一个独立函数
    • 将then段落和else段落都提炼出来,各自构成一个独立函数
  • 代码演示
    • 假设要计算某样商品的总价(总价 = 数量 X 单价),而这个商品在冬季和夏季的单价使不同的

修改之前的代码:

///////////////////////////.h
#ifndef SIMPLIFYCONDITIONAL_H
#define SIMPLIFYCONDITIONAL_H


class SimplifyConditional
{
public:
    SimplifyConditional();
    double CalcCharge();

private:
    int m_date;
    double m_charge;
    int m_quantity;
    double m_winnerRate;
    double m_summerRate;
    double m_winnerSeviceCharge;
};

#endif // SIMPLIFYCONDITIONAL_H

///////////////////////////.cpp
#include "SimplifyConditional.h"
#define SUMMER_START 0401
#define SUMMER_END 1031

SimplifyConditional::SimplifyConditional()
{

}

double SimplifyConditional::CalcCharge()
{
 if (m_date < SUMMER_START || m_date > SUMMER_END)
 {
     m_charge = m_quantity * m_winnerRate + m_winnerSeviceCharge;
 }
 else
 {
     m_charge = m_quantity * m_summerRate;
 }
 return  m_charge;
}

修改之后的代码:

///////////////////////////.h
#ifndef SIMPLIFYCONDITIONAL_H
#define SIMPLIFYCONDITIONAL_H


class SimplifyConditional
{
public:
    SimplifyConditional();
    double CalcCharge();
    bool isNotSummer();
    double winnerCharge();
    double summerCharge();

private:
    int m_date;
    double m_charge;
    int m_quantity;
    double m_winnerRate;
    double m_summerRate;
    double m_winnerSeviceCharge;
};

#endif // SIMPLIFYCONDITIONAL_H

///////////////////////////.cpp
#include "SimplifyConditional.h"
#define SUMMER_START 0401
#define SUMMER_END 1031

SimplifyConditional::SimplifyConditional()
{
    
}

double SimplifyConditional::CalcCharge()
{
    if (isNotSummer())
    {
        m_charge = winnerCharge();
    }
    else
    {
        m_charge = summerCharge();
    }
    return  m_charge;
}

bool SimplifyConditional::isNotSummer()
{
    return (m_date < SUMMER_START || m_date > SUMMER_END);
}

double SimplifyConditional::winnerCharge()
{
    return m_quantity * m_winnerRate + m_winnerSeviceCharge;
}

double SimplifyConditional::summerCharge()
{
    return m_quantity * m_summerRate;
}

猜你喜欢

转载自blog.csdn.net/mafucun1988/article/details/89741623
今日推荐