【发布时间】:2011-01-05 08:20:08
【问题描述】:
问题
我有一些代码可以将以关系形式存储的数据转换为域模型。源不是 RDBMS,而是一组生成的“表”类。这些表类可与java.sql.ResultSet 进行比较,每个表类代表一组数据:订单、订购商品、交货、发票、序列号。
转换代码通过遍历表从头开始创建域模型的层次结构。它创建适当的模型对象,将它们连接到其他模型对象等等。完成后,它会返回领域模型(订单列表)。
问题是转换代码都被塞到一个类中,涵盖了数据的不同方面,因此很难进行单元测试、查找错误或扩展它。我需要维护这段代码多年,真的很想以某种方式拆分它,但我不确定哪种设计模式可以很好地应用在这里。
想法
我倾向于将代码重构为访问者模式:
- 引入一个容器类来公开对表对象的引用(例如
getOrdersTable()、getOrderItemsTable()) - 为此容器类创建多个访问者类。每个访问者都涵盖了源数据的一个方面:一个是自己创建订单对象,另一个是创建交付对象并将它们连接到相应的订单对象中,等等。
但是,我不确定以下问题:
- 访问者不仅可以使用他们访问的表对象,还可以使用其他访问者创建的对象(后者都可以通过作为域模型根的订单列表访问)。因此,调用访问者的顺序很重要。
- 访问者模式通常在节点层次结构的上下文中进行解释,但我不会让它们访问层次结构,他们会创建一个层次结构。
问题
Visitor 是一个不错的选择,还是您会选择另一个众所周知的模式?或者这是没有设计模式适用的情况,我应该避免(错误)使用模式术语?
以上任何问题对于访问者来说是否异常?如果是这样,您认为无论如何实现 Visitor 会使代码混乱吗?毕竟,模式是为了匹配直观的期望并提高代码的意义。
上下文信息
- 我可以安全地向表类添加方法(每个都包含一个抽象生成类和一个用于手动修改的子类)或让它们实现接口,但不能修改它们的公共超类或引入新超类。
- 表集相对稳定,但可能会添加新列。此外,转换逻辑本身也有一定程度的变化(例如,跳过哪些订单,或映射数据的特殊情况)
- 领域模型本身比较干净,我无意以非向后兼容的方式更改它,甚至完全替换它。
- 这是关于 Java 代码的。
- 不需要线程安全。
【问题讨论】:
标签: oop design-patterns