分层设计将软件划分成若干层,每一层只解决一部分问题,通过所有层的协作来完成整体的目标。一个复杂的问题通过分解成一系统子问题,这样就有效的降低了每个子问题的规模与复杂度。
分层设计带来的好处:
- 降低了系统软件的复杂度。将一个复杂问题通过分解,分而治之。
- 功能的复用和封装。
项目分层的目的
- 保证多成员参与的项目保持视觉一致性;
- 迭代与交接可以更加无缝;
- 减少设计出错率;
- 提升团队工作效率;
- 直接目的是约束设计行为,最终目的是确保设计合理统一
分层以及业务切分设计
切分原则
- 典型的 MVC 分层模式
- 在中间的业务层,按照业务领域,纵向分隔多个业务应用(app),在cmd 目录下区分。
- 在每个业务应用内部,采用通用分层设计,详见“分层设计”。
- 理清楚每个层次的边界是什么
- 先水平分层,再垂直切分业务模块,模块内部再次水平分层。
设计思想和原则
- 迪米特法则:不该有直接依赖关系的类之间,不要有依赖;有依赖关系的类之间,尽量只依赖必要的接口,也就是需要基于接口而非实现编程
- 这样做的好处:
- 符合一个原则:开放封闭原则(Open Close Principle):如果我的依赖源有变化的时候,我们只需要再增加一个实现就可以,不需要变更整个流程。
- Mock 数据的时候,我只需要实现这个接口就可以实现Mock。而且可以使用自动化工具生成Mock代码
如何来做系统分层
我们先来看下阿里系统分层的规约,如下图。
- 终端显示层:各端模板渲染并执行显示的层。当前主要是 Velocity 渲染,JS 渲染, JSP 渲染,移动端展示等。这块其实就是通常的前端。
- 开放接口层:将 Service 层方法封装成开放接口,同时进行网关安全控制和流量控制等。
- Web 层:主要是对访问控制进行转发,各类基本参数校验,或者不复用的业务简单处理等。
- Service 层:业务逻辑层。
- Manager 层:通用业务处理层。这一层主要有两个作用,其一,你可以将原先 Service 层的一些通用能力下沉到这一层,比如与缓存和存储交互策略,中间件的接入;其二,你也可以在这一层封装对第三方接口的调用,比如调用支付服务,调用审核服务等。
- DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase 等进行数据交互。这样的定义,其实是想将数据 CURD 的逻辑和业务逻辑进行分离,将 基础CRUD 封装在 DAO 中,业务逻辑即放在业务层中。
- 外部接口或第三方平台:包括其它部门 RPC 开放接口,基础平台,其它公司的 HTTP 接口。
在这个分层架构中主要增加了 Manager 层,它与 Service 层的关系是:Manager 层提供通用的处理服务接口,Service 层负责依据业务逻辑来编排原子接口。