如果沒有業務邏輯可執行,則沒有理由執行業務層。三層體系結構不是一個神祕的協議,只是業務處理過程中形成的最佳實踐。
在當前的應用程序中,我們經常在沒有涉及業務流程的情況下直接從JSF控制器訪問DAO。這個想法是由java champion給出的,他強調了簡單性至關重要的觀點。
如果您擔心未來可能需要添加業務邏輯的修改。我這樣思考問題:無論如何,額外的業務邏輯將被添加到業務層,包括數據訪問,所以這裏沒有區別。
CRUD代碼大多非常簡單。因此,服務中的更改將等於將DAO中的一個調用或幾個調用重新路由到一個EJB - 這是一個簡單的重構。 CRUD代碼本身仍然存在,但會被推入到EJB中 - 另一個簡單的重構。
這並不完美,但IMO更好,然後替代方案:有一個空的間接層。這增加了無用的複雜性。業務對象只會將呼叫轉發給DAO。
有兩個code smells,我認爲適用於這種情況:人爲的複雜性和feature envy。
我不是說業務層中的DA是某種代碼味道。我的意思是有一個沒有別的的業務對象,但代理DAO是一種氣味。這與複雜性相同 - 一個沒有自己的目的的增加的數據結構/架構層 - 似乎應用程序中已經有了DAL。
您考慮的另一方面是 - 開發人員看到直接使用DAO的服務有多令人驚訝?有5個服務,其中2個直接訪問DAO不同於100個服務,其中只有一個服務直接訪問DAO。在第一種情況下,代碼的簡單性將超過增加的概念複雜性(2個概念對於單一事物),在第二種情況下,我寧願堅持業務層 - 驚喜(也稱爲WTF效應; )以不同的方式做一次就太大了。
和往常一樣,晶瑩剔透!雖然這個問題在ins性質上是自相矛盾的('我怎麼總是跳過依賴它的應用程序中的中間層')。 – skuntsel 2013-04-25 10:57:55
@skuntsel - 謝謝:)是啊,如果DAO被認爲是業務層的一部分,那麼你就用3層固定 - 對我來說DAO是DAL的一部分,所以我失去了一層廉價的口頭語言訣竅;) – kostja 2013-04-25 12:09:06
如果在一段時間後你必須在做CRUD操作之前添加一些業務呢?如果您在Service層中添加業務代碼的方式是錯誤的,因爲服務不應該有業務代碼,所以您必須在業務層中添加業務,更改服務以獲得業務並完成其工作,因此您必須更改2個不同的地點以添加商業。這是我相信的問題! – 2013-04-25 13:36:27