Spiga

一天一个重构方法(29):移除工具类

2009-08-30 14:23:03

Remove God Classes:移除工具类

在传统的代码库中,我们常常会看到一些违反了SRP原则的类。这些类通常以Utils或Manager结尾,有时也没有这么明显的特征而仅仅是普通的包含多个功能的类。这种God 类还有一个特征,使用语句或注释将代码分隔为多个不同角色的分组,而这些角色正是这一个类所扮演的。久而久之,这些类成为了那些没有时间放置到恰当类中的方法的垃圾桶。这时的重构需要将方法分解成多个负责单一职责的类。

public class CustomerService
{
	public decimal CalculateOrderDiscount(IEnumerable<Product> products, Customer customer)
	{
		// do work
	}
	public bool CustomerIsValid(Customer customer, Order order)
	{
		// do work
	}
	public IEnumerable<string> GatherOrderErrors(IEnumerable<Product> products, Customer customer)
	{
		// do work
	}
	public void Register(Customer customer)
	{
		// do work
	}
	public void ForgotPassword(Customer customer)
	{
		// do work
	}
}

使用该重构是非常简单明了的,只需把相关方法提取出来并放置到负责相应职责的类中即可。这使得类的粒度更细、职责更分明、日后的维护更方便。上例的代码最终被分解为两个类:

public class CustomerOrderService
{
	public decimal CalculateOrderDiscount(IEnumerable<Product> products, Customer customer)
	{
		// do work
	}
	public bool CustomerIsValid(Customer customer, Order order)
	{
		// do work
	}
	public IEnumerable<string> GatherOrderErrors(IEnumerable<Product> products, Customer customer)
	{
		// do work
	}
}
public class CustomerRegistrationService
{
	public void Register(Customer customer)
	{
		// do work
	}
	public void ForgotPassword(Customer customer)
	{
		// do work
	}
}