软件设计的核心思想分解和抽象

image-20250420151655398

分解和抽象具有并用和层次性

什么是软件设计

设计的决策

决策具有约束性

image-20250420152431337

决策具有多样性(选择性) 多个同样好的方案,选择一个

决策具有演化性

  • 遵循路线:问题决策验证下一个问题
  • 决策的顺序影响
  • 前一个决策会影响后一个,而且不可预见
  • 决策的不可逆性
  • 无法完全消除一个前期错误的决策
  • 决策要一致!

image-20250420152718226

决策的概念完整性

软件设计的分层

低层设计

  • 将基本的语言单位(类型与语句),组织起来,建立高质量的数据结构+算法
  • 常见设计场景:
    • 数组的使用,链表的使用,内存的使用,遍历算法,递归算法…
  • 经典场景:
    • 堆栈,队列,树,排序算法,查找算法…
  • 数据结构与算法审美:
    • 简洁、结构清晰,坚固(可靠、高效、易读)

低层设计的本质 屏蔽程序中复杂数据结构与算法的实现细节image-20250420153251050

低层设计:代码设计

  • 对一个方法/函数的内部代码进行设计
  • 依赖于语言提供的机制

模块划分

  • 将系统分成简单片段
    • 片段有名字,可以被反复使用
  • 名字和使用方法称为模块的抽象与接口
  • 模块内部的程序片段为精化与实现

中层设计

image-20250420153830188

模块化的目标:完全独立性

  • 有助于理解、使用和 复用、开发、修改
  • 困难和目标:模块之间是不可能完全独立的

中层设计总结:设计目标

image-20250420155605798

中低层设计的问题

  • 过于依赖细节
    • 连接与接口 接口与实现
  • 忽略的关键因素 无法有效抽象部件的整体特性
    • 总结结构 质量属性

大型软件的开发的一个根本不同是它更关注如何将大批独立模块组织形成一个”系统“,也就是说更重视系统的总体组织

高层设计体系结构

  • 部件承载了系统主要的计算与状态
  • 连接件承载部件之间的交互
  • 部件与连接件都是抽象的类型定义(就像类定义),它们的实例(就像类的对象实例)组织构成软件系统的整体结构,配置将它们的实例连接起来
  • 连接件是一个与部件平等的单位

image-20250420160026345

敏捷视点

  • 只有高层设计良好,底层设计才可能良好
  • 只有写完并测试代码之后,才能算是完成了设计
  • 源代码可能是主要的设计文档,但它通常不是唯一一个必须的。

软件设计过程、方法和模型、描述

image-20250420160750266

软件设计的方法可以分为以下几种

  • 结构化设计方法
  • 面向对象设计
  • 数据为中心设计
  • 基于构件的设计
  • 形式化方法设计

描述软件设计的模型,通常可以分为两类:

  • 静态模型
    • 静态模型是通过快照的方式对系统中时间不变的属性进行描述。通常描述的是状态,而不是行为。
      • 比如:一个数字的列表是按大小排序好的。
  • 动态模型。
    • 动态模型通常描述的是系统行为和状态转移。
      • 比如:排序的过程中如何进行排序。

结构化设计模型和面向对象设计模型

  • 在结构化设计中
    • 静态模型
      • 实体关系图
    • 动态模型
    • 数据流图、结构图(Stucture Chart)和流程图(Flow Diagram)
  • 在面向对象设计中
    • 静态模型
      • 设计类图、对象图、构件图、部署图;
    • 动态模型
      • 交互图顺序图和通信图)、状态图、活动图等

image-20250420161535596