javascript
Spring项目的按层打包已过时
我認(rèn)為Spring應(yīng)用程序不應(yīng)該以逐層方法構(gòu)建。 在我看來(lái),按功能打包更有意義。
首先,讓我簡(jiǎn)要描述每種方法。
“按層打包”(在非Java世界中為“按類型折疊”)
該項(xiàng)目結(jié)構(gòu)根據(jù)源代碼文件所屬的體系結(jié)構(gòu)層將它們分為包/目錄:
. └── net└── lkrnac└── blog├── Application.java├── persistence│?? ├── ProjectRepository.java│?? └── UserRepository.java├── dto│?? ├── ProjectDto.java│?? └── UserDto.java├── model│?? ├── Project.java│?? └── User.java├── service│?? ├── ProjectService.java│?? └── UserService.java└── web├── ProjectController.java└── UserController.java“按功能打包”(非Java世界中的“按功能折疊”)
另一方面,此方法將屬于系統(tǒng)內(nèi)某些功能的文件組合在一起:
. └── net└── lkrnac└── blog├── Application.java├── project│?? ├── ProjectController.java│?? ├── ProjectDto.java│?? ├── Project.java│?? ├── ProjectRepository.java│?? └── ProjectService.java└── user├── UserController.java├── UserDto.java├── User.java├── UserRepository.java└── UserService.java發(fā)展趨勢(shì)
這個(gè)話題使我很久了。 當(dāng)我用谷歌搜索“按層打包”還是“按功能打包”還是“按類型打包”還是“按功能打包”時(shí),“按功能”結(jié)構(gòu)的支持者似乎越來(lái)越多。 我也在這個(gè)營(yíng)地。
但是不僅應(yīng)用程序開發(fā)人員是它的支持者。 Angular(最著名的單頁(yè)應(yīng)用程序框架之一)正在其樣式指南中推廣此類文件夾結(jié)構(gòu)。
Spring項(xiàng)目結(jié)構(gòu)
由于有很多關(guān)于每種方法的利弊的文章,我將重點(diǎn)介紹對(duì)Spring項(xiàng)目的影響。
放下Spring CRUD應(yīng)用程序的傳統(tǒng)結(jié)構(gòu)(如果您的后端應(yīng)用程序未使用Spring Data REST)分為三層:Web /服務(wù)/持久性。 我從事的大多數(shù)Java / Spring項(xiàng)目都遵循這種結(jié)構(gòu)。
耦合
逐層封裝很可能起源于上個(gè)世紀(jì),在那里分層結(jié)構(gòu)被用作去耦機(jī)制。 實(shí)際上,當(dāng)我挑戰(zhàn)逐層結(jié)構(gòu)時(shí),“去耦”通常是答案。 我不同意。 對(duì)我來(lái)說(shuō),逐層封裝是導(dǎo)致緊密耦合的主要原因之一。
在逐層結(jié)構(gòu)化項(xiàng)目中為類編寫簽名時(shí),第一個(gè)關(guān)鍵字是什么? 我敢打賭這是公開的。 公共訪問(wèn)修飾符是否有助于解耦? 我想沒(méi)有人會(huì)回答 是這個(gè)問(wèn)題。
為什么開發(fā)人員到處使用公共訪問(wèn)修飾符? 正是因?yàn)樵擁?xiàng)目是以分層方式構(gòu)造的。 存儲(chǔ)庫(kù)類需要是公共的,因?yàn)樗枰獜姆?wù)包中進(jìn)行訪問(wèn),而服務(wù)也必須是公共的,因?yàn)樗枰獜腤eb包中進(jìn)行訪問(wèn)。 當(dāng)一切都公開時(shí),很難保持紀(jì)律,不會(huì)導(dǎo)致大的泥潭。
使用按功能打包時(shí),私有UserRepository程序包(這意味著未指定訪問(wèn)修飾符)不能由UserService以外的其他服務(wù)使用,因?yàn)樗鼈冊(cè)谕怀绦虬小?而且,如果我們決定僅UserController應(yīng)該使用UserService,則將其打包為私有,因?yàn)樗鼈児蚕硗话?在這樣的項(xiàng)目結(jié)構(gòu)中,大多數(shù)類都是包私有的。 因此,開發(fā)人員應(yīng)該有充分的理由公開課程。
縮放比例
如果項(xiàng)目在Web /服務(wù)/持久層中開始具有10多個(gè)類,會(huì)發(fā)生什么情況? 開發(fā)人員傾向于將類分組為子包。 但是,他們?nèi)绾螌?duì)它們進(jìn)行分類? 根據(jù)我的經(jīng)驗(yàn),它主要基于功能。 因此,我們經(jīng)??梢栽谳^大的項(xiàng)目中找到這樣的結(jié)構(gòu):
. └── net└── lkrnac└── blog├── Application.java├── dao│?? ├── ...other repositories...│?? ├── ProjectRepository.java│?? └── user│?? ├── UserRepository.java│?? └── UserRoleRepository.java├── dto│?? ├── ...other DTOs...│?? ├── ProjectDto.java│?? └── user│?? ├── UserDto.java│?? └── UserRoleDto.java├── model│?? ├── ...other models...│?? ├── Project.java│?? └── user│?? ├── User.java│?? └── UserRole.java├── service│?? ├── ...other services...│?? ├── ProjectService.java│?? └── user│?? ├── UserRoleService.java│?? └── UserService.java└── web├── ...other controllers...├── ProjectController.java└── user├── UserController.java└── UserRoleController.java這不是明顯的瘋狂嗎?
未來(lái)的證明
正如一群聰明人所建議的那樣, 從微服務(wù)架構(gòu)開始綠色領(lǐng)域項(xiàng)目可能不是一個(gè)好主意 。 我同意。 因此,如果您的應(yīng)用程序Swift增長(zhǎng),則準(zhǔn)備好整體以最終分成較小的項(xiàng)目可能是個(gè)好主意。
想象一下,您將需要從整體項(xiàng)目中提取微服務(wù)。 或?qū)⒄麄€(gè)項(xiàng)目拆分為微服務(wù)。 我希望每個(gè)人都明白,沒(méi)有理智的微服務(wù)架構(gòu)被架構(gòu)層分開。 使用基于特征的分離。 那么哪種項(xiàng)目結(jié)構(gòu)將更容易劃分為微服務(wù)? 一個(gè),其中任何公共類都可以使用任何包中的任何其他公共類(逐層打包)? 還是一個(gè),分成多個(gè)包專用存儲(chǔ)桶(按功能打包)? 我相信答案是顯而易見(jiàn)的。
結(jié)論
按功能打包是一種簡(jiǎn)單但非常強(qiáng)大的去耦機(jī)制 。 因此,下一次某位癡迷的開發(fā)人員將作為解耦機(jī)制逐層捍衛(wèi)項(xiàng)目結(jié)構(gòu)時(shí),請(qǐng)糾正她/他的誤解。 我認(rèn)為恐龍化是當(dāng)今仍然存在逐層包裝的唯一原因。
翻譯自: https://www.javacodegeeks.com/2018/02/package-layer-spring-project-obsolete.html
總結(jié)
以上是生活随笔為你收集整理的Spring项目的按层打包已过时的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: tms tck_记录合规性–关于TCK,
- 下一篇: 江德福最后什么级别(父母爱情江德福最后什