《重构》C#版实现(四)switch的多态化处理

本文介绍了如何通过重构将C#代码中的switch语句转化为多态化处理,以提高代码的可读性和可维护性。在重构过程中,作者创建了Price接口,并逐步消除对switch的依赖,同时确保了客户代码无需改动。文章强调了重构的决策依据、关键步骤以及需要注意的问题,旨在展示重构在提升代码质量方面的重要性。
摘要由CSDN通过智能技术生成

上一篇主要重构了Statement方法,在大刀阔斧的调整后,总算是得到了一个易于理解的方法体。当然,其中会带来潜在的效率问题,但记住一点,起码所有的事情都是经过权衡和决策的。可以“果断”来形容,而那种不明就里地乱来属于“武断”又或者说是“鲁莽”的行为当然不被推荐,它们的区别也就在于是否有全面的权衡与决策。
首先,列出到现在为止,Movie类和Rental类的代码如下:

public class Movie
{
	public const int CHILDRENS = 2;
	public const int REGULAR = 0;
	public const int NEW_RELEASE = 1;

	public string Title { get; private set; }
	public int PriceCode { get; private set; }
	
	public Movie(string title, int priceCode)
	{
		Title = title;
		PriceCode = priceCode;
	}
}

public class Rental
{
	public Movie Movie { get; private set; }
	public int DaysRented { get; private set; }
	public double Charge
	{
		get
		{
			double result = 0;
			switch (Movie.PriceCode)
			{
				case Movie.REGULAR:
					result += 2;
					if (DaysRented > 2)
						result += (DaysRented - 2) * 1.5;
					break;
				case Movie.NEW_RELEASE:
					result += DaysRented * 3;
					break;
				case Movie.CHILDRENS:
					result += 1.5;
					if (DaysRented > 3)
						result += (DaysRented - 3) * 1.5;
					break;
			}

			return result;
		}
	}

	public int FrequentRenterPoints
	{
		get
		{
			if (Movie.PriceCode == Movie.NEW_RELEASE && DaysRented > 1)
			{
				return 2;
			}
			else
			{
				return 1;
			}
		}
	}

	public Rental(Movie rented, int days)
	{
		Movie = rented;
		DaysRented = days;
	}
}

一、为价格计算寻找更合适的“家”

《重构》中提到一个考虑:该程序的一个主要变化点在于:影片类型很可能增加或发生变化。而目前来说,跟影片类型先关的代码分散在上面两个类中。在另一本书《代码整洁之道》中,提到一个原则:如果某些代码的修改频度一致,则应该把它们尽可能放在一起。放在我们这儿,意味着,如果我们在Movie类中增加了影片类型,意味着也要去修改Rental类的Charge属性,这种修改涉及到了两个类。假设情景是在大得多的项目中,则有可能是要修改两个不同的文件,甚至是不同的项目或程序集。而后面的这些情景通常会产生大量的BUG。而如果将修改频度一致的内容放在一起(同一个文件,甚至是同一个类中),则内容的同步也会变得更容易,BUG产生的几率会更低。
综上所述,我们需要把Rental关于Charge的计算过程迁移到Movie类中——虽然会带来多一层间接性,以换取程序的高可维护、可扩展性:
1.在Movie类中创建一个ChargeFor方法,并将Rental.Charge属性的代码抄过去:
public double ChargeFor(int daysRented)
{
	double result = 0;
	switch (PriceCode)
	{
		case Movie.REGULAR:
			result += 2;
			if (daysRented > 2)
				result += (daysRented - 2) * 1.5;
			break;
		ca
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值