2011-07-08 33 views
0

我來自OOP背景,因此一直在尋找建模我的解決方案的最佳方法;我想提出兩種不同的僞造設計,並問哪種更好;特別是在基於MVC的Web應用程序中。代碼是僞代碼和用例,所以我如何解決業務問題並不是真正的導入;只有設計的風格。Web應用程序中的服務層 - 我應該隱藏服務對象嗎?

經典服務界面風格

//create the page, a valid user needs to 
CustomPage page = pageService.createCustomPage(session.getUser(), aDocument, "my page", "my content"); 
page.setLayout(Layout.NORMAL); //set the page layout 
page.setPublished(true); //set it to publish 
pageService.save(session.getUser(), page); //actually persist new layout and publish 

替代隱藏的服務風格

//create a page editable by the user 
CustomPage page = pageService.createCustomPage(session.getUser(), aDocument, "my page", "my content"); 
page.setLayou(Layout.NORMAL); //changes the layout 
page.publish(); //publishes the page 

的主要區別是,在經典的款式,CustomPage是一個愚蠢的對象。它只保留屬性,並可能基於屬性值的一些基本行爲。除非與服務一起使用,否則擁有對象本身的實例是無用的。在另一種風格中,CustomPage擁有對服務和當前正在編輯它的用戶的隱藏引用。所以當我publish()對象可以做它自己的事情,以及調用事務方法。

經典風格的明顯優勢是您可以安全地使用CustomPage作爲模型,用戶更改內容時不會嘗試調用任何事務性方法,而使用替代方法時您需要使用命令對象收集用戶輸入,然後將其應用於對象。但是,這種替代方法使開發人員不那麼複雜。 page.publish()實際上發佈了該頁面,如果我們想知道用戶是誰,我們不需要再提供它。

這兩種方法都好還是壞?有什麼好的資源可以閱讀,討論這些類型的設計和權衡?

回答

1

正如你已經提到沒有權利錯誤答案在這裏。我的觀點:一般來說,我喜歡OO風格的選項#2,即在智能對象的內部維護其狀態。我在事務性應用程序開發方面的經驗是,更容易維護選項#1。我們有一個智能服務和一些愚蠢的數據傳輸對象。

我會考慮我過去使用過的第三種方法。另一層:-)

如果您的業務對象變得非常複雜,例如而維持其狀態在多個數據庫表或系統,它可能是有意義的介紹演示和服務層之間的業務對象層:

  1. 演示(網絡)層使用業務對象
  2. 業務對象返回愚蠢的數據傳輸對象到網絡層和封裝對服務層

複雜的呼叫在僞代碼(網絡層):

CustomPageEntity page = new CustomPageEntity(someUID); 
page.setLayout(Layout.NORMAL); 
CustomPageDTO pageDTO = page.save(); 
return pageDTO; // forward pageDTO for further processing 

業務對象層(在CustomPageEntity內):

public CustomPageEntity(someUID) { 
    service.getCustomPageDTO(someUID); 
} 

public CustomPageDTO save() { 
    service.store(this.layout, ...); 
} 

希望你讓我...我的2分

相關問題