# 软件开发发展历程(二)
Table of Contents
从模块到分层:软件架构的第一次系统性演进
本系列第二篇,介绍 1980~1990 年代软件架构的第一次系统性演进。随着软件规模扩大与图形界面兴起,单纯的模块化已难以支撑需求,软件架构迈入了以“分层”为核心的系统性设计阶段。本文将梳理从模块化设计到 MVC 架构的演进逻辑,并介绍其中关键概念的优势与应用。
模块化的缺陷 → 引出OOP的必要性 → 三层架构雏形的出现 → 因GUI复杂度 → 需要MVC分层
一、模块化设计的困境:代码规模引发的连锁反应
1.1 软件复杂度的爆炸式增长
- 从千行级代码(1980 年代)发展到十万行级的企业 ERP 系统
- 多人协作需求增加,模块边界模糊引发冲突(如 IBM 大型银行系统案例)
- UI 与数据库直接交互导致高耦合(早期 VB/Delphi 应用实例)
1.2 模块化失效的本质原因
- 单一维度切分:功能划分忽略“变化率”不同(UI 频繁变 vs 业务规则稳定)
- 缺乏抽象层次:如税率计算嵌入表单事件中,导致维护困难
- 技术限制:过程式语言无法封装状态,结构体 vs 类对比(C vs C++)
👉 模块化设计已无法应对规模化与协同开发的挑战,促使更清晰的分层架构诞生。
二、面向对象编程(OOP):提升抽象能力以支撑复杂建模
2.1 背景
- 过程式编程难以应对复杂系统
- 面向对象语言(C++、Smalltalk)兴起
2.2 核心概念
- 封装、继承、多态
- “对象”成为系统建模的基本单元
- 倡导以“现实世界建模”为目标
2.3 优势与应用
- 更强的抽象能力 → 更自然地组织代码与模块
- 更高的可扩展性与可维护性
- 成为现代编程范式主流,C++、Java、C# 等语言大多基于 OOP
2.4 OOP 如何突破模块化局限
- 封装性:银行账户类封装余额逻辑,仅暴露存取接口
- 继承与多态:UI 控件继承结构(Button → Control → Component)
- 现实建模能力:如订单、商品、仓库对象之间的交互关系
2.5 OOP 带来的架构可能性
- 职责隔离:通过接口(如 IDataAccess)定义不同层的契约
- 松耦合设计:观察者模式在事件驱动架构中的应用(Smalltalk 案例)
三、图形界面革命:迫使架构分层的外部推力
3.1 图形用户界面(GUI)的兴起
- Windows、Mac OS 图形界面逐步取代命令行
- 开发语言与工具支持 GUI(如 VB、Delphi、MFC)
3.2 带来的新挑战
- UI 逻辑复杂化 → 更需要 MVC、三层等架构支撑
- 多事件驱动、状态管理问题凸显
3.3 GUI 对架构的颠覆性要求
- 事件驱动模型:区别于命令行顺序执行,GUI 采用消息循环机制
- 状态管理复杂:如文档编辑器中的撤销/重做逻辑难以维护
- 平台差异性:同一业务逻辑需适配多平台 UI(如 MFC 框架的痛点)
3.4 早期分层尝试:VB 的三层模型与 Delphi 的数据模块
- 数据绑定机制:如 Delphi 中 TDataSet 与 UI 控件的自动同步
- 可视化设计缺陷:过度依赖拖拽式开发,导致业务逻辑耦合在 Form 代码中(反例)
✅ GUI 的流行推动了 MVC 等架构模式的实践落地。
四、三层架构雏形的出现:逻辑分层的首次系统性实践
4.1 架构分层思想的引入
将应用划分为:表示层(UI)、业务逻辑层(BLL)、数据访问层(DAL)
4.2 每层职责
- 表示层:与用户交互,如按钮、输入框
- 业务逻辑层:处理核心业务规则
- 数据访问层:操作数据库或文件
4.3 优势与应用
- 分工明确,职责清晰 → 更适合多人协作
- 易于维护与测试
- 提高模块重用性
✅ 应用于企业级应用开发中,成为信息系统的主流架构模型雏形。
五、MVC 架构模式:图形界面时代的最佳实践
5.1 起源
- 最早由 Smalltalk-80 提出(1979)
- Smalltalk-80:模型主动通知视图(观察者模式雏形)
- 随着 GUI 编程发展(如 Java Swing、VB),得到广泛应用
- Java Swing:采用事件监听机制(ActionListener)实现控制器解耦
5.2 MVC 如何解耦 UI 与逻辑
- 模型层(Model):负责数据管理与业务规则(如银行账户余额更新)
- 视图层(View):负责展示数据(如同一账户在表格和图表中的呈现)
- 控制器层(Controller):响应用户操作,协调 Model 与 View
📌 MVC 可看作三层架构中“表示层”的内部实现框架,使 UI 更加结构化,利于复用与测试。
5.3 优势与应用
- 分离关注点 → 提高模块独立性
- 易于测试和扩展
- 支持并行开发(界面开发和业务逻辑分开)
📌 MVC 架构在 GUI 桌面应用和 Web 开发(如 ASP.NET MVC、Spring MVC)中广泛使用。
六、三层架构 vs MVC 架构:从系统分工到交互分离
尽管三层架构与 MVC 架构在形式上都采用了“分层”的思想,但二者关注点不同,适用场景也有所差异。
6.1 分层维度对比
特征 | 三层架构 | MVC 架构 |
---|---|---|
切分依据 | 系统职责(数据/逻辑/UI) | 用户交互流程(控制/视图/数据) |
起源背景 | 企业系统、后端服务 | 图形界面(桌面 GUI / Web 前端) |
层与层之间 | 通常是顺序依赖 | 控制器协调 Model 与 View,交互更频繁 |
6.2 应用场景差异
- 三层架构:强调模块独立,便于维护和扩展,适合后端服务、信息管理系统
- MVC 架构:强调交互分离、响应事件,适合 GUI 应用、前端框架
6.3 相互关系
可以将 MVC 看作是三层架构中表示层的内部再分层:
三层架构├── 表示层 View层 (UI)│ └── MVC(三层架构内的进一步划分)├── 业务逻辑层 Service层└── 数据访问层 Dao层
七、设计模式的系统化提出:经验的提炼与规范化
7.1 《设计模式》一书出版(1994,Gang of Four)
总结了 23 个经典的面向对象设计模式(如工厂模式、观察者模式、单例、装饰器等)
7.2 作用与意义
- 提高代码复用性与可读性
- 提供通用解决方案,降低“重复造轮子”
- 促进团队协作与代码风格统一
📌 MVC 也是一种设计模式,强调将视图、模型、控制器职责分离。
八、小结:架构第一次系统性升级的核心关键词
关键词 | 代表意义 |
---|---|
三层架构 | 引入分层思想,明确职责划分 |
面向对象 | 提升抽象与建模能力,支撑大型系统开发 |
设计模式 | 提炼通用解决方案,促进团队协作 |
MVC 架构 | GUI 编程中的结构化最佳实践 |