当前位置: 首页 > article >正文

重构代码之引入外部方法

引入外部方法 用于在当前类中引入一个方法,以访问另一个类中无法修改的方法逻辑。换句话说,如果你无法直接修改目标类(如因为它是外部库或遗留代码),但需要添加某些便于调用的逻辑,可以在自己的类中创建一个“外部方法”来扩展该目标类的功能。

一、使用场景

  1. 无法直接修改目标类:目标类是第三方库或遗留代码,且你无权修改。
  2. 临时扩展目标类功能:你需要为目标类添加一个对当前代码逻辑更有用的方法,但这些功能并非目标类的核心职责。
  3. 简化调用代码:目标类的使用方式复杂或不符合当前需求,你希望通过外部方法封装其使用细节。

二、实现步骤

  1. 确定目标类中需要扩展的功能。
  2. 在调用目标类的地方创建一个外部方法,通常放在使用目标类的上下文中。
  3. 使用该外部方法替代复杂的目标类调用。

三、示例

假设你正在开发一个项目,目标类 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()}");

代码的问题是:

  1. 每次需要下一个工作日的逻辑都得重复实现。
  2. 无法扩展到其他日期场景。
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()}");

四、注意事项

  1. 避免滥用:引入外部方法是一种权宜之计,若可以直接修改目标类,则应使用更合适的方法(如扩展目标类、引入子类)。
  2. 方法命名清晰:外部方法应尽可能清晰地表达其功能,避免引入不必要的复杂性。
  3. 扩展类的组织:为避免代码分散,可以将这些外部方法集中在扩展类或工具类中。

五、总结

引入外部方法提供了一种在无法直接修改目标类的情况下扩展其功能的简单方法。它的核心思想是将重复逻辑提取为一个独立的方法,使代码更加可读、易维护。虽然是一种临时方案,但在特定场景下非常有用。


http://www.kler.cn/a/402527.html

相关文章:

  • 进程间通信5:信号
  • 金融市场和预期
  • 直播技术-Android基础框架
  • Springboot 读取 resource 目录下的Excel文件并下载
  • 智能显示屏插座:能否成为家庭用电安全的守护天使?
  • 【C++】C++11新特性详解:可变参数模板与emplace系列的应用
  • 【c++篇】:深入c++的set和map容器--掌握提升编程效率的利器
  • 【JavaSE】【网络编程】UDP数据报套接字编程
  • MFC1(note)
  • 高频面试题(含笔试高频算法整理)基本总结回顾21
  • goland单元测试
  • 【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题
  • 一次成功尝试:旧电脑通过网线,连接带无线网卡电脑上外网
  • Android和IOS的区别
  • C++——智能指针剖析
  • 专家PID控制
  • 在 for 循环中,JVM可能会将 arr.length 提升到循环外部,仅计算一次。可能会将如何解释 详解
  • AwsCredentialsProvider认证接口
  • Python运算符列表
  • C++设计模式之适配器模式与桥接模式,装饰器模式及代理模式相似点与不同点
  • 数据结构 【带环单链表】
  • 【Chatgpt】如何通过分层Prompt生成更加细致的图文内容
  • Android开发实战班 - 数据持久化 - Room 数据库应用
  • Spark Catalyst 优化器具有高度的可扩展性,如何自定义优化规则?
  • Zero-Shot Next-Item Recommendation using Large Pretrained Language Models-问题咨询
  • 阿里云 DevOps 资源安全扫描实践