项目代码架构分层

1、代码分层现状

传统项目开发中,代码分层架构大概是controller层,Service层,Dao层,在SOA架构中会有facade层,Service层,Dao层,两种方式都是将所有的业务逻辑集中在Service层,包括业务参数的校验逻辑,业务的核心逻辑,对第三方工具的访问逻辑,甚至是持久层的转换逻辑都在这一层,对持久层数据库的访问则写在Dao层;可以发现所有业务都耦合在service层,使所有业务高度耦和,不仅增加了业务理解的难度,同时对后期的开发维护以及升级都代码了极大的困难;

2、代码分层思考

很长一段时间,开发中项目应该是什么样的分层才能够更合理,有没有一中代码架构分层,可以将每个项目中通用的逻辑与具体的业务逻辑分开,可以清晰的知道每一层核心业务是什么,这样对不仅有利于项目的开发,更加有利于后期项目的维护和扩展,从而延长项目的生命周期;
基于以上思考,我们首先分析了代码项目中拥有哪些可以提取的通用的业务逻辑,从而为项目分层组到有章可循:

  1. 参数校验逻辑:所有项目中都有参数校验的逻辑,参数校验又可以分为基本校验,业务校验
    a、基本校验:参数非null,日期大于当下,年龄字段必须大于零等基本的和业务无关的基本校验;
    b、业务校验:传进来的参数所对应的业务数据是否合法,比如用户id对应的用户数据是否存在且合法业务校验;
  2. 参数转换逻辑:不同模块之间参数转换隔离,做到模块升级不影响其他模块的业务。
    这里的转换是就是将其模块或其他三方工具中的数据对象转成我们业务中的数据对象,以达到隔离和防腐的目的;
    例如:我们使用MySql数据库来持久化数据,后来由于业务发展需要,改成了mongdb,二者返回的数据对象是不一样的,这时候我们只需要在防腐层实现新数据对象映射到我们需要的数据对象就可了。
  3. 异常处理:分为异常的抛出和异常的捕获处理与转换
    a、异常抛出:我们认为,不符合业务的异常均应手动抛出,比如参数校验的异常,不符合业务逻辑的异常等;对于第三方工具类抛出的异常我们任务可以统一包装成三方异常,对外抛出;
    b、异常捕获:异常的捕获应该统一处理,我们任务在出口层应该对所有异常做统一的拦截,避免到处try、catch异常逻辑与正常的业务逻辑耦和在一起;
    c、异常处理:将捕获所有的异常,并将异常的堆栈信息记录下来,对于业务异常可以设置统一的异常码外加异常信息返回给用户,同时对于未知的异常统一转换成定义的系统异常对外抛出;
3、代码分层探索

基于以上思考,我们对代码架构分层做了以下的探究实践;

  1. facade层:门面层:只有接口和接口入参,以及入参中的一些枚举和异常
    a、这一层主没有任何的业务和逻辑,因为这一层是作为二方包提供给其他使用者调用的,所以这一层要保证绝对的干净。
    b、这一层如果需要有业务逻辑的话,我们认为可以将接口签名算法的业务逻辑放在这一层,方便调用方使用现成的签名算法快速方便的调用接口;
  2. interface层:参数转换校验以及异常的捕获处理转换
    a、接口层完成参数转换,转换成下层业务需要的稳定的数据对象,这样能够保证业务数据变动不对使用方造成影响;对于基本数据类型的转换,我们认为放在数据对象的set方法中比较合理,因为这样可以避免每次转换都写校验逻辑,可以减少大量重复代码的开发;对于业务参数的校验,我们也提倡放interface的service层实现,这样可以做到fastfail,避免后面业务中在检查业务参数而造成的一些性能的浪费;
    b、异常的拦截处理,所有的异常应该在这一层拦截和捕获和记录,然后对不同的异常分类处理,对于预期异常我们可以按既定策略返回;对于其他异常,则应该统一转成其他(或系统)异常对外抛出,注意避免将异常信息直接展示给用户。
    c、infrastructure层:基础设施层,对redis、mq等三方工具的对访问
    这一层主要完成和第三方插件数据的交互,完成数据转换并将数据传递到中间件,从中间件获取数据数据,并转换成业务需要的数据对象;
    d、responsitory层:仓储层,实现持久化对象到业务对象到转换和交互
    在领域设计里,数据库也是中间件的一种,是放在基础设施层的,但是基于现有开发模式以及数据库的重要性,我们应该强化这一层概念,将仓储层单独成模块,来实现数据持久化的相关逻辑。
    e、application层和domain层:核心业务实现模块
    在领域驱动设计中,application层不处理业务只用来编排业务和调用基础设施层的,domain则是核心业务实现的地方,目前我们对业务编排的概念还在探索中国,所以这一部分业务逻辑分层处理我们后续会继续更新讨论。

4、参数统一封装返回

系统统一参数返回:BaseResult、PojoResult、CollectionResult、ListResult、MapResult、PageResult;BaseResult实现Serializable使结果对象可以序列化传输;其他结果对象均继承BaseResult,只是各自的返回值类型不同而已。

欢迎大家一块提意见讨论,我们也在继续摸索中;

项目代码架构-业务分层和各层业务逻辑相关推荐

  1. 大数据Flink电商实时数仓实战项目流程全解(六)DWM层业务实现

    项目概要 之前我们已经通过动态分流把数据分到了我们想要的位置,为了方便后续内容的讲解方便,所以接下来我们可以把配置表的信息进行导入了,然后通过动态分流的方法,把数据发往对应的kafka主题或者是hba ...

  2. 写代码犹如写文章: “大师级程序员把系统当故事来讲,而不是当做程序来写” | 如何架构设计复杂业务系统? 如何写复杂业务代码?

    写代码犹如写文章: "大师级程序员把系统当故事来讲,而不是当做程序来写" | 如何架构设计复杂业务系统? 如何写复杂业务代码? Kotlin 开发者社区 "大师级程序员把 ...

  3. 优秀的 Java 项目代码都是如何分层的?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:http://rrd.me/ej56f 1.背景 2.如何进 ...

  4. 项目架构开发:数据访问层之Cache

    数据访问层简单介绍 数据访问层,提供整个项目的数据访问与持久化功能.在分层系统中所有有关数据访问.检索.持久化的任务,最终都将在这一层完成. 来看一个比较经典的数据访问层结构图 大概可以看出如下信息 ...

  5. dao层如何调用对象_你的项目应该如何正确分层?

    你好,欢迎收听极客视点. 说起应用分层,大部分人都会认为这不是很简单嘛,就Controller.Service.Mapper三层.但在"简单"背后,很多人并没有将各层级的职责划分清 ...

  6. 电子招投标java代码_基于jsp的招投标业务管理-JavaEE实现招投标业务管理 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的招投标业务管理, 该项目可用各类java课程设计大作业中, 招投标业务管理的系统架构分为前后台两部分, 最终实现在 ...

  7. Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课

    Swift项目开发实战-基于分层架构的多版本iPhone计算器-直播公开课 本课程采用Q Q群直播方式进行直播,价值99元视频课程免费直播.完整的基于Swift项目实战,手把手教你做一个Swift版i ...

  8. 干货 | DDD实战:基于洋葱模型的分层代码架构设计

    点击上方"中兴开发者社区",关注我们 每天读一篇一线开发者原创好文 ▎作者简介 作者冯丹是一名非常有激情的一线程序员,喜欢java强大的面向对象能力,scala简洁的函数式编程范式 ...

  9. 【系统架构】大规模的C++项目代码层次结构

    1.前言 C++项目中如果代码层次结构不好,非常容易变得难以维护.对于规模较大的项目而言,必须将整个项目划分成若干模块进行开发. 2.模块 模块包括可执行文件,动态库和静态库. 2.1应用层  最上层 ...

最新文章

  1. Java 9:对可选的增强
  2. 静态变量加载时间,静态代码块加载时间
  3. python web开发 jQuery基础
  4. 马老师 生产环境mysql主从复制、架构优化方案
  5. python分析政策实施前后_用Python分析春节前后的中国A股市场行情(附源代码)
  6. mysql 省份名排序_MySQL:如何利用用户变量进行分组排序并取top1数据
  7. Vue笔记(四)——Vue动画路由
  8. 用python和sympy库解决方程组问题_使用Python的SymPy库解决数学运算问题的方法
  9. idea报错命令行过长
  10. Socket 学习(三).5 UDP 的弱点
  11. snmp v3 参数_snmp v3的安全配置 snmp认证与加密配置(53)
  12. WPS文档怎样转换为图片
  13. ISP-长短曝光融合生成HDR图像
  14. Java初学之人机猜拳游戏
  15. Win10+Cuda10.2的Pytorch安装
  16. 工欲善其事必先利其器,提高编程效率
  17. CVPR 2022 Oral|PoseConv3D开源: 基于人体姿态的动作识别新范式
  18. CobaltStrike XSS
  19. 本科去向选择之一——保研
  20. ANU COMP6670 Python学习笔记

热门文章

  1. w10系统怎么登录服务器,win10系统如何登录服务器地址
  2. Ubuntu 关机和重启命令
  3. 中艺人脸识别考勤机使用方法_办公室考勤人脸机的常见问题和使用操作方法
  4. Daz Studio打开时提示Resource Error的解决方法
  5. VUE 列表页跳转到详情页,点击返回上一页,回到原来的位置
  6. Android 异常 regist too many Broadcast Receivers
  7. 223. 矩形面积(矩形面积并简单版)
  8. 全网最详细的 I/O 多路复用解析
  9. 服务器测试常用指令-分测试内容
  10. 汇川一拖二伺服_汇川技术IS620N伺服(EtherCAT高速总线通信伺服)数码管显示