場(chǎng)景
有一個(gè)店鋪列表查詢,查詢條件是店鋪Id/店鋪名稱(通過(guò)下拉框選擇)。這個(gè)時(shí)候我們?cè)诤颓岸思s定,往往是傳一個(gè)queryType和queryValue,這個(gè)時(shí)候Service和Dao就有兩個(gè)選擇:
Service和Dao的查詢參數(shù)QueryParam直接定義queryType和queryValue兩個(gè)變量(或者直接和Controller共用一個(gè)參數(shù)),然后在生成SQL的時(shí)候把這兩個(gè)字段解析成ShopId和ShopName.這樣做的好處就是可以和Controller公用一個(gè)實(shí)體,避免了Controller層和Service之間的實(shí)體轉(zhuǎn)換
Service自己定義一個(gè)查詢實(shí)體QueryParam,并且在實(shí)體中直接定義ShopId和ShopName.如果僅僅站在Service的角度來(lái)思考這個(gè)問(wèn)題的話,Service必須擁有自己的入?yún)?所以在QueryParam里面定義ShopId和ShopName對(duì)接口的語(yǔ)義理解上來(lái)說(shuō)是最合理
思考這里有兩種設(shè)計(jì)方式,一個(gè)自上至下,通過(guò)設(shè)計(jì)Controller然后考慮Service的入?yún)⒑统鰠?另外一個(gè)是模塊獨(dú)立考慮,站在Service上考慮自身的接口應(yīng)該怎么設(shè)計(jì),避免了因?yàn)榈谝环N設(shè)計(jì)方式,由于Controller的參數(shù)而直接影響了Service接口參數(shù)的設(shè)計(jì)(QueryParam定義ShopId和ShopName絕對(duì)比定義定義queryType和queryValue直觀),并且最壞的情況就是Service和Controller公用一個(gè)參數(shù),因?yàn)榍岸说膫鲄⑹呛苋菀鬃兓?如此和前端的參數(shù)耦合,當(dāng)前端傳值名稱變化以后Service就得跟著改
引申在我們平常開(kāi)發(fā)大型系統(tǒng)的時(shí)候,往往也會(huì)將系統(tǒng)進(jìn)行有效的分層比如有Service,Dao,Facade...每個(gè)層之間都應(yīng)該有自己的入?yún)⒑统鰠?各個(gè)層之間的耦合度就更加小,入?yún)⒑统鰠⒏拥母蓛?接口更加容易讓人理解(在某一層次的內(nèi)部之間還會(huì)有更小的分層,這些小的分層之間甚至在一個(gè)層次的接口與接口之間,也會(huì)涉及到這個(gè)問(wèn)題).
結(jié)論各個(gè)層次都需要有自己的域
好處:通過(guò)在不同層次定義不同的域,不僅在代碼的可讀性上更加的友好并且不同層次之間或者同一層次之間的接口也更加的獨(dú)立,耦合度更加小
壞處:有太多的實(shí)體,并且不同層或者同層之間的實(shí)體需要相互裝換.
public interface CouponService{ public ListqueryCoupon(GoodsParam1 goods); public List shareCouponAmount(CouponParam1 coupon); } public CouponGoodsResultDTO calculate(Param param1,List goods){ List coupons = CouponService.queryCoupon(GoodsParam1 goods); //選中優(yōu)惠券coupon,coupon實(shí)體下面標(biāo)明適用的商品Id-------① //通過(guò)coupon下的商品Id,從GoodsDetail中取相應(yīng)的價(jià)格信息進(jìn)行均攤-------② CouponService.shareCouponAmount(coupon); }
如上代碼是屬于比較麻煩的一種類型,因?yàn)镃oupon自己實(shí)體下直掛了那些這個(gè)優(yōu)惠券適合的商品Id,并沒(méi)有其它信息,所以下面在計(jì)算優(yōu)惠券的時(shí)候又得從原始入?yún)⒅袑⒁恍﹥r(jià)格信息取出來(lái)(如果①中能把商品的價(jià)格信息全部返回的話,②中就直接get,set就行了,但是這樣均攤優(yōu)惠券接口勢(shì)必會(huì)和查詢優(yōu)惠券接口耦合,如果均攤優(yōu)惠券需要一個(gè)新的信息的話,那么查詢優(yōu)惠券接口返回值就需要修改,并且由于商品信息都是入?yún)魅氲?所以入?yún)⒁残枰黾右恍┰谶@個(gè)邏輯中不必要的參數(shù))
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65978.html
摘要:也就是說(shuō)我們操作的幾何公式中的未知變量,而具體的畫(huà)圖操作則由渲染引擎處理,而不是我們苦苦哀求設(shè)計(jì)師幫忙。 前言 ?當(dāng)CSS3推出border-radius屬性時(shí)我們是那么欣喜若狂啊,一想到終于不用再添加額外元素來(lái)模擬圓角了,但發(fā)現(xiàn)border-radius還分水平半徑和垂直半徑,然后又發(fā)現(xiàn)border-top-left/right-radius的水平半徑之和大于元素寬度時(shí),實(shí)際值會(huì)按比...
摘要:本文主要是關(guān)于跨域的幾種方式,關(guān)于什么是跨域這里就不多說(shuō)了,寫(xiě)這個(gè)也是為了記住一些知識(shí)點(diǎn)的。我自己用和的寫(xiě)過(guò)一些,但是沒(méi)有在實(shí)際工作中用過(guò),所以對(duì)這一塊了解不深。 本文主要是關(guān)于跨域的幾種方式,關(guān)于什么是跨域這里就不多說(shuō)了,寫(xiě)這個(gè)也是為了記住一些知識(shí)點(diǎn)的。 一. jsonp jsonp的跨域方式很容易理解,頁(yè)面的的每一個(gè)script標(biāo)簽瀏覽器都會(huì)發(fā)送get請(qǐng)求獲取對(duì)應(yīng)的文本資源,獲取到...
摘要:節(jié)目單表是每一年春晚上表演的節(jié)目,包括節(jié)目類型節(jié)目名演員名這幾項(xiàng)數(shù)據(jù)。好消息是,今年的春晚她會(huì)繼續(xù)主持。對(duì)她的印象莫過(guò)于每年春晚尾聲的那曲難忘今宵。年的春晚,她一人連唱首歌,前無(wú)古人,也后無(wú)來(lái)者。 showImg(https://segmentfault.com/img/remote/1460000018120380); 看過(guò)那么多春晚,哪一年、哪些節(jié)目、哪些人你還留有深刻印象呢。 記...
閱讀 3718·2021-11-11 11:00
閱讀 2197·2021-10-08 10:05
閱讀 2710·2021-10-08 10:04
閱讀 3222·2021-09-30 09:48
閱讀 3813·2021-09-27 14:10
閱讀 1714·2021-09-09 09:33
閱讀 2110·2019-08-30 15:55
閱讀 1614·2019-08-30 13:53