目录
前言
重点一览
软件工程设计
软件设计定义
软件设计包含的两类活动
软件设计包涵
软件的质量属性
各种设计技术
程序结构(深度、宽度、扇入、扇出)
完整的设计规格
软件体系架构
用户界面设计的3条原则
用户界面设计的3种分析
结构化设计方法
结构化程序设计的概念
流程图
程序流程图的主要缺点:
伪代码
NS图
PAD图
本章小结
前言
本复习笔记基于王玉林老师的课堂PPT与复习大纲,供自己期末复习与学弟学妹参考用。
重点一览
分为两个部分讲解: 软件设计工程和结构化设计方法
软件工程设计
软件设计定义
软件设计定义为软件的架构、构件、接口和其他特性的定义过程及该过程的结果。
软件设计是:
- 软件工程生命周期中的一个活动
- 进行软件编码的基础
- 软件需求分析被转化为软件的内部结构
- 是连接用户需求和软件技术的桥梁
软件设计包含的两类活动
软件架构设计
- 又叫“概要设计”、“顶层设计”
- 描述软件的顶层架构和组织,划分不同的组件
- 将软件需求转化为数据结构和软件的系统结构
- 软件架构设计阶段完成体系结构设计(架构设计)、数据设计、接口设计
软件详细设计
- 又叫“组件设计”、“过程设计”
- 详细描述各组件以便编码实现
- 完成各模块内的过程设计
软件设计包涵
软件设计主要为:
分解设计:将软件映射为各组件,即模块划分
系列模式设计:建立一系列软件中可重用的公共组件
不包括
创新设计:在软件下需求分析阶段对用户需求进行构思和确定的解决方案
因为它被认为是需求分析和需求规格定义的一部分。
软件的质量属性
软件质量可以通过质量属性来描述:FURPS质量属性
- 功能性:Functionality
- 易用性:Usability
- 可靠性:Reliability
- 性能:Performance
- 可支持性:Serviceability
- 扩展性
- 适应性
- 可维护性
各种设计技术
抽象、细化、设计模式、模块化、信息隐藏、功能独立、重构
模块化为什么不能无限划分模块?
因为模块划分越小,虽然每个模块成本就会越小,但是相对应的集成成本会大幅增加,从而使得总成本高于预期。所以最佳选择是在最小代价区间中,如下图:
【模块化含义】:软件被划分为命名和功能相对独立的多个组件(通常称为模块),通过这些组件的集成来满足问题的需求。
信息隐藏原则的定义?
模块应该具有彼此隐藏的特性,即:模块定义和设计时应当保证模块内的信息(过程和数据)不可以被不需要这些信息的其他模块访问。
意义:
信息隐藏意味着有效的模块划分可以通过定义一些相对独立的模块来实现;
信息隐藏原则定义和隐藏了模块内的过程细节和模块内的本地数据结构
重构的定义?
不改变组件功能和行为条件下简化组件设计(或代码)的一种重组技术。
方法:
检查现有设计的冗余情况、未使用的设计元素、无效或不必要的算法、较差的构建方式或不恰当的数据结构,或其他任何可更改并导致更好设计的错误。
抽象
- 含义:忽略具体的信息将不同事物看成相同事物的过程,是发现事物本质特征和方法的过程
- 机制:参数化、规范化
- 规范化抽象:过程抽象、数据抽象、控制(迭代)抽象
- 抽象侧重于相关的细节和忽略不相关的细节,作为识别基本行为和消除不相关及繁琐细节的过程,允许设计师专注于解决特定问题的相关细节而不考虑相关的底层细节。
- 在进行软件设计时,设计开始时应尽量提高软件的抽象层次,按抽象级别从高到低进行软件设计。
设计模式
- 通用含义:在给定上下文环境中一类共同问题的共同解决方案
- 具体含义:一套被反复使用的、多人知晓的、经过分类编目的、代码设计经验的总结
- 目的:为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性
- 分类:创建型模式(如抽象工厂模式)、结构型模式(如适配器模式)、行为型模式(如命令模式)
- 范围:由面向对象的程序构造,到(可视化的)对象框架构建
功能独立
- 每个模块只解决了需求中特定的子功能并从程序结构的其他部分看该模块具有简单的接口
- 好处:
- 易于开发(功能被划分、接口被简化)
- 易于维护(次生影响有限、错误传递减少、模块重用)
- 定性衡量标准
- 内聚性:模块的功能相对强度
- 信号隐蔽原则有利于提高模块的内聚性
- 耦合性:模块之间的相互依赖程度
细化
- 细化就是逐步求精的过程
- 与抽象的关系:是一组相对的概念,相辅相成
- 抽象使设计师确定过程和数据,但不局限于底层细节
- 细化有助于设计者在设计过程中揭示底层细节(过程/数据细节...)
在软件工程中,从系统定义到实现,每进展一步都可以看作是对软件解决方案的抽象化过程的一次细化!
程序结构(深度、宽度、扇入、扇出)
相关概念:
- 程序结构的深度:结构层次数
- 程序结构的宽度:同一层最大模块数
- 模块的扇入扇出:扇出标识一个模块直接调用/控制其他的模块数目;扇入则定义为调用/控制一个给定模块的模块个数。
多扇出意味着需要控制和协调许多下属模块,而多扇入的模块通常是公用模块
完整的设计规格
一共有四层:核心层、基础层、应用层、用户接口层。
- 每一层为上层提供服务,并作为下一层的客户
- 每一层至多和相邻的上下两层交互,功能的改变最多影响相邻的内外层
- 允许每层用不同的方法实现,为软件复用提供强大的支持
软件体系架构
5种架构风格
- 单主机结构(集中式体系结构)
- 分布式结构
- 多处理器体系结构
- 客户机/服务器体系结构(C/S, B/S结构)
- 分布式对象体系结构
- 代理
C/S架构
- 基于资源不对等与实现资源共享提出,由客户机、服务器、网络组成。
- 传统的C/S体系结构分为两层:客户机、服务器
- 瘦客户机模型:服务器负责所有计算
- 胖客户机类型:服务器只负责数据管理
- 三层C/S体系结构增加了应用服务器,整个系统分成表示层,应用逻辑层,数据层三个部分。
- 可以将整个应用逻辑驻留在应用服务器上,只有表示层存在于客户机上
B/S架构
浏览器/服务器风格是一种三层体系结构的实现方式,其具体结构为浏览器/Web服务器/数据库服务器。结构如下图:
优点:系统安装、修改、维护全在服务器端解决;提供了异种机、异种网、异种应用服务的联机、联网、统一服务的最现实的开放性基础。
不足:缺乏对动态页面的支持能力,没有集成有效的数据库处理功能;数据查询等响应速度远远低于CS;数据提交一般以页面为单位,动态交互性不强,不利于在线事务处理。
用户界面设计的3条原则
- 用户控制系统/用户为中心
- 减少用户记忆负担
- 保持界面一致
用户界面设计的3种分析
- 用户是什么人?
- 用户怎样学习与新的系统交互?
- 用户需要完成哪些工作?
结构化设计方法
结构化程序设计的概念
如果一个程序的代码块仅仅通过顺序、选择和循环这三种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。
流程图
程序流程图也叫程序框图,是软件开发者最熟悉的算法表达工具。
基本控制结构
顺序型、选择型、先判定型(while)、后判定型(until)、多情况型(case)
程序流程图标准符号
循环的标准符号
注解符的使用
多选择判断
程序流程图的主要缺点:
- 程序流程图从本质上来说不是逐步求精的好工具,它容易使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构
- 程序流程图中用箭头代表控制流,程序员可以不顾结构程序设计的精神,随意转移控制,而使程序结构过于混乱
- 程序流程图在表示数据结构方面存在不足
伪代码
一种介于自然语言和形式化语言的半形式化语言,用于描述功能模块的算法设计和加工细节的语言,也称为程序设计语言。
基本控制结构
简单的陈述句结构:避免复合语句
判定结构:IF_THEN_ELSE或CASE_OF
重复结构:WHILE_DO或REPEAT_UNTIL
实例
NS图
一种符合结构化程序设计原则的图形描述工具,叫作盒图,也叫NS图。
基本控制结构
顺序型、选择型、WHILE重复型、UNTIL重复型、多分枝选择型
PAD图
有程序流程图演化而来,用结构化程序设计思想表现程序逻辑结构的控制工具。
基本控制结构
顺序型、选择型、WHILE重复型、UNTIL重复型、多分枝选择型
扩充控制结构
PAD的优点
本章小结
- 设计是软件工程技术核心
- 数据结构、体系结构、接口和软件组件的过程细节在设计中逐步细化、开发、评审和记录
- 模块化(包括程序和数据)和抽象概念能够使设计人员简化和重用软件组件
- 细化提供了详细表示各顺序功能层的机制
- 程序和数据结构有助于建立软件架构的整体视图,而过程提供了算法实现必要的细节
- 信息隐藏和功能独立为实现有效模块化提供了启发