资讯专栏INFORMATION COLUMN

关于域的的一些遐想(一)

phpmatt / 3361人阅读

场景

有一个店铺列表查询,查询条件是店铺Id/店铺名称(通过下拉框选择)。这个时候我们在和前端约定,往往是传一个queryTypequeryValue,这个时候Service和Dao就有两个选择:

ServiceDao的查询参数QueryParam直接定义queryTypequeryValue两个变量(或者直接和Controller共用一个参数),然后在生成SQL的时候把这两个字段解析成ShopIdShopName.这样做的好处就是可以和Controller公用一个实体,避免了Controller层和Service之间的实体转换

Service自己定义一个查询实体QueryParam,并且在实体中直接定义ShopIdShopName.如果仅仅站在Service的角度来思考这个问题的话,Service必须拥有自己的入参,所以在QueryParam里面定义ShopIdShopName对接口的语义理解上来说是最合理

思考

这里有两种设计方式,一个自上至下,通过设计Controller然后考虑Service的入参和出参,另外一个是模块独立考虑,站在Service上考虑自身的接口应该怎么设计,避免了因为第一种设计方式,由于Controller的参数而直接影响了Service接口参数的设计(QueryParam定义ShopIdShopName绝对比定义定义queryTypequeryValue直观),并且最坏的情况就是ServiceController公用一个参数,因为前端的传参是很容易变化,如此和前端的参数耦合,当前端传值名称变化以后Service就得跟着改

引申

在我们平常开发大型系统的时候,往往也会将系统进行有效的分层比如有Service,Dao,Facade...每个层之间都应该有自己的入参和出参,各个层之间的耦合度就更加小,入参和出参更加的干净,接口更加容易让人理解(在某一层次的内部之间还会有更小的分层,这些小的分层之间甚至在一个层次的接口与接口之间,也会涉及到这个问题).

结论

各个层次都需要有自己的域

好处:通过在不同层次定义不同的域,不仅在代码的可读性上更加的友好并且不同层次之间或者同一层次之间的接口也更加的独立,耦合度更加小

坏处:有太多的实体,并且不同层或者同层之间的实体需要相互装换.

   public interface CouponService{

   public List queryCoupon(GoodsParam1 goods);
   
   public List shareCouponAmount(CouponParam1 coupon);
   }

   public CouponGoodsResultDTO calculate(Param param1,List goods){
       List coupons = CouponService.queryCoupon(GoodsParam1 goods);
       //选中优惠券coupon,coupon实体下面标明适用的商品Id-------①
       //通过coupon下的商品Id,从GoodsDetail中取相应的价格信息进行均摊-------②
       CouponService.shareCouponAmount(coupon);
   }
   

如上代码是属于比较麻烦的一种类型,因为Coupon自己实体下直挂了那些这个优惠券适合的商品Id,并没有其它信息,所以下面在计算优惠券的时候又得从原始入参中将一些价格信息取出来(如果①中能把商品的价格信息全部返回的话,②中就直接get,set就行了,但是这样均摊优惠券接口势必会和查询优惠券接口耦合,如果均摊优惠券需要一个新的信息的话,那么查询优惠券接口返回值就需要修改,并且由于商品信息都是入参传入的,所以入参也需要增加一些在这个逻辑中不必要的参数)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65978.html

相关文章

  • CSS魔法堂:重拾Border之——更广阔的遐想

    摘要:也就是说我们操作的几何公式中的未知变量,而具体的画图操作则由渲染引擎处理,而不是我们苦苦哀求设计师帮忙。 前言  当CSS3推出border-radius属性时我们是那么欣喜若狂啊,一想到终于不用再添加额外元素来模拟圆角了,但发现border-radius还分水平半径和垂直半径,然后又发现border-top-left/right-radius的水平半径之和大于元素宽度时,实际值会按比...

    lily_wang 评论0 收藏0
  • 域的四种方式

    摘要:本文主要是关于跨域的几种方式,关于什么是跨域这里就不多说了,写这个也是为了记住一些知识点的。我自己用和的写过一些,但是没有在实际工作中用过,所以对这一块了解不深。 本文主要是关于跨域的几种方式,关于什么是跨域这里就不多说了,写这个也是为了记住一些知识点的。 一. jsonp jsonp的跨域方式很容易理解,页面的的每一个script标签浏览器都会发送get请求获取对应的文本资源,获取到...

    StonePanda 评论0 收藏0
  • 用 Python 分析过往 36 年春晚节目数据,发现趣事

    摘要:节目单表是每一年春晚上表演的节目,包括节目类型节目名演员名这几项数据。好消息是,今年的春晚她会继续主持。对她的印象莫过于每年春晚尾声的那曲难忘今宵。年的春晚,她一人连唱首歌,前无古人,也后无来者。 showImg(https://segmentfault.com/img/remote/1460000018120380); 看过那么多春晚,哪一年、哪些节目、哪些人你还留有深刻印象呢。 记...

    hufeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<