软件开发发展历程(二)

从模块到分层:软件架构的第一次系统性演进

本系列第二篇,介绍 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)实现控制器解耦

已发布

分类

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注