写点什么

想解耦必分层

用户头像
菜根老谭
关注
发布于: 2020 年 07 月 02 日
想解耦必分层



我们在设计和展示一个系统架构时,经常给看到类似的架构图,这个架构图最明显的特征就是将一个复杂的系统划分了N个层次。为什么要划分如此多的层次,因为分层是应对系统复杂度的一种设计方式。



如何评价一个架构

在分享分层思维之前,我们先来分析一下,如何评价一个架构是不是一个好的架构。

首先从形式上一定要满足以下两点:

  1. 职责单一,关系清晰

  2. 高内聚、低耦合

开发架构设计的核心简单来说就是解耦复用



从Java Web发展过程谈分层



分层在计算机的世界里并不陌生,不论是网络分层架构(七/四层协议),还是开发框架的三层架构,都体现着分层的思维。我们从Java Web开发模式发展的过程详细分析下分层的必要性。



阶段1:JSP Model1

Java Web诞生之初根本没有分层的概念,展示、业务逻辑、模型都混杂在一起,当一个系统变得越来越复杂的时候,就造成了代码难以复用,难以维护。



阶段2:JSP Model2

JSP Model2模式已经可以清晰的看到MVC完整的结构了,相比与Model1,程序设计更具层次性,让复用和维护变得更加简单。

  • JSP:视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;

  • Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;

  • JavaBean:模型层,完成具体的业务工作。



阶段3:经典的三层架构



随着大型系统的开发,业务逻辑越来越复杂,传统的MVC的架构模式也存在一定的局限性,业务逻辑并没有独立抽象出来,无法实现业务逻辑和控制逻辑的解耦,业务逻辑和业务模型的解耦,MVC的设计模式最终演化为由展示层、业务逻辑层、数据访问层组成的三层架构,特别随着spring等框架的诞生和流行,三层架构已成为Java Web开发的标配了。



根据上图所示,我对每层做一个解释:

  1. View层。View层即UI层,可采用的技术如JSP,Structs,SpringMVC等

  2. Controller层。Controller表示控制器层,可采用的技术,如Servlet/Filter,Spring等

  3. Service层。Service层表示核心服务层,向架构上层提供服务

  4. DAO层。DAO层表示数据访问层,可采用的技术如jdbc和ORM框架(如Spring JDBC,JPA,Hibernate,Mybatis等)

  5. Model层。Model层即表示JavaBean对象

  6. Utilities层。Utilities层表示公共工具层



三层架构的使用带来的主要好处:

1、解耦

上一层依赖于下一层,如果测试下一层没有问题,那么问题就只有可能发现在本层了,便于发现和改正BUG。体现了“高内聚,低耦合”的思想。各个层次分工明确,将一个复杂问题简单拆分了。

2、代码的复用和劳动成本的减少

分层的根本在于代码的复用和劳动成本的减少。分层的最理想化的结果是实现层与层之间的互不依赖的内部实现,所谓的即插即用!



除了我们常用的三层架构开发模式,前后端分离开发、大热的中台架构都是分层思维的极致体现。



分层的原则



  • 我们之所以要以水平方式对整个系统进行分层,是我们下意识地确定了一个认知规则:机器为本,用户至上。分层架构中的层次越往上,其抽象层次就越面向业务,面向用户;分层架构中的层次越往下,其抽象层次就变得越通用,面向设备。



  • 分层的第二个依据是面对变化。分层时应针对不同的变化原因确定层次的边界,严禁层次之间互相干扰,或者至少将变化对各层带来的影响降到最低。



  • 在进行分层时,我们还应该保证同一层的组件处于同一个抽象层次,这是分层架构的设计原则。



协作的原则



分层架构的依赖都是自顶向下传递的,这也符合大多数人对分层的认知模型。从抽象层次看,层次越处于下端,就会变得越通用越公共,与具体的业务隔离得越远。



依赖倒置原则提出了对这种自顶向下依赖的挑战,它要求“高层模块不应该依赖于低层模块,二者都应该依赖于抽象。”依赖倒置原则隐含的本质是:我们要依赖不变或稳定的元素(类、模块或层)。谁更稳定?抽象更稳定!抽象不应该依赖于细节,细节应该依赖于抽象。由此又一次验证架构思维的核心思维是抽象思维,分层思维是基于抽象思维的扩展。



所以分层协作在实际的开发中如何应用?

  • 坚持“面向接口设计”的原则,即“针对接口编程,而不是针对实现编程”。

  • 灵活应用相应设计模式,比如门面模式、策略模式等。





《程序员的思维修炼》是菜根老谭结合自己的工作经历和对这个岗位发展的认知而专门开辟的一个专栏,旨在分析程序员的职业发展的过程中我们应该锻炼哪些思维意识,如何去合理正确的看待事物,如何形成适合自己发展的思维体系。本专栏既是对过去思考的总结,也是对自己发展所具备的能力的思考,希望这些内容能陪我成长,帮大家解疑答惑。该专栏首发今日头条,关注我的同名头条号和微信公众号获取更及时的内容推荐。



发布于: 2020 年 07 月 02 日阅读数: 168
用户头像

菜根老谭

关注

浪迹产品,技术领域,擅长IT架构和产品架构 2009.01.19 加入

经历技术、产品、运营等多个领域,现在负责公司整体产品研发。喜欢并擅长做 IT 架构和产品架构,微信公众号:菜根老谭(ID:CGLT_TAN),欢迎关注,聊产品,聊技术。

评论

发布
暂无评论
想解耦必分层