Navicat Premium 10.1.3激活(重构与模式:改善代码三部曲中的第三部)

Navicat Premium 10.1.3激活(重构与模式:改善代码三部曲中的第三部)

  我们所编写的绝大部分代码都不会从一开始就很简单。
  算法经常会因为支持多种变化而变得复杂。
  控制状态转换的转换的逻辑往往会变得越来越复杂。
7.1 组合方法
  当你无法迅速的理解一个方法的逻辑时,把方法的逻辑转换成几个同一层面上的、能够说明意图的步骤。
动机:
  Composed Method由对其他方法的调用组成,好的Composed Method的代码都在细节的同一层面上。
  Composed Method一般不会引入性能问题
优缺点:
  + 清晰的描述了一个方法所实现的功能以及如何实现
  + 把方法分解成命名良好的、处在细节的同一层面上的行为模块,以此来简化方法
  – 可能会产生过多的小方法
  – 可能会使调试变得困难,因为程序的逻辑分散在许多小方法中
Composed Method指导原则:
  Composed Method都很小。一般在5行左右,很少超过10行
  删除重复代码和死代码。除去明显的和微妙的代码重复,除去没有被使用的代码,以减少方法的代码量
  表达意图。清楚的命名程序中的变量、方法和参数,使它们明确表达意图。
  简化。转换代码,使它尽可能简单。
  使用细节的统一层面。当把一个方法分解成一组行为时,要保证这些行为在细节的相似层面上。
7.2 用Strategy替换条件逻辑
  当方法中条件逻辑控制着应该执行计算的哪个变体时,为每个变体创建一个Strategy并使方法把计算委托到Strategy实例。
 
动机:
  ——为算法的各个变体生成一系列的类,并用Strategy的一个实例装配主类,主类在运行时委托到该Strategy实例
  复杂的条件逻辑是最常导致复杂度上升的地点之一

优缺点:
  + 通过减少或去除条件逻辑使算法变得清晰易懂
  + 通过把算法的变体搬移到类层次中简化了类
  + 允许在运行时用一种算法替换另一种算法
  – 当应用基于继承的解决方案或“
简化条件表达式”中的重构更简单时,会增加设计的复杂度
  – 增加了算法如何获取或接收上下文类数据的复杂度
7.3 将装饰功能搬移到Decorator
  当代码向类和核心职责提供装饰功能时,可以考虑将装饰代码搬移到Decorator
  无论多么喜欢一个模式,不要在不必要的时候使用它

优缺点:
  + 把装饰功能从类中移除,从而简化类
  + 有效的把类的核心职责和装饰功能区分开来
  + 可以去除几个相关类中重复的装饰逻辑
  – 改变了被装饰对象的类型
  – 会使代码变得更难理解和调试
  – 当Decorator组合产生负面影响的时候,会增加设计的复杂度
7.4 用State替换状态改变条件语句
  当控制一个对象状态转换的条件表达式过于复杂时,可以考虑用处理特殊状态转换的State类替换条件语句

优缺点:
  + 减少或去除状态改变条件逻辑
  + 简化了复杂的状态改变逻辑
  + 提供了观察状态改变逻辑的很好的鸟瞰图
  – 当状态转换逻辑已经易于理解的时候,会增加设计的复杂度
7.5 用Composite替换隐含树
  当用原生表示法隐含的形成了树结构时,可以考虑用Composite替换这个原生表示法
 
优缺点:
  + 封装重复的指令,如格式化、添加或删除结点
  + 提供了处理相似逻辑增长的一般性方法
  + 简化了客户代码的构造职责
  – 当构造隐式树更简单的时候,会增加设计的复杂度
7.6 用Command替换条件调度程序
  当条件逻辑用来调度请求和执行操作时,为每个动作创建一个Command。把这些Command存储在一个集合中,并用获取及执行Command的代码替换条件逻辑。
 
  为每个动作创建一个Command,把这些Command存储在一个集合中,并用获取及执行Command的代码替换条件逻辑
优缺点:
  + 提供了用统一方法执行不同行为的简单机制
  + 允许在运行时改变所处理的请求,以及如何处理请求
  + 仅仅需要很少的代码实现
  – 当条件调度程序已经足够的时候,会增加设计的复杂度

第8章 泛化

  泛化是把特殊代码转换成通用目的代码的过程。泛化代码的产生往往的重构的结果。
8.1 形成Template Method
  当子类中的两个方法以相同的顺序执行相似的步骤,但是步骤并不完全相同。通过把这些步骤提取成具有相同签名的方法来泛化这两个方法,然后上移这些泛化方法,形成Template Method。
 
优缺点:
  + 通过把不变行为搬移到超类,去除子类中的重复代码
  + 简化并有效的表达了一个通用算法的步骤
  + 允许子类很容易的定制一个算法
  – 当为了生成算法,子类必须实现很多方法的时候,会增加设计的复杂度
8.2 提取Composite
  当一个类层次结构中的多个子类实现了同一个Composite时,可以提取一个实现该Composite的超类
 
优缺点:
  + 去除重复的类存储逻辑和类处理逻辑
  + 能够有效的表达类处理逻辑的可继承性
8.3 用Composite替换一/多之分
  当类使用不同的代码处理单一对象与多个对象时,用Composite能够产生既可以处理单一对象又可以处理多个对象的代码
 
优缺点:
  + 去除与处理一个或多个对象相关联的重复代码
  + 提供处理一个或多个对象的统一方法
  + 支持处理多个对象的更丰富的方法
  – 可能会在Composite的构造过程中要求类型安全的运行时检查
8.4 用Observer替换硬编码的通知
  当子类通过硬编码来通知另一个类的实例时可以去除这些子类,并使其超类能够通知一个或多个实现了Observer接口的类
 
优缺点:
  + 使主题及其观察者访问松散耦合
  + 支持一个或多个观察者
  – 当硬编码的通知已经足够的时候,会增加设计的复杂度
  – 当出现串联通知的时候,会增加代码的复杂度
  – 当观察者没有从它们的主题中被删除的时候,可能会造成资源泄漏
8.5 通过Adapter统一接口
  当客户代码与两个类交互,其中的一个类具有首选接口,可以用一个Adapter统一接口
 
动机:
  当下面条件都为真时,重构Adapter就是有用的:
    两个类所做的事情相同或相似,但是具有不同的接口
    如果类共享同一个接口,客户代码会更简单、更直接、更紧凑
    无法轻易改变其中一个类的接口,因为它是第三方库中的一部分,或者它是一个已经被其他客户代码广泛使用的框架的一部分,或者无法获得源码
优缺点:
  + 使客户代码可以通过相同的接口与不同的类交互,从而去除或减少重复代码
  + 使客户代码可以通过公共的接口与多个对象交互,从而简化了客户代码
  + 统一了客户代码与不同类的交互方式
  – 当类的接口可以改变的时候,会增加设计的复杂度
8.6 提取Adapter
  当一个类适配了多个版本的组件、类库、API或其他实体时,可以为组件、类库、API或其他实体的每个版本提取一个Adapter
 
  Adapter用来适配对象,Facade用来适配整个系统,Facade通常用来与遗留系统进行交互
优缺点:
  + 隔离了不同版本的组件、类库或API之间的不同之处
  + 使类只负责适配代码的一个版本
  + 避免频繁的修改代码
  – 如果某个重要行为在Adapter中不可用的话,那么客户代码将无法执行这一重要行为
8.7 用Interpreter替换隐式语言
  当类中的许多方法组合成了一种隐式语言的素,可以为隐式语言的素定义类,这样就可以通过类实例组合,形成易于理解的表达式
 
优缺点:
  + 比隐式语言更好的支持语言素的组合
  + 不需要解析新的代码来支持语言素的新组合
  + 允许行为的运行时配置
  – 会产生定义语言和修改客户代码的开销
  – 如果语言很复杂,则需要很多的编程工作
  – 如果语言本身就很简单,则会增加设计的复杂度

第9章 保护

9.1 用类替换类型代码
  字段的类型无法保护它免受不正确的复制和非法的等同性比较,可以把字段的类型声明为类,从而限制复制和等同性比较
 
优缺点:
  + 更好的避免非法赋值和比较
  – 比使用不安全类型要求更多的代码
9.2 用Singleton限制实例化
  代码创建了一个对象的多个实例,并导致内存使用过多和系统性能下降时,可以用Singleton替换多个实例
 
  不要做不成熟的代码优化,经过不成熟优化的代码比未优化的代码更难于重构。在代码优化之前,你会发现更多可以改进的地方
优缺点:
  + 改进性能
  – 在任何地方都可以很容易的访问。在很多情况下,这可能是设计的缺点
  – 当对象含有不能共享的状态时,本重构无效
9.3 引入Null Object
  当代码中到处都是处理null字段或变量的重复逻辑时,将null逻辑替换为一个Null Object,一个提供正确null行为的对象
 
优缺点:
  + 不需要重复的null逻辑就可以避免null错误
  + 通过最小化null测试简化了代码
  – 当系统不太需要null测试的时候,会增加设计的复杂度
  – 如果程序员不知道Null Object的存在,就会产生多余的null测试
  – 使维护变得复杂,拥有超类的Null Object必须重写所有新继承到的公共方法

第10章 聚集操作

10.1 将聚集操作搬移到Collecting Parameter
  有一个很大的方法将信息聚集到一个局部变量中时,可以把结果聚集到一个Collecting Parameter中,并将它传入被提炼出的方法中
 
优缺点:
  + 帮助我们把很大的方法转换成更小的,更简单的多个方法
  – 使结果代码运行得更快
10.2 将聚集操作搬移到Visitor
  有一个方法从不同的类中
聚集信息,可以把聚集工作搬移到一个能够访问每个类以便采集信息的Visitor中。
 
优缺点:
  + 调节多个算法,使其适用于不同的对象结构
  + 访问相同或不同继承结构中的类
  + 调用不同类上的类型特定方法,无需类型转换
  – 当可以使用通用接口把互不相同的类变成相似类的时候,会增加代码的复杂度
  – 新的可访问类需要新的接收方法,每个Visitor中需要新的访问方法
  – 可能会破坏访问类的封装性

第11章 使用重构

11.1 链构造函数
  有很多包含重复代码的构造函数时,可以把构造函数链接起来,从而获得最少的代码重复。
11.2 统一接口
  当需要一个与其子类具有相同接口的超类或接口时,可以找到所有子类含有而超类没有的公共方法,把这些方法复制到超类中,并修改每个方法,使其执行空行为。
11.3 提取参数
  Navicat Premium 10.1.3激活 当一个方法或构造函数将一个字段赋值为一个局部实例化的值时,可以把赋值声明的右侧提取到一个参数中,并通过客户代码提供的参数对字段进行赋值。

今天的文章
Navicat Premium 10.1.3激活(重构与模式:改善代码三部曲中的第三部)分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/116934.html

(0)
编程小号编程小号
上一篇 2024-07-18
下一篇 2024-07-18

相关推荐