版权声明:请注明转发出处 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;
}