概述
影片出租店是《重构:改善既有代码的设计》里面的第一个例子。使用了多种重构方法。
影片出租店:计算每一位顾客的消费金额并打印详单。
操作者告诉程序:顾客租了哪些影片,租期多长,程序便根据租赁时间和影片类型算出费用。影片分为三类:普通片,儿童片和新片。除了计算费用,还要为常客计算积分,积分会根据租片种类是否为新片而有不同。
重构之前的代码:
Refector_1.h
#ifndef REFECTOR_1_H
#define REFECTOR_1_H
#include <QString>
#include <QVector>
class Movie
{
public:
Movie(QString title, int priceCode);
const static int CHILDREN = 2;
const static int REGULAR = 0;
const static int NEW_RELEASE = 1;
int GetPriceCode();
void SetPriceCode(int priceCode);
QString GetTitle();
private:
QString m_Title;
int m_PriceCode;
};
class Rental
{
public:
Rental(Movie *movie, int daysRented);
int GetDaysRented();
Movie* GetMovie();
private:
Movie* m_Movie;
int m_DaysRented;
};
class Customer
{
public:
Customer(QString name);
void AddRental(Rental *rental);
QString GetName();
QVector<Rental *> GetRentals();
QString Statement();
private:
QString m_Name;
QVector<Rental *> m_Rentals;
};
#endif // REFECTOR_1_H
Refector_1.cpp
#include "Refector_1.h"
#include <QDebug>
Movie::Movie(QString title, int priceCode)
{
m_Title = title;
m_PriceCode = priceCode;
}
int Movie::GetPriceCode()
{
return m_PriceCode;
}
void Movie::SetPriceCode(int priceCode)
{
m_PriceCode = priceCode;
}
QString Movie::GetTitle()
{
return m_Title;
}
Rental::Rental(Movie *movie, int daysRented)
{
m_Movie =movie;
m_DaysRented = daysRented;
}
int Rental::GetDaysRented()
{
return m_DaysRented;
}
Movie *Rental::GetMovie()
{
return m_Movie;
}
Customer::Customer(QString name)
{
m_Name = name;
}
void Customer::AddRental(Rental *rental)
{
m_Rentals.push_back(rental);
}
QString Customer::GetName()
{
return m_Name;
}
QVector<Rental *> Customer::GetRentals()
{
return m_Rentals;
}
QString Customer::Statement()
{
double TotalAmout = 0;
int FrequentRenterPoints = 0;
QString result = "Rental Record for " + GetName() + "n";
for (Rental *rental : GetRentals())
{
double ThisAmount = 0;
switch (rental->GetMovie()->GetPriceCode())
{
case Movie::REGULAR:
ThisAmount += 2;
if (rental->GetDaysRented() > 2)
{
ThisAmount += (rental->GetDaysRented() - 2)*1.5;
}
break;
case Movie::NEW_RELEASE:
ThisAmount += rental->GetDaysRented() * 3;
break;
case Movie::CHILDREN:
ThisAmount += 1.5;
if (rental->GetDaysRented() > 3)
{
ThisAmount += (rental->GetDaysRented() - 3)*1.5;
}
break;
}
FrequentRenterPoints++;
if (Movie::NEW_RELEASE == (rental->GetMovie()->GetPriceCode()) &&
rental->GetDaysRented() > 1 )
{
FrequentRenterPoints++;
}
result += "t" + rental->GetMovie()->GetTitle() + "t" + QString("%1").arg(ThisAmount) + "n";
TotalAmout += ThisAmount;
}
result += "Amount owed is " + QString("%1").arg(TotalAmout) + "n";
result += "You earned " + QString("%1").arg(FrequentRenterPoints) + " frequent renter points";
qDebug() << qPrintable(result) ;
return result;
}
main.cpp
Movie movie1("Movie1", 0);
Movie movie2("Movie2", 1);
Movie movie3("Movie3", 2);
Movie movie4("Movie4", 0);
Movie movie5("Movie5", 1);
Movie movie6("Movie6", 2);
Movie movie7("Movie7", 0);
Rental rental1(&movie1, 1);
Rental rental2(&movie2, 2);
Rental rental3(&movie3, 3);
Rental rental4(&movie4, 4);
Rental rental5(&movie5, 5);
Rental rental6(&movie6, 6);
Rental rental7(&movie7, 7);
Customer ctmer("tester");
ctmer.AddRental(&rental1);
ctmer.AddRental(&rental2);
ctmer.AddRental(&rental3);
ctmer.AddRental(&rental4);
ctmer.AddRental(&rental5);
ctmer.AddRental(&rental6);
ctmer.AddRental(&rental7);
ctmer.Statement();
执行结果:
最后
以上就是贤惠斑马为你收集整理的影片出租店 重构方法(1)的全部内容,希望文章能够帮你解决影片出租店 重构方法(1)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复