成人深夜视频网站|日韩高清无码久久|中文a√在线天堂|亚洲黄网站在线看|欧美视频 第二页|日本 久草 天堂|高潮无遮挡黄视频|久久一级内射精品|国产操逼一级视频|五月天婷婷色AV

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

分層設計:Service 層真的需要實現(xiàn)接口嗎?

0
分享至

點擊進入IT資料庫

前幾天看技術交流群的話題,又刷到了Service 層和 Dao 層真的有必要每個類都加上接口嗎?這個問題,之前簡單回答了一波,給出的觀點是看情況

現(xiàn)在結(jié)合我參與的項目以及閱讀的一些項目源碼來看,如果項目中使用了像 Spring 這樣的依賴注入框架,那可以不用接口!

先來說說為什么使用了依賴注入框架以后,可以不使用接口。

不需要接口的理由

我整理了支持 Service 層和 Dao 層需要加上接口的理由,總結(jié)下來就這么三個:

  • 可以在尚未實現(xiàn)具體 Service 邏輯的情況下編寫上層代碼,如 Controller 對 Service 的調(diào)用

  • Spring 默認是基于動態(tài)代理實現(xiàn) AOP 的,動態(tài)代理需要接口

  • 可以對 Service 進行多實現(xiàn)

實際上,這三個理由都站不住腳!

先說說第一個理由:「上層可以在下層邏輯沒有實現(xiàn)的情況下進行編碼」!很典型的面向接口編程,對層與層之間進行了解耦,看起來好像沒有問題。

這種開發(fā)方式適合不同模塊之間是由不同的人或項目組開發(fā)的,因為溝通的成本比較大。同時避免由于項目組之間開發(fā)進度的差異而相互影響。

不過讓我們回想一下,在一般項目開發(fā)里面,有多少項目組是按層來切分開發(fā)任務的呢?實際上,大部分的項目都是按照功能劃分的。即使是現(xiàn)在前后端分離的情況,單純的后端開發(fā)也是按照功能模塊進行任務劃分,即一個人負責從 Controller 層到 DAO 層的完整邏輯處理。在這種情況下,每一層都先定義一個接口,再去實現(xiàn)邏輯,除了增加了開發(fā)人員的工作量(當然,如果代碼量計入工作量的話,那開發(fā)人員應該也不是太排斥接口的?。?,實際沒有任何用處。

如果開發(fā)人員想在下層邏輯沒有完成的情況下,先開發(fā)上層邏輯,可以先編寫下層類的空方法來先完成上層的邏輯。

這里推薦一個個人比較喜歡的開發(fā)流程,自上向下的編碼流程:

  • 先在 Controller 層編寫邏輯,遇到需要委托 Service 調(diào)用的地方,直接先寫出調(diào)用代碼。

  • 優(yōu)先完成 Controller 層的流程

  • 然后使用 IDE 的自動補全,對剛才調(diào)用下層的代碼生成對應的類和方法,在里面添加 TODO

  • 等所有的類和方法都補全了,再基于 TODO,按照上面的流程去一個個的完善邏輯。

  • 此方法可以使你對業(yè)務流程有比較好的理解。

對于第二個理由,就完全不成立了。Spring 默認是基于動態(tài)代理的,不過通過配置是可以使用 CGLib 來實現(xiàn) AOP。CGLib 是不需要接口的。

最后一個理由是可以對 Service 進行多實現(xiàn)。這個理由不充分,或者說沒有考慮場景。實際上在大多數(shù)情況下是不需要多實現(xiàn),或者說可以使用其它方式替代基于接口的多實現(xiàn)。

另外,對于很多使用了接口的項目,項目結(jié)構(gòu)也是有待商榷的!下面,我們結(jié)合項目結(jié)構(gòu)來說明。

項目結(jié)構(gòu)與接口實現(xiàn)

一般項目結(jié)構(gòu)都是按層來劃分的,如下所示:

  • Service

  • Dao

對于不需要多實現(xiàn)的情況,也就不需要接口了。上面的項目結(jié)構(gòu)即可滿足要求。

對于需要多實現(xiàn)的情況,無論是現(xiàn)在需要,還是后面需要。這種情況下,看起來好像是需要接口。此時的項目結(jié)構(gòu)看起來像這樣:

  • Service

    • — 接口在一個包中

    • impl — 實現(xiàn)在另一個包里

  • Dao

對于上面的結(jié)構(gòu),我們來考慮多實現(xiàn)的情況下,該怎么處理?

第一種方式,是在 Service 中新增一個包,在里面編寫新的邏輯,然后修改配置文件,將新實現(xiàn)作為注入對象。

  • Service

    • —- 接口在一個包中

    • impl —實現(xiàn)在另一個包里

    • impl2 —新實現(xiàn)在另一個包里

  • Dao

第二種方式,是新增一個 Service 模塊,在里面編寫新的邏輯(注意這里的包和原來 Service 的包不能相同,或者包相同,但是類名不同,否則無法創(chuàng)建類。因為在加載時需要同時加載兩個 Service 模塊,如果包名和類名都相同,兩個模塊的類全限定名就是一樣的了?。?,然后修改配置文件,將新邏輯作為注入對象。

  • Service

    • —- 接口在一個包中

    • impl —實現(xiàn)在另一個包里

  • Service2

    • impl2 —新實現(xiàn)在另一個包里

  • Dao

相對而言,實際第一種方式相對更簡單一點,只需要關注包層面。而第二種方式需要關注模塊和包兩個層面。另外,實際這兩種方式都導致了項目中包含了不需要的邏輯代碼。因為老邏輯都會被打進包里。

不過,從結(jié)構(gòu)上來看,實際方式二的結(jié)構(gòu)要比方式一的結(jié)構(gòu)更清晰,因為從模塊上能區(qū)分邏輯。

那有沒有辦法來結(jié)合兩者的優(yōu)點呢?答案是肯定的,而且操作起來也不復雜!

首先將接口和實現(xiàn)獨立開,作為一個獨立的模塊:

  • Service — 接口模塊

    • ServiceImpl

    • impl —實現(xiàn)在另一個包里

  • ServiceImpl2

    • impl2 —新實現(xiàn)在另一個包里

  • Dao

其次,調(diào)整打包配置,ServiceImpl 和 ServiceImpl2 二選一。既然 ServiceImpl 和 ServiceImpl2 是二選一,那 ServiceImpl 和ServiceImpl2 的包結(jié)構(gòu)就可以相同。包結(jié)構(gòu)相同了,那調(diào)整了依賴以后,依賴注入相關的配置就不需要調(diào)整了。調(diào)整后,項目結(jié)構(gòu)看起來像這樣:

  • Service — 接口模塊

    • ServiceImpl

    • impl —實現(xiàn)在另一個包

  • ServiceImpl2

    • impl —新實現(xiàn)和老實現(xiàn)在相同的包中

  • Dao

現(xiàn)在,ServiceImpl 和 ServiceImpl2 模塊中的包結(jié)構(gòu)、類名都是一樣的。那我們還需要接口模塊嗎?

假設,我們把Service接口模塊去掉,結(jié)構(gòu)變成了如下所示:

  • Service1 — 老實現(xiàn)

  • Service2 — 新實現(xiàn)

  • Dao

單純的通過調(diào)整模塊依賴,是否能實現(xiàn) Service 的多實現(xiàn)?答案顯而易見吧?

不使用接口的缺點

上面給出了不使用接口的理由。不過不使用接口并不是完全沒有缺點的,主要問題就是在進行多實現(xiàn)的時候,沒有一個強接口規(guī)范。即不能通過實現(xiàn)接口,借助 IDE 快速生成框架代碼。對于沒有實現(xiàn)的接口,IDE 也能給出錯誤提醒。

一個不太優(yōu)雅的解決是,將原來的模塊里的代碼拷貝一份到新模塊中,基于老代碼來實現(xiàn)新的邏輯。

所以,如果一個項目需要多實現(xiàn)、且多實現(xiàn)數(shù)量較多(不過一般項目不會有多個實現(xiàn)的),則推薦使用接口。否則不需要使用接口。

本文針對「Service 層是否需要接口」這個問題,指出需要接口的理由的問題。以及個人對這個問題的觀點,希望在評論區(qū)寫出自己的理解 !

IT架構(gòu)師/技術大咖的交流圈子,為您提供架構(gòu)體系知識、技術文章、流行實踐案例、解決方案等,行業(yè)大咖分享交流/同行經(jīng)驗分享互動,期待你的加入!掃碼即可加入哦,隨著材料不斷增多社群會不定期漲價早加入更優(yōu)惠

免責聲明:

本公眾號部分分享的資料來自網(wǎng)絡收集和整理,所有文字和圖片版權歸屬于原作者所有,且僅代表作者個人觀點,與本公眾號無關,文章僅供讀者學習交流使用,并請自行核實相關內(nèi)容,如文章內(nèi)容涉及侵權,請聯(lián)系后臺管理員刪除。

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關推薦
熱點推薦
六年前我國鐵路負債高達5.48萬億,再看如今數(shù)據(jù),真的令人意外

六年前我國鐵路負債高達5.48萬億,再看如今數(shù)據(jù),真的令人意外

云景侃記
2025-09-02 21:25:00
違法分包!中國電建江西電力被罰

違法分包!中國電建江西電力被罰

齊魯壹點
2025-09-02 10:38:19
31億!重慶第一大民企的全球研發(fā)中心

31億!重慶第一大民企的全球研發(fā)中心

GA環(huán)球建筑
2025-09-02 10:08:25
蔚來第二季度營收190億:毛利率10% 現(xiàn)金儲備272億

蔚來第二季度營收190億:毛利率10% 現(xiàn)金儲備272億

雷遞
2025-09-02 18:31:19
95后年輕夫妻,因“早起不了一點!”包子花卷錯峰賣,生意火爆

95后年輕夫妻,因“早起不了一點!”包子花卷錯峰賣,生意火爆

觀威海
2025-09-01 15:52:24
違規(guī)配備專車專駕、專秘私廚,四川這名官員被“雙開”

違規(guī)配備專車專駕、專秘私廚,四川這名官員被“雙開”

中國青年報
2025-09-02 12:14:05
莫迪專機剛出中國領空,就發(fā)表涉華言論,美國人破防了

莫迪專機剛出中國領空,就發(fā)表涉華言論,美國人破防了

老張點評
2025-09-02 16:18:53
好消息!米內(nèi)羅回申花 壞消息剩余7輪打不 如有馬萊萊出勤率多好

好消息!米內(nèi)羅回申花 壞消息剩余7輪打不 如有馬萊萊出勤率多好

80后體育大蜀黍
2025-09-02 22:05:36
孫穎莎王楚欽同機回京引熱議!黑色豪車接機,粉絲福爾摩斯上線

孫穎莎王楚欽同機回京引熱議!黑色豪車接機,粉絲福爾摩斯上線

情感大頭說說
2025-09-02 17:08:03
張維伊親戚好算計!暗示董璇將錢放在一起用,張維伊表情耐人尋味

張維伊親戚好算計!暗示董璇將錢放在一起用,張維伊表情耐人尋味

葉二娛評
2025-09-02 00:21:22
或有變故!臺島受邀93閱兵人士名單曝光,首位明確拒絕的人出現(xiàn)

或有變故!臺島受邀93閱兵人士名單曝光,首位明確拒絕的人出現(xiàn)

林子說事
2025-09-02 16:10:40
中國女排全員抵達北京,縱觀世錦賽4場比賽,產(chǎn)生5大意想不到!

中國女排全員抵達北京,縱觀世錦賽4場比賽,產(chǎn)生5大意想不到!

田先生籃球
2025-09-02 22:35:01
芬蘭空軍將逐步取消旗幟上的納粹黨徽

芬蘭空軍將逐步取消旗幟上的納粹黨徽

零度Military
2025-08-31 22:30:07
《天津宣言》全票通過,上合峰會莫迪最終簽字,掙扎也沒用

《天津宣言》全票通過,上合峰會莫迪最終簽字,掙扎也沒用

傲傲講歷史
2025-09-02 10:46:54
26國首腦來北京看閱兵,金正恩普京都會出席,莫迪來了天津還要跑

26國首腦來北京看閱兵,金正恩普京都會出席,莫迪來了天津還要跑

貓眼觀史
2025-09-01 23:21:36
殘暴廣東全運男籃給焦泊喬慶祝生日 趙睿周鵬連續(xù)蛋糕暴擊

殘暴廣東全運男籃給焦泊喬慶祝生日 趙睿周鵬連續(xù)蛋糕暴擊

直播吧
2025-09-02 12:05:23
一句“滾出湖北”,揭開了武大的遮羞布!是誰制造了這起事件

一句“滾出湖北”,揭開了武大的遮羞布!是誰制造了這起事件

平老師666
2025-09-02 21:10:40
沒有可比性!三連漲,陳佩斯《戲臺》日票房91萬,累計4.03億!

沒有可比性!三連漲,陳佩斯《戲臺》日票房91萬,累計4.03億!

小娛樂悠悠
2025-09-02 08:33:03
唯一被凌遲的皇帝:四肢釘在牛車上,割了1516刀,死時年僅16歲!

唯一被凌遲的皇帝:四肢釘在牛車上,割了1516刀,死時年僅16歲!

年代回憶
2025-09-01 21:11:29
老戲骨艾麗婭:戲里演技很好,現(xiàn)實生活很幸福,婆婆老公是實力派

老戲骨艾麗婭:戲里演技很好,現(xiàn)實生活很幸福,婆婆老公是實力派

草莓解說體育
2025-09-02 22:20:58
2025-09-02 23:59:00
IT架構(gòu)師聯(lián)盟 incentive-icons
IT架構(gòu)師聯(lián)盟
IT架構(gòu)實戰(zhàn)分享
787文章數(shù) 7667關注度
往期回顧 全部

科技要聞

宇樹科技稱將在四季度提交IPO申請

頭條要聞

石破茂態(tài)度180度大轉(zhuǎn)彎 強硬表態(tài)將留任后又突然改口

頭條要聞

石破茂態(tài)度180度大轉(zhuǎn)彎 強硬表態(tài)將留任后又突然改口

體育要聞

等了十年,石宇奇終于說出這句話

娛樂要聞

“廚神對決!”誰做的菜好吃?

財經(jīng)要聞

黃金破"次元" 年輕人熬夜買"金谷子"

汽車要聞

12分鐘大訂破3000 "配齊"的全新嵐圖知音滿血華為

態(tài)度原創(chuàng)

時尚
藝術
健康
旅游
數(shù)碼

三種適合9月的風格,好漂亮

藝術要聞

故宮珍藏的墨跡《十七帖》,比拓本更精良,這才是地道的魏晉寫法

內(nèi)分泌科專家破解身高八大謠言

旅游要聞

熱聞|清明假期將至,熱門目的地有哪些?

數(shù)碼要聞

三星平價平板Galaxy Tab A11曝光,旗艦系列后天發(fā)

無障礙瀏覽 進入關懷版