重构代码之提取子类
提取子类主要用于精简类结构和增强代码的灵活性。这个方法适用于当类中的某些字段或方法只适用于特定对象的情况。通过提取子类,可以将这些特定的字段和方法分离到一个新的子类中,使代码结构更清晰。
一、为什么要使用提取子类
- 提高代码的可读性:当类包含与特定需求无关的字段和方法时,类会显得冗杂。提取子类后,代码的职责会变得更加清晰。
- 增强扩展性和复用性:将特定功能放入子类,便于在不修改原始类的情况下进行扩展。
- 减少条件判断:避免主类中使用大量条件语句(如
if
和switch
)来处理不同的对象类型。
二、示例
假设我们有一个 Employee
类,其中包含了部分只适用于销售人员的属性和方法,例如 salesTarget
和 achieveSalesTarget()
方法:
public class Employee
{
public string Name { get; set; }
public decimal Salary { get; set; }
public decimal SalesTarget { get; set; }
public Employee(string name, decimal salary)
{
Name = name;
Salary = salary;
}
public void AchieveSalesTarget()
{
Console.WriteLine($"{Name} 已经完成了销售目标");
}
}
对于非销售人员的员工对象,这些特定的字段和方法可能毫无意义。此时我们可以考虑提取一个 SalesEmployee
子类,来包含这些特定于销售的逻辑。
2.1 重构后的代码
通过提取 SalesEmployee
子类,将销售相关的内容与一般员工类分离:
public class Employee
{
public string Name { get; set; }
public decimal Salary { get; set; }
public Employee(string name, decimal salary)
{
Name = name;
Salary = salary;
}
}
public class SalesEmployee : Employee
{
public decimal SalesTarget { get; set; }
public SalesEmployee(string name, decimal salary, decimal salesTarget)
: base(name, salary)
{
SalesTarget = salesTarget;
}
public void AchieveSalesTarget()
{
Console.WriteLine($"{Name} has achieved the sales target!");
}
}
现在 SalesEmployee
仅包含销售相关的逻辑,而 Employee
类保持简洁,包含通用属性。对于非销售员工,只需使用 Employee
类即可。
三、适用场景
- 类中存在特定逻辑:当类包含仅针对某些情况或对象的逻辑时。
- 频繁出现条件语句:当某些属性和方法通过条件语句控制时,通过提取子类可以减少分支判断。
四、使用提取子类的好处
- 职责单一:每个类承担单一职责,遵循单一职责原则。
- 代码易于扩展:新特性可以通过子类化实现,而不会污染主类。
- 减少重复代码:在父类和子类之间共用通用逻辑,减少重复代码。
重构代码是一种常用的重构方式,尤其在类职责不明确、逻辑过于混杂时可以起到显著优化效果。