影片出租店是《重构:改善既有代码的设计》里面的第一个例子。使用了多种重构方法。
影片出租店:计算每一位顾客的消费金额并打印详单。
操作者告诉程序:顾客租了哪些影片,租期多长,程序便根据租赁时间和影片类型算出费用。影片分为三类:普通片,儿童片和新片。除了计算费用,还要为常客计算积分,积分会根据租片种类是否为新片而有不同。
第5次重构:
- Move Method: 由于GetCharge/GetFrequentRenterPoints主要用到Movie类中的函数,将两者的变化可以控制在movie类中,将来变化时改动要小一些。
- 最好不要在另一个对象的属性基础上运用switch语句。如果不得不使用,也应该在对象自己的数据上使用。
- 将GetCharge移动到Movie类中。
- 将GetFrequentRenterPoints移动到Movie类中。
修改后的代码:
int Rental::GetFrequentRenterPoints()
{
return GetMovie()->GetFrequentRenterPoints(GetDaysRented());
}
double Rental::GetCharge()
{
return GetMovie()->GetCharge(GetDaysRented());
}
int Movie::GetFrequentRenterPoints(int daysRented)
{
if (NEW_RELEASE == (GetPriceCode()) &&
daysRented > 1 )
{
return 2;
}
return 1;
}
double Movie::GetCharge(int daysRented)
{
double Result = 0;
switch (GetPriceCode())
{
case Movie::REGULAR:
Result += 2;
if (daysRented > 2)
{
Result += (daysRented - 2)*1.5;
}
break;
case Movie::NEW_RELEASE:
Result += daysRented * 3;
break;
case Movie::CHILDREN:
Result += 1.5;
if (daysRented > 3)
{
Result += (daysRented - 3)*1.5;
}
break;
}
return Result;
}
测试结果: