影片出租店 重构方法(6)

本文通过重构《重构:改善既有代码的设计》中的影片出租店代码示例,详细展示了如何优化GetCharge和GetFrequentRenterPoints函数,将其移动至Movie类中以减少未来维护成本。通过对代码的修改,不仅提高了模块的独立性和可读性,还降低了耦合度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 影片出租店是《重构:改善既有代码的设计》里面的第一个例子。使用了多种重构方法。
影片出租店:计算每一位顾客的消费金额并打印详单。
操作者告诉程序:顾客租了哪些影片,租期多长,程序便根据租赁时间和影片类型算出费用。影片分为三类:普通片,儿童片和新片。除了计算费用,还要为常客计算积分,积分会根据租片种类是否为新片而有不同。


第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;
}

测试结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

giantmfc123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值