2015-09-15 30 views
1

我有一個Java應用程序對Product對象執行CRUD操作。 的架構是:CRUD體系結構設計 - 反序列化

ProductRepository - >數據庫通信

ProductService - >業務邏輯

ProductController的 - > API路線

ProductDeserializer - >從API對象來創建新的產品

ProductSerializer - >從產品創建API對象

一個產品流的創建雲:

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

的方法,在ProductService創建看起來像:

1)

public Product create(Product product) { 
    validateInput(product); 
    Product newProduct = new Product(); 
    copy(product, newProduct); 
    loadBrand(newProduct); 
    return productRepository.save(newProduct); 
} 

現在的問題是:是更簡單,更好的只是做:

2)

public Product create(Product product) { 
    validateInput(product); 
    cleanupBrand(product); 
    loadBrand(product); 
    return productRepository.save(product); 
} 

參數1):

  • 這是服務的責任打造的產品,而不是解串器

參數爲2):

  • 責任是共享的,反序列化器確保格式,服務添加業務邏輯和驗證。
  • 難道一個汽車工廠,被賦予零件組裝重建和remolds所有零件?不,它只是驗證它們並組裝它們。

這個例子被簡化了,但是如果我必須開發產品的複製功能,它需要一些時間來編碼和維護,並且似乎重複了在解串器中完成的工作。

+0

我不認爲1的論點是有效的。該服務不負責創建該產品,您的API的客戶端已經這樣做,該服務有責任驗證並保存(通過存儲庫)該產品。另外,反序列化器不應該太過關注,因爲它只是用來方便地處理數據。 –

+0

我想到了API客戶端的責任,忘了提及它,謝謝@ÁkosRatku –

回答

1

如果你只是做同一產品的另一個副本,我看不出有什麼用/好處你會創建一個獨立的副本,然後保存該副本獲得。驗證本身應該很好,所以#2看起來不錯。

我認爲這樣做#1的唯一原因是當你有一個不同的服務對象,並得到保存之前,這是獲得處理某種方式(可根據來電者是一個移動設備VS桌面瀏覽器等)。在這種情況下,得到解毒的產品將與獲得保存的產品不同,您可能想要複製。

+0

你是對的@關西,它比我剛纔說的要複雜。我編輯了問題,並添加爲產品品牌的示例loadBrand。品牌必須重新加載。如果有新的產品副本,則足以執行loadBrand,但如果我們重新使用反序列化的對象,則需要進行一些清理。 –