Spiga

一天一个重构方法(7):责任拆分

2009-05-17 21:02:00

Break Responsibilities:责任拆分

把一个类的多个职责进行拆分,这贯彻了单一职责原则(SRP)。尽管对于如何划分“职责”经常存在争论,但应用这项重构还是十分简单的。我这里并不会回答划分职责的问题,只是演示一个结构清晰的示例,将类划分为多个负责具体职责的类。

public class Video
{
	public void PayFee(decimal fee)
	{
	}
	public void RentVideo(Video video, Customer customer)
	{
		customer.Videos.Add(video);
	}
	public decimal CalculateBalance(Customer customer)
	{
		return customer.LateFees.Sum();
	}
}
public class Customer
{
	public IList<decimal> LateFees { get; set; }
	public IList<Video> Videos { get; set; }
}

如你所见,Video类包含两个职责,一个负责处理录像租赁,另一个负责管理管理用户的租赁总数。要分离职责,我们可以将用户的逻辑转移到用户类中。

public class Video
{
	public void RentVideo(Video video, Customer customer)
	{
		customer.Videos.Add(video);
	}
}
public class Customer
{
	public IList<decimal> LateFees { get; set; }
	public IList<Video> Videos { get; set; }
	public void PayFee(decimal fee)
	{
	}
	public decimal CalculateBalance(Customer customer)
	{
		return customer.LateFees.Sum();
	}
}