javascript
Spring Web 应用的最大败笔
來源:http://t.cn/EM8ROEb
開發(fā)人員在使用Spring應(yīng)用時非常擅長談?wù)撘蕾囎⑷氲暮锰帯2恍业氖?#xff0c;他們沒有真正的利用到它的好處,如單一職責(zé)原則,分離關(guān)注原則。如果我們一起來看看大部分Spring的Web應(yīng)用程序,常見的錯誤的設(shè)計如下:
1.領(lǐng)域模型對象用來存儲應(yīng)用的數(shù)據(jù)(當(dāng)作DTO使用),領(lǐng)域模型是貧血模型這樣的反模式。
2.業(yè)務(wù)邏輯位于管理域?qū)ο髷?shù)據(jù)的服務(wù)層中。
3.服務(wù)層每個實體有一個服務(wù)。
問題是這樣很普遍,錯誤在哪里呢?
Spring的web應(yīng)用程序之所以這樣是因為他們做事的方式一直都是這樣做的,老習(xí)慣難改,特別是如果他們是高級開發(fā)人員或軟件架構(gòu)師,這些人捍衛(wèi)這樣做的論據(jù)之一是:我們的應(yīng)用程序遵循關(guān)注分離的原則,因為它已經(jīng)被分為若干層,每個層都有自己的特定職責(zé)。
典型的SpringWeb應(yīng)用程序具有以下幾層:
1.Web層負(fù)責(zé)處理用戶輸入,并返回正確的響應(yīng)給用戶。 web層與服務(wù)層通信。
2.服務(wù)層作為一個事務(wù)邊界,它也負(fù)責(zé)授權(quán)和包含我們的應(yīng)用程序的業(yè)務(wù)邏輯。服務(wù)層管理領(lǐng)域模型對象,并與其他服務(wù)和存儲層進(jìn)行通信。
3.存儲庫/數(shù)據(jù)訪問層負(fù)責(zé)與所使用的數(shù)據(jù)存儲進(jìn)行通信。
分離關(guān)注(Soc)是分離計算機(jī)程序為不同的部分,每個部分有一個關(guān)注聚焦,一個典型的Spring Web應(yīng)用在一定程度上遵循這一原則,但現(xiàn)實是,該應(yīng)用程序有一個整體的服務(wù)層,它有太多的責(zé)任。更具體地,服務(wù)層有兩個主要問題:
1.在服務(wù)層發(fā)現(xiàn)業(yè)務(wù)邏輯
業(yè)務(wù)邏輯被分散在各個服務(wù)層。如果我們需要檢查一個業(yè)務(wù)規(guī)則是如何實現(xiàn)的,我們必須先找到它。這可能并不容易。此外,如果相同的業(yè)務(wù)規(guī)則需要在多個服務(wù)類,問題是,規(guī)則需要從一個服務(wù)到另一個服務(wù)簡單地復(fù)制。這將導(dǎo)致維護(hù)的噩夢。
2.每個領(lǐng)域模型一個服務(wù)
這完全違反了單一職責(zé)原則,它被定義為如下:單一職責(zé)原則指出,每一個類都應(yīng)該有一個責(zé)任,責(zé)任應(yīng)該由類完全封裝。其所有的服務(wù)應(yīng)該狹義與責(zé)任相一致。(不應(yīng)將原屬于領(lǐng)域模型的行為方法等劃放在服務(wù)中實現(xiàn),對象不但有屬性還有行為)
服務(wù)類有很多依賴,以及大量的循環(huán)依賴。更像網(wǎng)絡(luò)緊密耦合和單體服務(wù)。這使得很難理解,維護(hù)和重用。這聽起來有點苛刻,但一個Spring的web應(yīng)用的服務(wù)層往往是最容易出問題的部分。幸運(yùn)的是,所有的希望都不會丟失。
1. 我們必須將我們的應(yīng)用程序的業(yè)務(wù)邏輯從服務(wù)層遷移到領(lǐng)域模型類中。
舉個例子:假設(shè)我是一個服務(wù)類,你是一個域模型對象。如果我讓你從屋頂上跳下來,你會喜歡我這樣的決定嗎?(跳下來會摔傷,自己沒有腦子或被洗腦,變成僵尸,只聽從執(zhí)行,不思考自己的安全,這就是貧血模型的問題)
將業(yè)務(wù)邏輯從服務(wù)層遷移到域模型類有下面三個優(yōu)勢:
(1)我們的代碼將以邏輯方式切割,服務(wù)層只要關(guān)注應(yīng)用邏輯,而我們的領(lǐng)域模型關(guān)注業(yè)務(wù)邏輯。
(2)業(yè)務(wù)邏輯只存在一個地方,容易發(fā)現(xiàn)修改。
(3)服務(wù)層的源代碼是清潔的,不包含任何復(fù)制粘貼代碼
2. 將每個實體服務(wù)切割為單一目標(biāo)的更小的服務(wù)。
比如,有一個單一服務(wù)類,提供對人員和用戶賬戶的CRUD操作,我們應(yīng)該將它分為兩個獨立的服務(wù)類:
第一個是對人員的提供CRUD操作
第二個是提供與用戶賬戶相關(guān)的操作。
好處:每個服務(wù)類中有一個邏輯組職責(zé)。每個服務(wù)類的依賴較少,這意味著他們不再是緊耦合的源頭。他們是較小的和松耦合的組件。服務(wù)類更容易理解,維護(hù)和重用。
這兩個簡單的步驟將幫助我們使得我們的應(yīng)用程序架構(gòu)更干凈,有助于同行開發(fā)商提高生產(chǎn)力。
總結(jié)
以上是生活随笔為你收集整理的Spring Web 应用的最大败笔的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8 张图,看你是否理解 Java
- 下一篇: Spring Boot 2动态修改日志级