如何实现此设计以删除代码重复

时间:2013-09-30 07:48:42

标签: java design-patterns

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

即。 for get,从存储库读取实体,转换为DTO并返回DTO列表。 for create / update / delete - 获取DTO - 转换为实体,使用存储库在DB上创建/更新/删除,返回更新的DTO

请注意,对于某些实体,还有一些特定于实体的操作必须完成。

目前,我们为所有实体提供了get / create / update / delete方法 的getProducts createProducts updateProducts GetCustomers的 createCustomers updateCustomers 在每种方法中,我们使用产品/客户存储库来执行从实体转换后的CRUD操作 - > dto,反之亦然。

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

我可以使用一些模式(COMMAND PATTERN)来逃避代码重复吗?

2 个答案:

答案 0 :(得分:0)

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

我认为它基本上使用AOP来解释像

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

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

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

答案 1 :(得分:0)

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

第一种方式:代码生成

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

对象instatiation应该通过Factory方法,以便使用正确的子类。

确保在生成的代码中添加注释,明确指出代码是自动生成的(以便人们不要直接开始编辑代码)。

第二种方式:反思

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

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

使用反射需要在DTO上使用严格的命名策略:s。

<强>结论

我在一个项目中使用迁移项目中的第一个方法来为新应用程序服务器(运行java)和胖客户端之间的服务接口生成DTO类,并且它运行良好。我们有100多个生成的DTO课程。我知道你所尝试的是微不足道的。编辑数据库记录是一个普遍问题(所有项目都需要它),但是没有任何框架可供使用。

我一直在考虑为它创建一个通用工具或框架,但我从未接触过它。

相关问题