轉(zhuǎn)Java開發(fā)不久,請教各位:
項目基于
SSM框架,分層結(jié)構(gòu)為controller->service(interface & implementation)->mapper,因為項目比較簡單,基本就是貧血模型,model放在entity包下,跟數(shù)據(jù)庫表一一對應(yīng)。
現(xiàn)在我請教的問題如下:
controller里面的Method如果參數(shù)比較多,會用一個類對象去接收,一般是放在dto包下,并且類名命名為FooDTO嗎?
返回給前端的對象,如果要求不高,并且單表直接Select出來,可以直接返回Entity或者List<Entity>。但是,如果是多張表join出來的結(jié)果,是不是需要定義一個類,比如命名為BarDTO,這個BarDTO通過MyBatis的ResultMap生成,并且經(jīng)過mapper -> service -> controller -> ajax?
第1點、第2點是不是在dto包下建立input、output包更好?input放controller參數(shù)的類,output用于存放service返回值的類
controller和service之間傳遞的參數(shù)一般是不是直接傳DTO對象,然后在service中在構(gòu)造entity去調(diào)用mapper方法?
第4點,如果類對象成員比較多,勢必service方法充斥著很多set方法,如何解決呢?
DTO的validation是在controller里面做,還是在service里面做呢?
感謝各位不吝賜教!
Q1:controller里面的Method如果參數(shù)比較多,會用一個類對象去接收,一般是放在dto包下,并且類名命名為FooDTO嗎?
A1:的確是放在dto包下面,但是我們這里的命名不會是FooDto,因為光看這個名字看不出這個類到底是干嘛的。我們針對查詢的:FooQueryParam,針對數(shù)據(jù)操作的:FooXXXCmd,XXX代表CRUD
Q2:返回給前端的對象,如果要求不高,并且單表直接Select出來,可以直接返回Entity或者List<Entity>。但是,如果是多張表join出來的結(jié)果,是不是需要定義一個類,比如命名為BarDTO,這個BarDTO通過MyBatis的ResultMap生成,并且經(jīng)過mapper -> service -> controller -> ajax?
A2:這個我們不會叫做BarDto,而是叫做BarVm,Vm代表ViewModel,意思是專供顯示用的Model,它可以根據(jù)具體情況將Entity的結(jié)果進(jìn)行轉(zhuǎn)換(比如身份證打碼),組合(多個Entity組合成一個Vm)等動作。
如果這個數(shù)據(jù)不是顯示的,就是一種數(shù)據(jù),那么一般叫做BarData之類的,根據(jù)具體業(yè)務(wù)起不同的名字,總之不會叫Dto,就好像你不會給一個類取名為BarObject一樣。
Q3:第1點、第2點是不是在dto包下建立input、output包更好?input放controller參數(shù)的類,output用于存放service返回值的類
A3:不建議這么分,一個controller可能會有多種業(yè)務(wù)方法,傾向于根據(jù)業(yè)務(wù)方法分包,會更清晰一點。
Q4:controller和service之間傳遞的參數(shù)一般是不是直接傳DTO對象,然后在service中在構(gòu)造entity去調(diào)用mapper方法?
A4:service方法一般來說不應(yīng)該接收Dto參數(shù),因為Dto是比較隨意的,而且會和Http請求聯(lián)系在一起,如果前端代碼變了,那么Service也很容易跟著變,這樣不好。
我建議是Controller將Dto轉(zhuǎn)換成service需要的參數(shù)類型,然后去調(diào)用service,這樣service代碼就會穩(wěn)定。
Q5:第4點,如果類對象成員比較多,勢必service方法充斥著很多set方法,如何解決呢?
A5:你可以使用Dozer,或者Orika Mapper之類的工具,將Dto的屬性copy到entity上,它們的原理是通過反射,將兩個類里的同名屬性做copy。
Q6:DTO的validation是在controller里面做,還是在service里面做呢?
A6:你可以借用Spring MVC提供的validation功能做一些簡單的校驗,比如@NotNull,@NotEmpty之類的。
但是如果你的這個FooSaveCmd有一些業(yè)務(wù)邏輯校驗,比如不允許注冊同名賬號,那么這個校驗得在service里做。
咋感覺是為了規(guī)范而規(guī)范,公司有公司的習(xí)慣,自己有自己的習(xí)慣,能解決問題,維護方便才是重點,一般都是實踐中找出最好的方式,或者看他人源碼。所以你這個不好回答,或者沒啥意義!
1.如果是維護他人的代碼,盡量按照之前 coder 編碼的風(fēng)格
2.如果沒有公司的約束,自己搭建的結(jié)構(gòu),個人覺得其實都不重要,至少保證結(jié)構(gòu)清晰,至于以后會遇到什么問題,再具體分析,具體修改
樓下提到的阿里的Java規(guī)范,你可以看看
我的一些看法
1.controller里面的Method如果參數(shù)比較多,會用一個類對象去接收,一般是放在dto包下,并且類名命名為FooDTO嗎?
:數(shù)據(jù)傳輸對象:xxxDTO,xxx 為業(yè)務(wù)領(lǐng)域相關(guān)的名稱
2.返回給前端的對象,如果要求不高,并且單表直接Select出來,可以直接返回Entity或者2.List<Entity>。但是,如果是多張表join出來的結(jié)果,是不是需要定義一個類,比如命名為BarDTO,這個BarDTO通過MyBatis的ResultMap生成,并且經(jīng)過mapper -> service -> controller -> ajax?
:聯(lián)表查詢出來的數(shù)據(jù),DO 設(shè)計的時候,我是會考慮的,當(dāng)然你也可以用 DTO,但是你要知道 DTO 如果設(shè)計的過多,分的太細(xì),也是不好維護的
3.第1點、第2點是不是在dto包下建立input、output包更好?input放controller參數(shù)的類,output用于存放service返回值的類
4.controller和service之間傳遞的參數(shù)一般是不是直接傳DTO對象,然后在service中在構(gòu)造entity去調(diào)用mapper方法?
:還是那個問題,DTO 這個東西如果分的太多,太細(xì),代碼維護和可讀性會有問題,關(guān)于頁面展示的可以用 VO;其實傳遞普通的基本的數(shù)據(jù)類型也是可以的呀,listUser(Interger groudId),getUser(String userid),這個結(jié)構(gòu)不是也很清晰嗎,listUser(xxDTO xx),getUser(xxDTO xx)
5.第4點,如果類對象成員比較多,勢必service方法充斥著很多set方法,如何解決呢?
:充斥著很多set方法,我覺得ok呀,你可以封裝成一個方法,這本身就是屬于業(yè)務(wù)的一部分
6.DTO的validation是在controller里面做,還是在service里面做呢?
:具體還是看業(yè)務(wù)邏輯吧!
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。