代码分层设计

简介: 在搭建一个项目之前,除了要进行架构和业务方面的设计和分析,往往还需要对代码的结构进行规范化设计。而分层思想,是应用系统最常见的一种架构模式。

代码分层设计

在搭建一个项目之前,除了要进行架构和业务方面的设计和分析,往往还需要对代码的结构进行规范化设计。而分层思想,是应用系统最常见的一种架构模式。

我们会将系统进行横向切割,根据业务职责划分,这就是代码分层。

这样划分的目的是规范软件系统的逻辑结构,以便于后期开发和维护。

一个软件系统就像一幅传世名画,在色彩和线条的表面之下,是精妙的几何结构。

席里柯的《梅杜莎之筏》,画高五米,宽超七米,结构宏伟,气势磅礴,人体的塑造坚实而有力。尤其是它的画面上,由十几个人构成了两个金字塔式的几何图形。这些就是古典主义的特色。


上面是题外话,下面继续介绍代码分层。

我们熟悉的MVC(Model-View-Controller,分别是模型层、视图层、控制层)三层架构就是非常典型的分层架构模式。

它将页面和业务逻辑分离,提高应用的可扩展性及可维护性。

MVC 三层架构只是概念层面的指导思想,如果想要让开发更规范、职责更明确、层次更清晰,需要下面更为细致的代码分层设计。

在介绍代码的分层之前,需要先了解代码分层结构中的领域模型。

领域模型

下面介绍几个常用的领域模型,其中参考了阿里巴巴编码规范的设计。

DO

DO(Data Object)与数据库表结构一一对应,通过 DAO 层向上传输数据源对象。

DTO

DTO(Data Transfer Object)是远程调用对象,它是 RPC 服务提供的领域模型。

需要注意的是,对于 DTO 一定要保证其序列化,实现 Serializable 接口,并显示提供serialVersionUID,否则在反序列化时,如果 serialVersionUID 被修改,那么反序列化会失败。

BO

BO(Business Object)是业务逻辑层封装业务逻辑的对象,一般情况下,它是聚合了多个数据源的复合对象。

VO

VO(View Object) 通常是请求处理层传输的对象,它通过 Spring 框架的转换后,往往是一个 JSON 对象。

代码分层

在传统的MVC三层结构的基础之上,我们将业务系统设计为如下四层结构:前端层、请求处理层、业务逻辑层和持久层。

下面详细介绍一下各个分层的作用。

前端层

前端层的内容涵盖了从系统外发起的一切请求,还包括定时任务的触发配置,以及系统的监控和检测程序。

请求处理层

请求处理层的作用包括通过模板引擎(FreeMarket、Velocity等)的页面渲染、封装RESTful API的HTTP接口,以及暴露给前端调用的各种类型的接口。

业务逻辑层

业务逻辑层的职责是与数据持久层交互,包括对多个数据源的操作进行聚合,并且提供组合复用的能力。

如果网站采用分布式架构,或者数据库需要分库,也包括对RPC服务的统一调用,为了减少不必要的重复调用RPC服务,RPC Service中对数据进行统一处理以后再返回给Manager,是一个节省RPC连接的做法。

此外,它也是业务通用能力的处理层,其中还包括缓存方案、消息监听(MQ)、定时任务、参数校验、数据转换、异常处理等。

数据持久层

数据持久层承载了数据存储和访问的能力。包括通过DAO访问数据库的能力和通过DAP访问外部数据接口的能力。

良好的代码分层设计可以使代码的耦合性大大降低,易用性大大增强,为系统的微服务化和模块化拆分打下良好的基础。


目录
相关文章
|
SQL 缓存 Java
殷浩详解DDD系列 第三讲 - Repository模式
# 第三讲 - Repository模式 **写在前面** 这篇文章和上一篇隔了比较久,一方面是工作比较忙,另一方面是在讲Repository之前其实应该先讲Entity(实体)、Aggregate Root(聚合根)、Bounded Context(限界上下文)等概念。但在实际写的过程中,发现单纯讲Entity相关的东西会比较抽象,很难落地。所以本文被推倒重来,从Repository
39042 8
|
网络安全 网络架构
ENSP-Kali环境联动
1.ENSP介绍 eNSP(Enterprise Network Simulation Platform)是一款由华为提供的免费的、可扩展的、图形化的网络设备仿真平台,主要对企业网路由器、交换机、WLAN等设备进行软件仿真,完美呈现真实设备部署实景,支持大型网络模拟,让你有机会在没有真实设备的情况下也能够开展实验测试,学习网络技术。
1645 0
ENSP-Kali环境联动
|
安全 C++
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
【C++11保姆级教程】移动构造函数(move constructor)和移动赋值操作符(move assignment operator)
2020 0
|
7月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
54698 11
|
9月前
|
IDE 开发工具 开发者
鸿蒙应用开发从入门到实战(三):第一个鸿蒙应用
本教程详细介绍如何创建并运行第一个HarmonyOS项目,涵盖DevEco Studio项目创建流程、项目目录结构解析以及三种运行方式(预览、模拟器、真机调试),帮助开发者快速入门鸿蒙应用开发。
418 7
|
Java 数据库 关系型数据库
优秀的代码都是如何分层的?
好的应用分层应该做到1.方便后续代码进行维护扩展;2.分层的效果需要让整个团队都接受;3.各个层职责边界清晰。本文针对controller,service, mapper三个维度的应用分层进行整理,以优化后续代码的维护
10799 0
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
1958 10
|
供应链 数据库 UED
图解:订单系统的设计
本文主要讲述了在传统电商企业中,订单系统应承载的角色,就订单系统所包含的主要功能模块梳理了设计思路,并对订单系统未来的发展做了一些思考。
2180 1
图解:订单系统的设计
|
前端开发 测试技术 数据库
DDD架构中assembler和converter的区别
在 DDD 四层架构模式中,assembler 和 converter 常用于对象转换,但两者在实际项目中的使用较为随意。本文从英文释义、语义区分和模型层区分三个方面探讨了两者的区别,建议按模型层区分,即 Interface 和 Application 层使用 assembler,Infrastructure 层使用 converter,以避免混淆和随意使用。此外,将转换代码抽离为独立方法有助于保持代码整洁和可测试性。