代码如何分层

原文参见:代码分层的设计之道

在复习设计模式的知识点,首先复习的是单一职责原则。这个原则本身理解简单,实践却并不容易,需要在编码和架构设计的过程中,不仅对代码本身做的事了解,还需要对业务有总体了解,这样才知道怎么划分职责,服务化的过程中怎么拆分服务。

之前看过梁桂钊写过类似的东西,记不起来了,现在再去看看。

我的目标是:弄明白应该如何拆分类或者服务,有没有具体的最佳实践或者指导原则。

分层思想,将系统横向分割,根据业务职责划分,比如MVC。

view层不直接和model层交互,而是通过controller层。

model层专注于处理数据

view层专注于渲染数据

controller层专注于,转发view层对数据的请求,将model层的数据响应结果返回给view层渲染

 

传统MVC架构的问题在于,前后端职责耦合,降低了开发的效率。前端不能专注于渲染数据,后端不能专注于处理数据。

因为后端直接发送渲染后的视图给前端,前端在开发的时候可能需要搭建后端环境才能把环境跑起来。

 

比如使用基于servlet的模板技术jsp开发,开发的过程中,jsp需要依赖servlet容器才能展示效果。

 

首先需要解决的痛点是数据与视图分离,于是,view层纯粹的进行前端展示逻辑、样式编写,于是前端通过Ajax异步向后端controller请求数据,controller只发送json格式的数据给前端,不发送完整视图

代码分层参考:

图片来源http://blog.720ui.com/2018/server_layer/#textlogo

 

数据持久层:专注于数据的查询和修改,只被业务逻辑层访问。

业务逻辑层 的职责是与数据持久层交互,对多个数据源的操作进行聚合,并且提供组合复用的能力。此外,它也是业务通用能力的处理层,其中还包括缓存方案、消息监听(MQ)、定时任务等等。此外,我们要将尽可能多的业务处理放在业务逻辑层,包括了参数校验、数据转换、异常处理等,而不是在 Controller 再去处理。

请求处理层:模板引擎返回整个页面、json数据、RPC调用、其他WebService调用。

项目结构:

图片来源http://blog.720ui.com/2018/server_layer/#textlogo

 禁止跨层级调用

领域模型:

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

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

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

DO 和 DTO 唯一的区别在于,一个是本地数据源的领域模型,一个是远程服务的序列化领域模型。

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

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

 

总结:

1、代码分层参考,可以结合自己的项目来分析

2、项目结构,可供参考

3、领域模型,在领域建模的时候可以参考

 

延伸阅读:

优秀的代码都是如何分层的?

### 嵌入式系统中代码分层设计的最佳实践 嵌入式系统的代码分层设计是一种将系统功能按照逻辑层次进行划分的方法,目的是提高代码的可维护性、可扩展性和可移植性。以下是从引用内容和专业领域知识中总结的最佳实践。 #### 1. 分层结构概述 嵌入式系统的分层结构通常从低到高依次为硬件抽象层(HAL)、操作系统层、中间件层和应用层。这种分层方式能够有效隔离不同层次的功能,减少耦合度[^2]。 - **硬件抽象层(HAL)**:提供对底层硬件的访问接口,屏蔽硬件差异。例如,通过统一的API访问不同的微控制器外设。 - **操作系统层**:包含实时操作系统(RTOS)的核心功能,如任务调度、内存管理和中断处理。对于某些轻量级系统,可能不使用RTOS,而是采用裸机编程[^4]。 - **中间件层**:实现网络通信、数据处理等通用功能,屏蔽底层操作系统的异构性[^1]。 - **应用层**:专注于具体业务逻辑的实现,与底层硬件和操作系统解耦。 #### 2. 自顶向下与自底向上的设计方法 在嵌入式系统中,代码分层设计可以通过两种主要方法实现:自顶向下和自底向上。 - **自顶向下**:从系统需求出发,逐步分解为子系统和模块。这种方法有助于确保最终实现符合初始需求,适用于复杂系统的开发[^4]。 - **自底向上**:从底层组件开始构建,逐步集成到高层模块。这种方法依赖于开发者的经验和对领域的深刻理解,适合已有成熟组件的场景[^4]。 #### 3. 时间触发设计模式的应用 对于需要实时性和确定性的嵌入式系统,时间触发设计模式是一种有效的解决方案。该模式通过预定义的时间表来调度任务,确保系统的稳定性和可靠性[^3]。以下是其关键点: - **时间调度**:根据任务优先级和周期性要求,合理分配CPU资源。 - **硬件同步**:通过硬件定时器或其他同步机制,保证任务按时执行。 - **错误处理**:设计健壮的异常处理机制,避免因单点故障导致系统崩溃。 #### 4. 示例代码 以下是一个简单的嵌入式系统分层设计示例,展示了如何通过分层结构实现功能分离。 ```c // 硬件抽象层 (HAL) void hal_gpio_init(void) { // 初始化GPIO引脚 } // 操作系统层 (RTOS) void os_task_create(void (*task_func)(void)) { // 创建任务 } // 中间件层 void middleware_data_process(uint8_t *data, uint16_t length) { // 数据处理逻辑 } // 应用层 void app_main(void) { hal_gpio_init(); // 初始化硬件 os_task_create(app_task); // 创建任务 } void app_task(void) { uint8_t data[] = {0x01, 0x02, 0x03}; middleware_data_process(data, sizeof(data)); // 调用中间件功能 } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值