最新文章

OpenRewrite 学习笔记(三):重构配方 Recipe 与访问者 Visitor

OpenRewrite 学习笔记(三):重构配方 Recipe 与访问者 Visitor

今天这篇我们来学习配方 Recipe 和访问者 Visitor,之所以一起介绍这两个是因为在 Recipe 的设计中使用了 访问者模式(Visitor Pattern)

访问者模式是一种将算法与对象结构分开的软件设计模式。得益于这种分离,在将新操作添加到现有对象结构中时,无需修改对象结构。它是面向对象编程和软件工程中遵循开放/封闭原则的一种方法。

– 维基百科

配方 Recipes

配方(Recipe)是一组可对 无损语义树(LST) 执行搜索和重构操作的逻辑集合。配方既可以代表一个独立的微小变更,也可以与其他配方组合,形成实现更复杂目标(如框架迁移)的大型改造方案。

OpenRewrite 提供了一个托管环境,用于发现、实例化和配置配方。在实现搜索或重构操作时,配方会委托给访问者(Visitor),由其负责抽象语法树(LST)的遍历和操作。

在第一篇的快速上手中,我们使用了配方 ChangeMethodName 将方法 hello 名改为 gretting

扫描配方 Scanning Recipe

这是一个特别的 Recipe。如果一个 Recipe 需要生成新的源文件或者需要在进行更改前查看所有源文件,那它必须是 ScanningRecpie

在实现层面 ScanningRecipe 扩展了 Recipe ,添加两个关键对象:accumulatorscanner

  • accumulator 是由 Recipe 自身来定义的数据结构,用于存储 Recipe 运行时所需的任何信息。
  • scanner 是一个用数据来填充 accumulatorVisitor #visitor

除了两个对象外,ScanningRecipe 还提供了方法定义 getScanner() 这个方法需要子类来实现,返回值也是一个访问者 Visitor(在后面我们会介绍)。