说说软件为什么要分层?

背景分析

在大型软件系统设计时,业务一般会相对复杂,假如所有业务实现的代码都纠缠在一起,会出现逻辑不清晰、可读性差,维护困难,改动一处就牵一发而动全身等问题。为了更好解决这个问题就有了我们现在常说的分层架构设计。

软件分层设计

分层设计的本质其实就是将复杂问题简单化,首先基于单一职责原则(SRP-Single responsibility principle)让每个对象各司其职,各尽所能。然后再基于“高内聚,低耦合”的设计思想实现相关层对象之间的交互。这样可以更好提高程序的可维护性和可扩展性,例如生活中的楼宇设计,生日蛋糕设计,企业的组织架构设计等。

通讯领域的OSI参考模型

在计算机通讯领域还有典型的OSI参考模型(Open System Interconnection Reference Model),TCP/IP参考模型等,如图所示:

image

其中,TCP/IP参考模型是OSI参考模型的一种网络简化通讯模型,这里不对每一层进行介绍,具体有关OSI和TCP/IP的知识请自行进行查阅。

互联网领域的分层架构

基于Java的互联网架构,在进行分层设计时,首先要对整体的系统分层架构有一个基本认识,如图所示:

image

在上图中,很多公司会根据雇员的技能特长进行相关分工,例如有运维工程师,中间件平台开发工程师,产品开发工程师,测试工程师等。我们很多初级的java程序员主要从事的是产品开发或者是应用软件(例如客户关系管理系统,分销管理系统,配送管理系统,支付系统等)开发,而在应用软件开发时,我们一般也要进行分层设计,例如典型的MVC分层设计,我们可以参考阿里巴巴开发手册中给出分层设计模型,如图所示:

image

其中,在上图中的箭头表示一种直接依赖关系,开放接口层可以依赖于 Web 层,也可以直接依赖于 Service 层,其它依此类推(具体每层要实现的逻辑可自行查阅阿里巴巴开发手册)。

总结(Summary)

系统分层设计是一种设计思想,是让每层对象都有一个独立职责,再让多层对象协同(耦合)完成一个完整的功能。这样做可以更好提高系统可扩展性,但同时也会增加系统整体运维的难度。