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

server/2024/11/24 2:37:21/

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

一、定义与适用场景

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

二、实现方式

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

五、总结

  • 引入外来方法 :适合快速实现特定上下文中的辅助功能,但可能降低代码可维护性。
  • 引入本地扩展 :提供更好的结构化支持,适合长期使用和复杂功能扩展。

http://www.ppmy.cn/server/144421.html

相关文章

软件工程复习知识点

考点整理 模块的内聚是何含义&#xff1f; 一个模块内各个元素彼此结合的紧密程度。 软件工程方法学的3要素是什么&#xff1f; 方法、工具、过程 软件生命周期的阶段如何还分&#xff0c;每个阶段的主要任务是什么&#xff1f; 软件定义&#xff08;问题定义、可行性研究、需…

动态内存管理详解

1.malloc和free函数 2.calloc和realloc函数 3.动态内存管理的常见错误 &#xff08;1&#xff09;对空指针的解引用操作 &#xff08;2&#xff09;对动态开辟空间的越界访问 &#xff08;3&#xff09;对非动态开辟内存使用free &#xff08;4&#xff09;使用free释放…

无监督跨域目标检测的语义一致性知识转移

Semantic consistency knowledge transfer for unsupervised cross domain object detection 无监督跨域目标检测的语义一致性知识转移 作者: Zichong Chen, Ziying Xia, Xiaochen Li, Junhao Shi, Nyima Tashi, Jian Cheng 所属机构: 电子科技大学信息与通信工程学院&…

MySQL中索引全详解

第一部分&#xff1a;什么是索引 索引在数据库中就像书的目录&#xff0c;能够快速定位数据位置&#xff0c;从而提升查询效率。没有索引时&#xff0c;数据库查询需要从头到尾扫描整个表&#xff08;称为全表扫描&#xff09;&#xff0c;这在数据量大时非常耗时。有了索引后&…

如何优化Sql的查询性能?

使用适当的索引 原理:索引是数据库中的一种数据结构,可以加快数据的检索速度。 性能提升: 大大减少了数据库需要扫描的数据量可以避免全表扫描,直接定位到所需数据在排序和分组操作中也能显著提高效率 优化查询语句 原理:精简和优化SQL语句可以减少数据库的工作量。 性能提升: …

Python 之网络爬虫

一.认识HTML 1.什么是HTML &#xff08;HyperText Markup Language&#xff09; HTML是超文本标记语言的缩写&#xff0c;它包含一系列的标签&#xff0c; “超文本”是一种组织信息的方式&#xff0c;利用HTML标记&#xff0c;告诉浏览器被标记的内容如何显示到浏览器页面上…

CSS布局学习1

vertical-align: 元素所在一行垂直方向的对齐&#xff0c;谁小的谁动&#xff01;父元素中的子元素&#xff0c;只能控制行内元素&#xff01;&#xff01;&#xff01;用在单元格内可以用来春之对齐。 text-aligh&#xff1a;文字对齐&#xff0c;left, right, center img图…

《现代制造技术与装备》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《现代制造技术与装备》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的第二批认定学术期刊。 问&#xff1a;《现代制造技术与装备》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a;齐鲁工业大学&#xff0…