【问题标题】:How do I Implement this design to remove code repetition如何实现此设计以消除代码重复
【发布时间】:2013-09-30 07:48:41
【问题描述】:

我的应用程序有大约 50 个在 UI 中以网格格式显示的实体。所有 50 个实体都有 CRUD 操作。大部分操作都有标准流程

即。对于获取,从存储库中读取实体,转换为 DTO 并返回 DTO 的列表。 用于创建/更新/删除 - 获取 DTO - 转换为实体,使用存储库在数据库上创建/更新/删除,返回更新的 DTO

请注意,对于某些实体,还需要执行一些特定于实体的操作。

目前,我们为所有实体提供了一个 get/create/update/delete 方法,例如 获取产品 创建产品 更新产品 获取客户 创建客户 更新客户 在每种方法中,我们使用 Product/Customer 存储库在从 entity -> dto 转换后执行 CRUD 操作,反之亦然。

我觉得有很多代码重复,必须有一种方法可以删除这么多这些方法。

我可以使用一些模式(命令模式)来避免代码重复吗?

【问题讨论】:

  • @AdamArold,我应该想象,如果有 50 个奇怪的实体,那么需要大量代码转储到一个问题中。对于操作来说,一个更好的问题可能是,例如,您是否从数据库中自动生成代码?例如,在 NetBeans 中,我可以将它指向一个数据库并让它生成大部分的 crud。它使维护变得容易。任何特定的附加逻辑都应该放在包装器之外(请参阅装饰器)

标签: java design-patterns


【解决方案1】:

查看Spring Data JPAhere 项目。它取消了 DAO 的样板代码。

我相信它基本上是使用 AOP 来解释像

这样的调用
findByNameandpassword (String name,String passwd) 

根据选择方法名称中的字段时传递的参数进行查询(仅一个接口)。

作为一个 spring 项目,它对 spring 库的要求非常低。

【讨论】:

  • 要添加,从实体 DTO 转换,您可以使用Dozer,再次为您节省一些代码。
  • 我使用 Moo 来完成这项工作,但 Dozer 肯定是另一个合理的选择。
【解决方案2】:

基本上,您有两种方法可以做到这一点。

第一种方式:代码生成

编写一个可以在给定数据库架构的情况下生成代码的类。 请注意,您将为每个实体创建基本类。 如果您有自定义代码(特定于某些实体的代码),您可以将其放在子类中,以便在重新生成基本类时不会被覆盖。

对象实例化应该通过工厂方法,以便使用正确的子类。

确保在生成的代码中添加 cmets,明确说明代码是自动生成的(这样人们就不会直接开始编辑它们)。

第二种方式:反射

这个解决方案虽然更优雅,但也更复杂。 您拥有一个可以处理任何实体的基本类,而不是为每个实体生成一个基本类。该类将使用反射来访问 DTO:s。

如果您有自定义代码(特定于某些实体的代码),您可以将其放在其他类中。这些其他类将被注入到泛型类中。

使用反射需要对您的 DTO:s 制定严格的命名策略。

结论

我在一个项目中使用迁移项目中的第一种方法为新应用程序服务器(运行 java)和胖客户端之间的服务接口生成 DTO 类,并且效果很好。我们有超过 100 个生成的 DTO 类。我知道您正在尝试的内容略有不同。编辑数据库记录是一个普遍的问题(所有项目都需要它),但没有(m)任何框架。

我一直在考虑为它创建一个通用工具或框架,但我从来没有考虑过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多