08-软件设计基础
1. 什么是软件设计
1.1. 软件设计 重要
- 软件设计是指关于软件对象的设计,是一种设计活动。软件设计既指软件对象实现的规格说明,又指这个规格说明产生的过程。
- 软件设计活动以需求开发的制品(需求规格说明和分析模型)为基础,构建软件设计方案描述和原型,为后期的构造活动提供规划或蓝图。
- 软件设计兼具工程性和艺术性,由于软件系统的可变性,软件设计具有演化性,也因为软件设计的过程实际上就是一系列决策发生的过程,软件设计具有决策性。
1.2. 软件设计的核心思想
- 软件设计方法的核心问题:控制系统复杂度
- 分解与抽象是软件设计的核心思想,两者都是由层次性的,彼此之间可以嵌套使用。
- 分解:横向上将系统分割为几个相对简单的子系统与子系统之间的关系
- 抽象:在纵向上聚焦个子系统的接口(这里的接口与实现相对),可以分离接口和实现,使得人们更好的关注软件系统本质,降低复杂度。
1.3. 软件设计思想的发展
1.4.4. 如何去控制复杂度/h3>
1.5. 理解软件设计
1.5.1. 什么是设计
- Wiki:设计是为制作每个对象或系统奠定基础的计划。
- [Brooks 2010]认为上述定义的精髓在于计划、思维和后续执行。
- [Ralph 2009]将设计定义为:
- 设计(名词):?个对象的规格说明。它由?创造,有明确的?标,适?于特殊的环境,由?些基础类型构件组成,满??个需求集合,受?定的限制条件约束。
- 设计(动词):在?个环境中创建对象的规格说明
- 需求是外部表现,需求和内部结构是有鸿沟的。
- 非功能需求(质量需求)
- 始终进行迭代。
1.9. 设计的决策
- [Freeman1980]认为:软件设计是?种问题求解和决策的过程;问题空间是?户的需求和项?约束,解空间是软件设计?案;从问题空间到解空间的转换是?个跳跃性的过程,需要发挥设计师的创造性,设计师跳跃性地建?解决方案的过程被称为决策。
- 软件设计的问题求解与决策比普通数学问题的求解与决策要困难的多,因为软件设计面对的问题通常都是不规则的(Ill-Structured)[Simon1978],包含有很多的不确定性和信息不充分情景,所以进行设计决策时并不能保证决策的正确性,往往需要在很?时间之后才能通过验证发现之前决策的正确与否。
1.9.1. 决策的约束性
- 约束满足与决策
- 约束:
- 需求;环境;资源;技术 …
- 最初的需求确定了对设计情况的最基本的约束和要求。
- 通常,在设计工作本身中最终会发现更多的约束。
- 约束既适用于设计的工件,也适用于设计活动中涉及的流程和参与者
- 约束满足
- 决策的概念完整性也?分重要!
- 决策一定要慎重,不能过于随意。
- 从服务、包装、售卖都会给你提供一种一致的体验。
- 魅族的人机交互
2. 软件设计的分层 重要
2.2.2. 低层设计: 代码设计
- 对?个方法/函数的内部代码进?设计
- 又被称为软件构造,通常由程序员独立完成
- 依赖于语?提供的机制(程序设计课程)
- 面向对象和结构化
- 指针或地址
2.2.3. 模块划分
- 1970s:函数的成熟与模块的出现
- 模块划分:将系统分成简单片段:?段有名字,可以被反复使用
- 名字和使??法称为模块的抽象与接?
- 模块内部的程序?段为精化与实现
2.3. 中层设计的开始
- 模块划分隐藏?些程序片段(数据结构+算法)的细节,暴露接口于外界
- 以模块作为概念
2.4. 中低层设计的问题
- 《Programming-in-the-Small VS Programming-in-the-Large》
- 过于依赖细节
- 连接与依赖
- 接口与实现
- 忽略的关键因素: 无法有效抽象部件的整体特性
- 总体结构
- 质量属性
- ?型软件开发的?个根本不同是它更关注如何将?批独?模块组织形成?个”系统”,也就是说更重视系统的总体组织
- 12306的宕机问题,我们也不能承受过亿的PV,使用硬件不划算,但是我们可以快速的恢复就很好
- 服务器之间的负载均衡,部分静态数据,缓存和反向代理
2.5. 高层设计:体系结构
- 部件承载了系统主要的计算与状态
- 连接件承载部件之间的交互
- 部件与连接件都是抽象的类型定义(就像类定义),它们的实例(就像类的对象实例)组织构成软件系统的整体结构,配置将它们的实例连接起来
- 连接件是?个与部件平等的单位
- 消息队列、方法调用都可以被我们理解为连接件
- 分析设计出发点
- 建立候选方案
- 生成最终方案评价
- 设计需求:对于设计我们要做的事情
3.2. 设计的方法
- 软件设计的方法可以分为以下几种[SWEBOK 2004]:
- 结构化设计方法
- ?向对象设计
- 数据为中?设计:有一些项目是做数据仓库等的,数据爬取操作和读取。
- 基于构件的设计:调用构件和库
- 形式化方法设计
3.2.1. 结构化设计方法
- 是一个经典的软件设计方法,采取自下向上和逐步求精的思想,按照功能对系统进行分解
3.2.2. 面向对象设计方法
- 源自于数据抽象和职责驱动,利用封装、继承、多态等方法,提高软件的可扩展性和可复用性。
3.2.3. 以数据为中心设计
- 开始于系统操纵的数据结构而不是它所表现的功能。
3.2.4. 基于构件的设计
- 重点在于构件的提供、开发和继承,以提高系统的可复用性。
3.2.5. 形式化方法设计
- 通过数学方法来对复杂系统进行建模。
3.3. 静态模型vs动态模型
- 描述软件设计的模型,通常可以分为两类:
3.3.1. 静态模型
- 静态模型是通过快照的?式对系统中时间不变的属性进?描述。通常描述的是状态,?不是?为。
- ?如:?个数字的列表是按??排序好的。
3.3.2. 动态模型。
- 动态模型通常描述的是系统行为和状态转移。
- ?如:排序的过程中如何进?排序。
3.4. 结构化设计模型和?向对象设计模型
- 在结构化设计中
- 静态模型:实体关系图
- 动态模型:数据流图和结构图(Structure Chart)
- 在面向对象设计中
- 静态模型:类图、对象图、构件图、部署图;
- 动态模型:交互图(顺序图和通信图)、状态图、活动图等
3.5. 软件设计描述规范
- 早在 1998 年,IEEE 组织就提出了 IEEE 1016-1998 标准[IEEE1016-1998] 以规范软件设 计的?档化描述。
- 在 2009 年 3 ?,IEEE-SA 标准委员会修订了 1016 标准[IEEE1016-2009]。 IEEE 的标准并没有限定设计描述?档的具体结构,?是通过解释? 系列概念说明了软件设计 描述?档应该遵循的思路和基本内容。
3.6. 软件设计描述模型
3.8. 利益相关者
- 设计视角必须符合在需求(Requiement)中利益相关者(Stakeholder)的设计关注点 (Design Concern)。
- 设计对不同的利益相关者来讲,有着不同的意义[P?eeger 2009]:
- 顾客想要确认现有的软件设计?案能够保证其所期望的系统的功能和行为可以实现。
- 架构师想要知道软件单元、计算平台和系统环境足够实现需求中要求的非功能性需求。
- 设计人员想要了解系统的整体设计,以确保系统的每个设计决策和系统功能都能实现。
- 开发人员想要知道所开发的单元的精确描述,以及与其它单元的关系。
- 测试人员想要确认怎样测试设计的所有方案。
- 维护人员系统想要在修复问题和添加新特性时,能够保持体系结构的完整性和设计的?致性。
- 因为每个利益相关者?的不?样,对设计就会产?不同的设计关注点。?我们的设计得全?考量各个利益相关者的设计关注点,给出相应的设计视角下的设计视图。
3.9. 设计理由
4.1. 设计文档书写要点
- 充分利?标准的?档模版,根据项?特点进?适当的裁剪。
- 可以利?体系结构?格的图,让读者更容易把握?层抽象。
- 利?完整的接口规格说明定义模块与模块之间的交互。
- 要从多视角出发,让读者感受?个?体的软件系统。
- 在设计?档中应体现对于变更的灵活性。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!