我继承了一个使用 Struts、Spring 和 Hibernate 的大型 Java 应用程序。我每天处理的类和接口有:Struts Actions、Struts ActionForms、值对象、服务接口和实现、DAO 接口和实现以及实体。我很清楚其中大多数的方式和原因,除了我不确定 ActionForms、Value Objects 和 Entities 之间的职责是否正确分离。我还应该提到域模型(即所有实体)不包含太多(如果有的话)真实的业务逻辑。这本质上是一个 CRUD 应用程序,大部分真正的逻辑都在数据库中(糟糕!)。无论如何,我想知道几个不同的 Java 相关问题:
1) Entities 和 Value Objects (VOs) 之间似乎没有太大区别,并且当它们以任一方向通过服务层时,必须编写大量代码才能转换为另一个(Struts Actions 只处理VOs、DAOs 只处理实体)。因此,VO 和实体似乎有些多余。为什么两者都有?
2)VO<->实体翻译代码应该去哪里?服务层、实体、VO?
3) VO 被直接放入ActionForms 并直接绑定到JSP 中的标签(例如)。这是一个好习惯吗?如果不是,那么合适的设计是什么?
4) 不清楚如何正确处理值对象中的外键依赖关系。例如,某些 VO 有一个类型字段,在数据库术语中,它表示与类型表的外键关系。在 UI 中,这转换为一个下拉字段,允许用户选择类型,或者一个标签,仅显示类型的文本表示(取决于它是哪个屏幕)。现在,VO 是否应该具有类型 ID 的属性、类型的文本表示,或两者兼而有之?谁负责在两者之间进行翻译,何时翻译?
5) VO 有一个字段作为其数据库 ID。我以为VO没有身份?这是怎么回事?
我希望这些问题足够笼统,足以引起人们的普遍兴趣。在这种类型的架构中,这似乎会一直出现。
另外,我怀疑这个架构对于这个应用来说太重了,如果你有更好的建议,请继续。但我主要对上述问题的答案感兴趣,因为不同的架构是我现在无法进行的长期重构。