Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CRUD体系结构设计-反序列化_Java_Serialization_Architecture - Fatal编程技术网

Java CRUD体系结构设计-反序列化

Java CRUD体系结构设计-反序列化,java,serialization,architecture,Java,Serialization,Architecture,我有一个Java应用程序来对产品对象执行CRUD操作。 架构是: ProductRepository->数据库通信 ProductService->业务逻辑 ProductController->API路由 ProductDeserializer->从API对象创建新产品 ProductSerializer->从产品创建API对象 产品流的创建过程如下: API->ProductController->ProductDeserializer->ProductService->ProductRep

我有一个Java应用程序来对产品对象执行CRUD操作。 架构是:

ProductRepository->数据库通信

ProductService->业务逻辑

ProductController->API路由

ProductDeserializer->从API对象创建新产品

ProductSerializer->从产品创建API对象

产品流的创建过程如下:

API->ProductController->ProductDeserializer->ProductService->ProductRepository

在ProductService中创建的方法如下所示:

(一)

问题是:这样做是否更简单、更好:

(二)

理由1):

  • 创建产品是服务的责任,而不是反序列化程序
理由(2):

  • 责任是共享的,反序列化器确保格式,服务添加业务逻辑和验证
  • 一家汽车制造厂被赋予组装零件的权利,它是否会重建和重新组装所有零件?不,它只是验证和组装它们

这个例子被简化了,但是如果我必须为产品开发复制功能,那么编码和维护将需要一些时间,而且似乎要重复反序列化程序中完成的工作。

如果您只是制作同一产品的另一个副本,我看不出创建一个单独的副本然后保存该副本会有什么用处/好处。验证本身应该很好,因此#2看起来不错


我认为执行#1的唯一原因是当您有不同的服务对象,并且在保存之前以某种方式对其进行处理(可能是基于呼叫者是移动设备而不是桌面浏览器等)。在这种情况下,反序列化的产品将不同于保存的产品,您可能需要进行复制。

我不认为这是1的理由。这是有效的。服务没有责任创建产品,API的客户端已经创建了,服务有责任验证和保存(通过存储库)产品。另外,反序列化程序不应该得到太多的关注,因为它只用于方便地处理数据。我已经想到了API客户端的责任,但忘了提到它,谢谢@ÁkosRatkuYou是对的@Guanxi,这比我第一次说的要复杂。我编辑了问题,并添加了产品品牌的loadBrand作为示例。该品牌必须重新加载。对于一个新的新产品拷贝,只需执行loadBrand就足够了,但是如果我们重用反序列化对象,我们需要进行一些清理。
public Product create(Product product) {
   validateInput(product);
   Product newProduct = new Product();
   copy(product, newProduct);
   loadBrand(newProduct);
   return productRepository.save(newProduct);
}
public Product create(Product product) {
   validateInput(product);
   cleanupBrand(product);
   loadBrand(product);
   return productRepository.save(product);
}