优秀的代码应该如何分层

时间:2020-05-11 13:36:39   收藏:0   阅读:54

说起应用分层,大部分人都会认为这个不是很简单嘛 就ControllerServiceMapper三层。看起来简单,很多人其实并没有把他们职责划分开,在很多代码中,Controller做的逻辑比Service还多,Service往往当成透传了,这其实是很多人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。这样往往造成后面代码无法复用,层级关系混乱,对后续代码的维护非常麻烦。

一、背景

一个好的应用分层需要具备以下几点:

  1. 方便后续代码进行维护扩展;
  2. 分层的效果需要让整个团队都接受;
  3. 各个层职责边界清晰。

二、如何进行分层

2.1、阿里规范

在阿里的编码规范中约束的分层如下:

技术分享图片

  1. 开放接口层:可直接封装 Service 方法暴露成RPC接口;通过 Web 封装成 http 接口;进行 网关安全控制、流量控制等。
  2. 终端显示层:各个端的模板渲染并执行显示的层。
  3. Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
  4. Service 层:相对具体的业务逻辑服务层。
  5. Manager 层:通用业务处理层,它有如下特征:
    1. 对第三方平台封装的层,预处理返回结果及转化异常信息;
    2. Service层通用能力的下沉,如缓存方案、中间件通用处理;
    3. DAO层交互,对多个DAO的组合复用。
  6. DAO 层:数据访问层,与底层 MySQLOraclePostgreSQL进行数据交互。

阿里巴巴规约中的分层比较清晰简单明了,但是描述得还是过于简单了,以及Service层和Manager层有很多同学还是有点分不清楚之间的关系,就导致了很多项目中根本没有Manager层的存在。下面介绍一下具体业务中应该如何实现分层。

2.2、优化分层

从我们的业务开发中总结了一个较为的理想模型:

技术分享图片

技术分享图片

这样大量的重复工作必定会导致我们开发效率下降,所以我们需要把业务编排逻辑都得放进Service中去做:

技术分享图片

三、分层领域模型的转换

3.1、在阿里巴巴编码规约中领域模型

 

层次领域模型
Controller/TService VO/DTO
Service/Mannager AO/BO
DAO DO

每一个层基本都自己对应的领域模型,这样就导致了有些人过于追求每一层都是用自己的领域模型,这样就导致了一个对象可能会出现3次甚至4次转换在一次请求中,当返回的时候同样也会出现3-4次转换,这样有可能一次完整的请求-返回会出现很多次对象转换。如果在开发中真的按照这么来,恐怕就别写其他的了,一天就光写这个重复无用的逻辑算了吧。

3.2、所以我们得采取一个折中的方案:

  1. 允许Service/Manager可以操作数据领域模型,对于这个层级来说,本来自己做的工作也是做的是业务逻辑处理和数据组装
  2. Controller/TService层的领域模型不允许传入DAO层,这样就不符合职责划分了。
    同理,不允许DAO层的数据传入到Controller/TService

技术分享图片

四、关于包名的命名:

4.1、entitymodeldomain到底怎么用?

根据很多 Java 程序员的”经验”来看,一个数据库表则对应着一个 Domain 对象,所以很多程序员在写代码时,包名则使用:com.xxx.domain ,这样写好像已经成为了行业的一种约束,数据库映射对象就应该是 domain。但是你错了,domain 是一个领域对象,往往我们再做传统 Java 软件 Web 开发中,这些 domain 都是贫血模型,是没有行为的,或是没有足够的领域模型的行为的,所以,以这个理论来讲,这些 domain 都应该是一个普通的 entity 对象,并非领域对象,所以请把包名改为:com.xxx.entity

4.2、三句话总结下entitymodeldomain的不同:

  1. entity:必须和数据库字段一样
  2. model:前端需要什么我们就给什么
  3. domain:很少用,代表一个对象模块

五、总结

    1. 总的来说业务分层对于代码规范是比较重要,决定着以后的代码是否可复用,是否职责清晰,边界清晰。
    2. 当然这种分层其实见仁见智, 团队中的所有人的分层习惯也不同,所以很难权衡出一个标准的准则,总的来说只要满足职责逻辑清晰,后续维护容易,就是好的分层。

原文:https://www.cnblogs.com/youngdeng/p/12868516.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!