模式重构

模式是某种场合下对某个问题的一个解决方案的一种结构化展现。 —— Jon Vlissides(GoF 成员)《设计模式沉思录》

不过,人们对于设计模式的看法就变成了砒霜,听上去有害,实际上真香。

我不是想鼓励使用设计模式,只是呢,如开头所说,我想展示的是如何用它来提升代码的可读性。也因此,我们的第一个例子是,干掉反模式的设计模式。

一旦你决定使用某种设计模式的时候,请确保团队的所有人知道它解决了什么问题?

终止 Singleton

确保一个类只有一个实例,并提供一个全局访问点来访问该实例。—— 《设计模式:可复用面向对象软件的基础》

单例对象存活的时间通常很长,它们通常存在于程序的整个生命周期中。一个复杂应用可能有很多个单例,会使得上述问题更加严重。

整体来说它的缺点大过优点:

  1. 对单例类的依赖被硬编码到其他类中,对具体类的依赖性破坏了OO。
  2. 单例对接口不友好。
  3. 单例getInstance没有继承性。
  4. 多线程情况下有线程安全问题。

工厂封装复杂构建

工厂是领域驱动设计中的重要组件。

工厂的目标:

  1. 隐藏创建对象的复杂性
  2. 减少对外暴露过多的内部结构

工厂模式是一种创建方法:

  1. 工厂方法(factory method)
  2. 抽象工厂(abstracty factory)
  3. 建造者模式(builder)

值得注意的是:工厂并不总是需要独立的静态类。尝试使用 coca suggest 会有惊喜。

重构手法

对应的手法是:

  1. 提取构建步骤到新的构建方法中
  2. 将构建步骤方法转为 static 方法
  3. 将这个 static 方法移到工厂类中
  4. 将旧的构建函数提取成工厂方法
  5. 将提取的工厂方法移到类中
  6. 内联原有的工厂使用方

策略模式提供易变规则

我们需要把过程中的易变部分提取到模型的一个单独的『策略』对象中,将规则与它控制的行为分开。——《领域驱动设计:软件核心复杂性应对之道》

看标题,你懂的。

建造者模式拆解复杂对象

看标题,你懂的。

工具:自动化识别

如 Coca 提供的 coca suggest功能,可以对相应的类提供一些建议,如:

CLASS PATTERN REASON
Insect factory too many constructor
Bee factory, builder complex constructor, too many constructor, too many parameters
下一节:理想的方法长度不应该超过 4 行代码。—— Robert C Martin