重构代码之引入外部方法
引入外部方法 用于在当前类中引入一个方法,以访问另一个类中无法修改的方法逻辑。换句话说,如果你无法直接修改目标类(如因为它是外部库或遗留代码),但需要添加某些便于调用的逻辑,可以在自己的类中创建一个“外部方法”来扩展该目标类的功能。
一、使用场景
- 无法直接修改目标类:目标类是第三方库或遗留代码,且你无权修改。
- 临时扩展目标类功能:你需要为目标类添加一个对当前代码逻辑更有用的方法,但这些功能并非目标类的核心职责。
- 简化调用代码:目标类的使用方式复杂或不符合当前需求,你希望通过外部方法封装其使用细节。
二、实现步骤
- 确定目标类中需要扩展的功能。
- 在调用目标类的地方创建一个外部方法,通常放在使用目标类的上下文中。
- 使用该外部方法替代复杂的目标类调用。
三、示例
假设你正在开发一个项目,目标类 DateTime
是 .NET 的内置类,你需要添加一个方法来返回某个日期的下一个工作日,但不能直接修改 DateTime
类。
3.1 原始代码
DateTime today = DateTime.Now;
DateTime nextWorkday;
// 获取下一个工作日(逻辑写在调用处)
if (today.DayOfWeek == DayOfWeek.Friday)
nextWorkday = today.AddDays(3);
else if (today.DayOfWeek == DayOfWeek.Saturday)
nextWorkday = today.AddDays(2);
else
nextWorkday = today.AddDays(1);
Console.WriteLine($"下一个工作日是:{nextWorkday.ToShortDateString()}");
代码的问题是:
- 每次需要下一个工作日的逻辑都得重复实现。
- 无法扩展到其他日期场景。
3.2 引入外部方法
public static class DateTimeExtensions
{
public static DateTime GetNextWorkday(this DateTime date)
{
return date.DayOfWeek switch
{
DayOfWeek.Friday => date.AddDays(3),
DayOfWeek.Saturday => date.AddDays(2),
_ => date.AddDays(1),
};
}
}
调用代码变得更加简洁:
DateTime today = DateTime.Now;
DateTime nextWorkday = today.GetNextWorkday();
Console.WriteLine($"下一个工作日是:{nextWorkday.ToShortDateString()}");
四、注意事项
- 避免滥用:引入外部方法是一种权宜之计,若可以直接修改目标类,则应使用更合适的方法(如扩展目标类、引入子类)。
- 方法命名清晰:外部方法应尽可能清晰地表达其功能,避免引入不必要的复杂性。
- 扩展类的组织:为避免代码分散,可以将这些外部方法集中在扩展类或工具类中。
五、总结
引入外部方法提供了一种在无法直接修改目标类的情况下扩展其功能的简单方法。它的核心思想是将重复逻辑提取为一个独立的方法,使代码更加可读、易维护。虽然是一种临时方案,但在特定场景下非常有用。