重构代码中引入外部方法和引入本地扩展的区别

引入外来方法引入本地扩展 都是为了扩展某些类的功能,但它们的使用场景和实现方式有显著区别。

一、定义与适用场景

1.1 引入外来方法
  1. 定义:在不属于目标类的地方(通常是在调用目标类的上下文中),为目标类编写一个临时的辅助方法,以提供额外的功能。
  2. 适用场景
    • 需要为类添加少量方法,但不需要长期维护。
    • 添加的方法仅在特定上下文中使用。
    • 不希望因为简单的功能扩展而增加新的类或结构。
1.2 引入本地扩展
  1. 定义:创建一个新的扩展类(通过继承或包装),为目标类添加新的方法或功能。
  2. 适用场景
    • 需要为目标类添加多种功能,或者功能复杂,需要组织到新的类中。
    • 需要长期维护的扩展功能。
    • 为多个上下文提供统一的功能扩展。
    • 避免对外部库的直接修改,保持封装性。

二、实现方式

2.1 引入外来方法
  • 将新方法定义在调用代码的上下文中,而不是目标类中。
  • 该方法通常是一个静态方法,直接操作目标类的实例。
  1. 示例:引入外来方法
    假设 DateRange 类没有提供检查某日期是否在范围内的方法,可以在当前代码中写一个临时静态方法:

    csharp 复制代码
    public static class DateRangeHelper
    {
        public static bool IsDateInRange(DateRange range, DateTime date)
        {
            return date >= range.StartDate && date <= range.EndDate;
        }
    }
    
    // 使用
    var range = new DateRange(DateTime.Now.AddDays(-5), DateTime.Now.AddDays(5));
    bool result = DateRangeHelper.IsDateInRange(range, DateTime.Now); // True
2.1 引入本地扩展
  • 创建一个新的扩展类(通过继承或包装)。
  • 在扩展类中添加新功能,并通过继承或组合的方式使用。
  1. 示例:引入本地扩展

    csharp 复制代码
    public class DateRangeExtension
    {
        private readonly DateRange _dateRange;
    
        public DateRangeExtension(DateRange dateRange)
        {
            _dateRange = dateRange;
        }
    
        public bool IsDateInRange(DateTime date)
        {
            return date >= _dateRange.StartDate && date <= _dateRange.EndDate;
        }
    }
    
    // 使用
    var range = new DateRange(DateTime.Now.AddDays(-5), DateTime.Now.AddDays(5));
    var extendedRange = new DateRangeExtension(range);
    bool result = extendedRange.IsDateInRange(DateTime.Now); // True

三、优缺点比较

特性 引入外来方法 引入本地扩展
实现复杂度 简单,方法通常为静态方法 较复杂,需要创建继承类或包装类
适用范围 特定上下文,功能扩展通常是临时的 广泛适用,功能扩展通常是长期的
可维护性 较低,可读性和组织性较差 高,可复用性强
对原类的影响 不直接影响,但代码散落在上下文中 无直接影响,封装良好
使用对象的灵活性 对于特定对象直接扩展 通过继承或包装增强对象灵活性
功能复杂度 适合简单的辅助功能 适合复杂或多功能的扩展
代码组织 方法通常嵌套在调用代码的上下文中 新建扩展类,功能组织清晰

四、何时选择哪种方法

情况 推荐方法
仅需要临时功能扩展,功能简单 引入外来方法 (Foreign Method)
需要长期维护、复杂或多功能扩展 引入本地扩展 (Local Extension)
扩展功能仅在特定上下文中使用 引入外来方法 (Foreign Method)
扩展功能需要在多个地方复用 引入本地扩展 (Local Extension)
不希望增加额外的类 引入外来方法 (Foreign Method)
希望功能集中管理,代码组织良好 引入本地扩展 (Local Extension)

五、总结

  • 引入外来方法 :适合快速实现特定上下文中的辅助功能,但可能降低代码可维护性。
  • 引入本地扩展 :提供更好的结构化支持,适合长期使用和复杂功能扩展。
相关推荐
Bruce小鬼9 分钟前
QT文件基本操作
开发语言·qt
2202_7544215415 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
蓝染-惣右介17 分钟前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
小林想被监督学习18 分钟前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose20 分钟前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
我只会发热22 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
是老余23 分钟前
本地可运行,jar包运行错误【解决实例】:通过IDEA的maven package打包多模块项目
java·maven·intellij-idea·jar
crazy_wsp23 分钟前
IDEA怎么定位java类所用maven依赖版本及引用位置
java·maven·intellij-idea
.Ayang26 分钟前
tomcat 后台部署 war 包 getshell
java·计算机网络·安全·web安全·网络安全·tomcat·网络攻击模型
一直学习永不止步31 分钟前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表