什么是软件设计
为什么要软件设计
软件的复杂是系统性的,而不是偶然的。
软件工程的复杂性来自:问题域的复杂,管理开发过程的复杂,软件的灵活性,刻画分离系统的行为的复杂。
软件设计的核心思想:分解与抽象。并用分解和抽象,使之具有层次性,来解决软件工程的复杂。
设计的类别
工程 or 艺术?
设计=工程设计+艺术设计
理性主义 or 经验主义?
理性主义:形式化软件工程等,更看重设计的工程性。
经验主义:考虑人(程序员等)的因素,增加灵活性,文档化、原型、尽早验证、迭代式开发等都被实践证明能够有效弥补人类的缺陷。
将设计视为决策
非常复杂的问题,从问题空间到解空间存在巨大的跳跃性。
决策问题存在约束:需求;环境;资源;技术等。
多解问题:决策存在多样性。
设计是一个顺序决策:
- 顺序性:前一个决策会影响后一个,而且不可预⻅
- 不可逆性:无法完全消除一个前期错误的决策
软件设计的分层
从底层到顶层不断抽象,在每层中不断分解。
低层设计是代码设计,屏蔽程序中复杂数据结构与算法的实现细节,将算法和数据的接口暴露给中层
中层设计的目标:模块化;信息隐藏;OO原则。
高层设计是体系结构的设计。
高层设计由部件,连接件和配置组成。部件和连接件具有同等的地位。
敏捷视点:
- 只有高层设计良好,底层设计才可能良好
- 只有写完并测试代码之后,才能算是完成了设计
- 源代码可能是主要的设计文档,但它通常不是唯一一个必须的
软件设计过程、方法和模型、描述
设计的活动
软件设计的方法和模型
结构化设计方法、 面向对象设计、 数据为中心设计、 基于构件的设计、 形式化方法设计。
静态模型vs动态模型
静态模型:通常描述的是状态,而不是行为。比如:一个数字的列表是按大小排序好的。
动态模型:通常描述的是系统行为和状态转移。比如:排序的过程中如何进行排序。
在结构化设计中
- 静态模型:实体关系图
- 动态模型:数据流图和结构图(Structure Chart)
在面向对象设计中
- 静态模型:类图、对象图、构件图、部署图
- 动态模型:交互图(顺序图和通信图)、状态图、 活动图等
软件设计描述
设计视⻆必须符合在需求(Requiement)中利益相关者(Stakeholder)的设计关注点 (Design Concern),因为每个利益相关者目的不一样,对设计就会产生不同的设计关注点。而我们的设计得全面考量各个利益相关者的设计关注点,给出相应的设计视⻆下的设计视图。