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

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

💡 原文中文,约9000字,阅读约需22分钟。
📝

内容提要

本文介绍了 OpenRewrite 中配方和访问者的应用,配方用于代码重构,访问者用于遍历无损语义树。通过示例展示了如何为指定类添加注解,强调了二者的灵活性与可扩展性。

🎯

关键要点

  • 本文介绍了 OpenRewrite 中的配方和访问者,配方用于代码重构,访问者用于遍历无损语义树。

  • 访问者模式将算法与对象结构分开,遵循开放/封闭原则。

  • 配方是一组逻辑集合,可对无损语义树执行搜索和重构操作,可以独立或组合使用。

  • ScanningRecipe 是一种特殊的配方,用于生成新源文件或查看所有源文件。

  • 执行流水线指示如何对源文件应用配方,并执行代码转换任务。

  • 执行上下文用于在多个配方及其访问者之间共享状态。

  • 执行周期可能会重复多次运行整个 Recipe 链,直到没有新的修改或达到最大循环次数。

  • 流水线成功执行后会生成 Result 实例集合,提供对源文件更改的信息。

  • 访问者模式中有三个角色:被处理的对象结构、发起处理的客户端应用和执行处理逻辑的访问者。

  • OpenRewrite 提供的 visitElement 方法默认采用深度优先的方式对树进行遍历。

  • Tree 是所有无损语义树的实现接口,TreeVisitor 提供了访问者的多态导航和生命周期管理。

  • Cursor 用于在遍历无损语义树时跟踪访问者的位置。

  • 示例中展示了如何为指定类添加注解,强调了 JavaTemplate 的使用。

  • 总结了配方与访问者的结合如何灵活、可扩展地对大规模代码库进行修改和改进。

🔎

延伸解读

访问者模式的优势

访问者模式通过将算法与对象结构分离,使得在不修改对象结构的情况下添加新操作成为可能。这种设计遵循开放/封闭原则,适合需要频繁扩展功能的项目,尤其是在大型代码库中,能够有效减少代码的耦合度。

配方的灵活性与组合性

配方不仅可以独立使用,还可以与其他配方组合,形成复杂的重构方案。这种灵活性使得开发者能够根据项目需求,快速调整和优化代码结构,尤其在框架迁移等场景中,能够显著提高效率。

执行周期的注意事项

在执行流水线中,配方的修改可能会触发其他配方的执行,导致执行周期的重复。开发者需要注意控制最大循环次数,以避免不必要的性能损耗,同时确保代码在每个周期内达到预期的修改效果。

延伸问答

OpenRewrite 中的配方是什么?

配方是一组可对无损语义树执行搜索和重构操作的逻辑集合,可以独立或组合使用。

访问者模式在 OpenRewrite 中的作用是什么?

访问者模式将算法与对象结构分开,负责遍历和操作无损语义树,遵循开放/封闭原则。

如何在 OpenRewrite 中执行配方?

通过调用配方的 run() 方法并提供源文件,启动转换过程,配方会依次经历校验和处理步骤。

什么是 ScanningRecipe,它有什么特别之处?

ScanningRecipe 是一种特殊的配方,用于生成新源文件或查看所有源文件,扩展了 Recipe,添加了 accumulator 和 scanner。

执行上下文在 OpenRewrite 中的作用是什么?

执行上下文用于在多个配方及其访问者之间共享状态,确保配方在执行时能够访问必要的信息。

如何为指定类添加注解的配方示例是怎样的?

通过创建 AddAnnotation 类,重写 visitClassDeclaration 方法,检查类是否已存在注解并添加新注解。

🏷️

标签

➡️

继续阅读