场景

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

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

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

思考

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

引申

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

结论

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

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

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

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

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

关于域的的一些遐想(一)相关推荐

  1. RFC2616中文版

    转自:https://www.cnblogs.com/k1988/archive/2010/01/12/2165683.html 本备忘录的状态本文件规定了互联网社区的互联网标准跟踪协议,并要求对改进 ...

  2. 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题

    继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...

  3. kotlin设置CORS跨域资源共享,java设置允许跨域,服务端如何设置 springboot中设置跨域资源共享

    CORS通信过程,都是浏览器或http插件自动完成,不需要 用户/开发人员 参与.对于开发者来说,CORS通信与同源的AJAX通信没有差别,代码是完全一样的.浏览器一旦发现AJAX请求跨源,就会自动添 ...

  4. 三层交换机原理:01路由器如何隔离广播域?

    前言: 当网络规模较大的时候,需要设备来隔离广播域,防止网络中因产生广播风暴而导致网络效率降低,而二层交换机不能隔离广播域,所以需要三层路由器设备来隔离广播域! 但三层路由器为什么能够隔离广播域,是如 ...

  5. 无监督域对抗算法:ICCV2019论文解析

    无监督域对抗算法:ICCV2019论文解析 Drop to Adapt: Learning Discriminative Features for Unsupervised Domain Adapta ...

  6. CVPR2019目标检测论文看点:并域上的广义交

    CVPR2019目标检测论文看点:并域上的广义交 Generalized Intersection over Union Generalized Intersection over Union: A ...

  7. 关于上传文件的跨域问题

    在进行新框架开发的过程中,需要自定义页面组件实现脱离表单的文件(图片)上传,考虑过wex5自带的attachmentsimple的自定义写法很难受,就改用了第三方插件webuploader来实现选择文 ...

  8. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  9. angularjs post 跨域

    web api搞好了:用Ajax妥妥的:但是前端用的AngulagJS,也懒得再换为Ajax了: 但是问题来了:提示: 已拦截跨源请求:同源策略禁止读取位于 http://x.x.x.x:port/a ...

最新文章

  1. 织梦怎么改网站主页php,无忧主机教你修改织梦DedeCms网站首页为动态显示的方法...
  2. 常用的shell脚本案例(14.04.15更新)
  3. 360压缩电脑版_360压缩国际版
  4. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波16 - 锐化高通滤波器 - 钝化掩蔽和高提升滤波
  5. VS 多进程调试(C#和C )
  6. 精品美剧小屏精致灰色风格苹果CMSv10主题
  7. Sql server 数据转到 Mysql 数据库
  8. activiti5.13 框架 数据库设计说明书
  9. 移动站适配rel=alternate PC页和H5页适配标注
  10. 终于离职了,千万别在工作交接上翻车!
  11. DDCTFRre3-虚拟指令分析
  12. 繁星闪烁 ,芳华似锦,走自己的路
  13. linux查看java虚拟机内存_JVM:查看java内存情况命令
  14. Numpy 数组索引
  15. HLM(分层线性模型)处理“聚集性”问题!
  16. 第七章 马斯洛金字塔模型
  17. 全球与中国菱镁矿和水镁石市场现状及未来发展趋势
  18. 跳棋游戏利用树构建合法路径出现循环的解决办法
  19. 如何在Windows中使用虚拟文件测试网络或硬盘速度
  20. 学习笔记——《LINUX设备驱动程序(第三版)》Linux设备模型:内核添加、删除设备、驱动程序

热门文章

  1. .net 4.0下载
  2. Confluence 6 有关空间的一些提示
  3. RMAN-03002、RMAN-06059
  4. React 回忆录(三)使用 React 渲染界面
  5. 数据不平衡的解决办法
  6. JDK1.8源码(三)——java.lang.String 类
  7. Android L 新特性
  8. MYsql 查询 查询当前月份的数据
  9. 企业云部署要如何选择IaaS PaaS和SaaS
  10. 什么是 Delta 文件