1、第四章 软件设计概述,软件设计的任务 软件设计的基本概念 模块化设计 设计需要处理的问题 设计文档及其复审,什么是设计?,把问题转化为解决方案的创造性过程;解决方案的描述也称为设计。,设计和需求有什么不同?,张君和李丽想建一栋新房子。他们的需求如下: 三个小孩有玩耍的空间,并独立拥有各自的睡房 一间主人卧房 一个厨房 冬天可取暖,夏天可制冷 室内通水通电 等等,设计和需求有什么不同?,设计师的方案: 屋子的楼上有四间睡房,楼下有一间客房,一间厨房,一个玩具房和一个杂物室等等。 还有其他方案吗?,软件设计的两个阶段,设计者必须同时满足用户和系统开发人员的要求 概要设计书 详细设计书 设计者迂回于
2、各种活动中: 理解需求 提出可能的方案 测试方案的可能性 向用户描述各种可能 向编程人员提供设计文档,软件设计的内容,体系结构设计 定义软件部件间的关系 接口设计 软件内部、外部及与人之间的通信 数据设计 信息模型 软件数据结构 过程设计 软件组件的过程性描述,软件设计的任务,分析模型 设计模型 设计文档 回答How to do? 可以分为概要设计、详细设计 软件设计包括 数据设计 体系结构设计 接口设计 过程设计,分解和模块化,系统设计方法: 功能分解:将功能作为组件 面向数据的分解:基于外部数据结构 面向事件的分解:基于系统必须处理的事件 外部输入设计:基于系统的用户输入 面向对象设计:定
3、义对象的类及其相互联系,分解的层次化,模块和模块化,模块化:当系统的每项功能恰好由一个输入输出都明确定义的组件完成的时候,我们称这个系统模块化。模块表示能够用计算机程序代码实现的,相对独立的单一数据处理功能,所以模块有时也叫功能模块。进一步明确模块是拥有明确定义的输入、输出和特性的程序实体。,设计方法的选择,应该允许不同的设计者使用他们喜欢的技巧,只要他们的文档能让其他设计者明白就可以了。 设计方法的选择又是取决于设计者的偏好,而更多的时候取决于系统要求的结构或数据。,软件设计中涉及的问题,抽象(abstract)与细化(refinement) 抽象:分层次考虑和处理问题(数据和过程) 细化:
4、从高到低的逐步分解过程信息隐藏 对其它模块隐藏模块内部的数据和过程,抽 象,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。 先注意问题的本质及描述,其次是实现过程或细节。 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。 代码抽象:描述某类对象的共有的行为特征或具有的功能。 抽象的实现:通过类的声明。,模块化设计的好处,信息隐藏 从不同角度了解系统 将难以解决的问题独立出来;抽象层次通过逐层分析来了解问题 允许不同的模块采用不同的设计方法,模块化设计,把大型软件按照规定的原则划分成一个个较小的、相对独立但又相互关联的模块 重要指导思想: 分解 模块独立
5、性,分解(Decomposition),模块化是为了使一个复杂的大型程序能被人的智力所管理 设函数c(x)定义问题x的复杂程度,函数E(X)确定解决问题x需要的工作量(时间)。对于两个问题P1 和P2,如果,显然,模块化的依据,人类解决一般问题时一个有趣的规律:C (P1+P2)C (P1)+C (P2)E (P1+P2)E (P1)+E (P2) 结论:各个击破把复杂的问题分解成容易解决的小问题,原来的问题也就容易解决了,问题提出,如果无限的分割软件,最后为了开发软件而需要的工作量也就小得可以忽略了。 ?,模块数与开发工作量的关系,模块划分的基本原则,概括了把软件划分为模块时要遵守的准则,也
6、是判断模块构造是不是合理的标准。 但是到目前为止,没有统一的标准判断一个系统化分成几个模块是最优的。,模块划分的四项基本原则,1.模块独立性强 块内联系强 块间联系弱 2.高内聚 模块内部各成分之间 3.低耦合 一个模块与其它模块之间 4.公共(共享)模块 多个模块公用,模块独立性,为什么模块的独立性很重要? 有效模块化的软件容易开发出来 独立的模块比较容易测试和维护人的独立性强如何? 人没有独立性,什么都依赖别人如何?,内聚、耦合的定义,内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。 耦合是对软件内部块间联系的度量。一个模块内部各个元素之间的联系越紧密,则它的内聚性就越
7、高,相对地,它与其他模块之间的耦合就会减低,而模块独立性就越强。,内聚与耦合,内聚和耦合是相互关联的。在程序结构中各模块的内聚程度越高,模块间的耦合程度就越低。但这也不是绝对的。软件概要设计的目标是力求增加模块的内聚,尽量减少模块间的耦合,但增加内聚比减少耦合更重要,应当把更多的注意力集中到提高模块的内聚程度上来。,内聚等级划分,低 内 聚,.偶然性内聚 模块内各部分没有联系,或者即使有联系,这种联系也很松散。 .逻辑性内聚 这种模块把几种相关的功能组合在一起,每次调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能。这种模块是单入口的多功能模块。类似的有错误处理模块。它接受出错信号,对
8、不同类型的错误打印出不同的出错信息。,低 内 聚,.时间性内聚 时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如初始化模块和终止模块。,中 内 聚,.过程性内聚 如果一个模块内的处理是相关的,而且必须以特定次序执行,则称这个模块为过程内聚模块。 .通讯性内聚 如果一个模块内各功能部分都使用了相同的输入数据,或产生了相同的输出数据,则称之为通信内聚模块。,高 内 聚,.顺序性内聚 如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据) .功能性内
9、聚 一个模块中各个部分都是某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。,七种内聚的优劣评分,功能内聚 10分 顺序内聚 9分 通信内聚 7分 过程内聚 5分 时间内聚 3分 逻辑内聚 1分 偶然内聚 0分,逻辑内聚模块,常见内聚类型,常见内聚类型,耦 合,对一个软件结构内不同模块之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度、调用模块的方式以及哪些信息通过接口。 在软件设计中应该追求尽可能松散耦合的系统,耦合的七种类型(低高),1.非直接耦合:如果两个模块之间没有直接关系,它们之间的联系完全是
10、通过主要模块的控制和调用来实现的,这就是非直接耦合。 2.数据耦合:如果一个模块访问另一个模块时,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合。 3.标记(特征)耦合 :如果一组模块通过参数表传递记录信息,就是标记耦合。事实上,这组模块共享了这个记录,它是某一类数据结构的子结构,而不是简单变量。这要求这些模块都必须清楚该纪录的结构,并按结构要求对此记录进行操作。,耦合的七种类型(续),4.控制耦合 :如果一个模块通过传递开关、标志、名字等控制信息,明显的控制选择另一模块的功能,就是控制耦合。 5.外部耦合 :一组模块都访问同一全局
11、简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。 6.公共耦合 :若一组模块都访问同一个公共数据环境,则它们之间的耦合称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。 7.内容耦合:如果一个模块可以直接调用另一模块中的数据,或者允许一个模块直接转移到另一个模块中去,则称它们间的耦合为内容耦合。,弱 耦 合,公 共 耦 合,公 共 耦 合,公共耦合会引起下列问题: 1.所有公共耦合模块都于某一个公共数据 环境内部各项的物理安排有关,若修改某个数据的大小,将会影响到所有的模块。 2.无法控制各个模块对公共数据的存取,严重影
12、响软件模块的可靠性和适应性。 3.公共数据名的使用,明显降低了程序的可读性。,内 容 耦 合,如果出现下列情况之一,两个模块间就发生了内容耦合: 一个模块访问另一个模块的内部数据 一个模块不通过正常入口而转到另一个模块的内部 两个模块有一部分程序代码重叠(只可能出现在汇编程序中) 一个模块有多个入口(这意味着一个模块有几种功能),(a)进入另一模块内部,(b)模块代码重叠,(c)多入口模块,内 容 耦 合,内容耦合 0分 公共耦合 1分 外部耦合 3分 控制耦合 5分 特征耦合 7分 数据耦合 9分 非直接耦合 10分,高耦合,低耦合,七种耦合的优劣评分,关于耦合的设计原则,尽量使用数据(特征
13、)耦合 少用控制耦合 限制公共环境耦合的范围 完全不用内容耦合,建立公共(共享)模块,建立公共模块的目的是减少冗余,减少不必要的重复工作,划出某项功能成为一个能被几个模块共同利用的模块。也就模块结构图的形态是中层宽大,上下小的。例:球场,田径场,哪种设计方案更好呢?,自顶向下和自底向上设计,自顶向下 顶层开始 逐步分解 由底向上 选择关键部分先设计 扩展到整个系统,两种设计方法的比较,4.4.1 协同设计,谁最合适设计系统的某一方面? 如何使组内成员相互了解别人的设计? 如何协调设计组件使整个系统统一,4.4.2 用户(人机)界面设计,让用户驾驭软件,不是软件驾驭用户 减少用户的记忆 保持界面
14、的一致性,人机界面设计,人机界面通常也称为用户界面。 (Human ComputerInterface ,简称HCI)界面设计主要包括三个方面: 设计软件构件之间的接口 设计模块和其他非人的信息生产者和消费者的界面 设计人(如用户)和计算机间的界面,界面的设计原则,分析用户类型 应用程序和界面分离 一致性 尽量减少用户工作 提供反馈 出错处理和帮助功能 增加可视化图形表示,界面的设计-黄金规则,在有关界面设计中的三条黄金原则: 置于用户控制之下 减少用户的记忆负担 保持界面一致,黄金规则:置于用户控制之下,Mandel定义的一组允许用户操作控制的原则: 以不强迫用户进入不必要的或不希望的动作的
15、方式来定义交互方式 提供灵活的交互 允许用户交互可以被中断和撤消 当技能级别增加时可以使交互流水化并允许定制交互 使用户隔离内部技术细节 设计应允许用户和出现在屏幕上的对象直接交互,黄金规则:减少用户的记忆负担,Mandel定义了一组设计原则,使界面能够减少用户记忆负担: 减少对短期记忆的要求 建立有意义的缺省 定义直觉性的捷径 界面的视觉布局应该基于真实世界的隐喻 以不断进展的方式揭示信息,缺省值,黄金规则:保持界面一致,用户应以一致的方式展示和获取信息: 所有可视信息的组织均按照均按照贯穿所有屏幕显示所保持的设计标准 输入机制被约束到有限的集合,在整个应用中被一致地使用 从任务到任务的导航
16、机制被一致地定义和实现 Mandel定义了一组帮助保持界面一致性的设计原则: 允许用户将当前任务放入有意义的语境 在应用系列内保持一致性 如过去的交互模型已建立起了用户期望,除非有迫不得已的理由,不要改变它,界面设计- 用户友好性设计,用户友好性一般属软件的性能特性,它独立于所有具体功能,却影响着所有功能的重用性。用户友好性应体现在与用户有接口的软件特性上。 用户友好性的根本目的是为了软件可重用性、可维护性。,用户友好性的标志,可操作性 健壮性 易学习性 可扩展性,系统闭合等级: 极限闭合等级: 15秒 复杂闭合等级: 415秒 简单闭合等级: 24 秒 最简单闭合等级: 12 秒 瞬时响应:
17、 1秒,界面设计- 反馈响应时间(系统延迟),用户界面设计-界面设计模型,设计用户界面要考虑四种模型:,用户界面设计过程,用户界面设计过程包括四种不同的框架: 用户、任务和环境分析及建模 界面设计 界面构造 界面确认,用户分析,偶然型 生疏型 熟练型 专家型,新手 对系统有了解的中级用户 对系统有了解的经常用户,用户类型:,影响用户行为特性的因素,人-机匹配性 人的固有技能 人的固有弱点 用户的知识经验 用户对系统的期望和态度,用户对计算机系统的要求,让用户灵活地使用 适应不同类型用户 系统的行为及效果对用户透明 用户对系统的期望和态度 提供联机帮助功能 人机交互尽可能和人际通信相似,用户技能
18、方面的使用需求,应让系统去适应用户 使用易于理解、掌握的准自然语言 一致性的系统设计 用户对系统的期望和态度 能通过系统学习 系统提供演示及范例,用户习性方面的使用需求,系统应让用户有耐心 系统应很好地对付人的易犯错误 系统应对不同用户提供不同交互方式,用户经验、知识方面的使用需求,系统应能让未经专门训练的用户使用 系统能对不同经验用户做出不同反应 提供同一系统的一致性,建立标准化人-机界面 系统必须适应用户在应用领域的知识变化,提供动态的自适应的设计,用户对系统的期望方面的要求,用户界面应提供形象、生动、美观的布局显示和操作环境 系统处理问题应尽可能简单,提供学习机制 系统应对不同用户提供不
19、同交互方式,人-机界面的8种交互方式,1 菜单界面按显示形象分类: 正文菜单 图标菜单 正文图标混合菜单 按屏幕位置和操作风格分类: 固定 浮动 下拉式 嵌入式,图标式菜单,菜单条,弹出式菜单,弹出式帮助文本,下拉式菜单、瀑布式菜单,瀑布式菜单,2 对话 对话形式: (1)必须回答式 (2)无需回答式 (3)警告式对话实现方式: (1)标准对话 (2)定做式对话,人-机界面的8种交互方式,3. 功能键 4. 图符界面 5. 填表界面 6. 命令语言界面 7. 查询语言界面 8. 自然语言界面,人-机界面的8种交互方式,控制界面的设计,(1)用控制对话选择操作命令 (2)用菜单界面进行控制 (3
20、)用功能键定义操作命令 (4)用图标表示对象或命令,界面设计开发,界面设计过程的步骤: 建立任务的目标和意图 为每个目标和意图制定特定的动作序列 按在界面上执行的方式对动作序列进行规约 指明系统状态,即执行动作时的界面表现 定义控制机制,即用户可用的改变系统状态的设备和动作 指明控制机制如何影响系统状态 指明用户如何通过界面上的信息解释系统状态,一、定义界面对象和动作,为创建描述图符的图形设计和放置、描述性屏幕文字的定义、窗口的规约和命名、菜单项的规约的屏幕布局提供基础。响应时间、命令和动作结构、错误处理和帮助设施等设计问题应该在精化设计模型时考虑。,二、导航方式,混合式,二、导航方式,三、数
21、据输入界面设计,数据输入的规则 明确的输入 明确的动作 明确的取消 确认删除 提供反馈 允许编辑 提供复原(Undo) 自由格式 提示输入的范围,四、数据显示界面设计,数据显示的规则 只显示必要的数据 在一起使用的数据显示在一起 显示出的数据应与用户执行的任务有关 每一屏数据的数量不应超过整个屏幕面积的30% 屏幕布局规则 尽量少用代码和缩写 多个显示画面,应建立统一格式 提供明了的标题、标栏及其它提示信息 遵循用户习惯 采用颜色、字符大小、下划线、不同字体等方式强化重要数据,五、实现工具,用户界面工具箱用户界面开发系统(UIDS):采用预包装的软件构件来构造用户界面UIDS的固有机制: 管理
22、输入设备 确认用户输入 处理错误和显示出错信息 提供反馈(如自动的输入响应) 提供帮助和提示 处理窗口、域和窗口内的滚动 建立应用软件和界面间的连接 将应用程序与界面管理功能分开 允许用户定制界面,六、设计评估-界面设计评价周期,HELP系统设计,HELP系统设计不属于界面设 计范围,涉及系统整体结构,是 结构级用户友好性设计。,帮助方式:操作指南文档(植入系统、未植入系统)基于帮助文件的要求性帮助(命令级帮助)说明性帮助嵌入系统的要求性帮助嵌入培训功能的智能帮助系统,HELP系统设计,设计模板和复用,Design with reuse, design for reuse,并发系统设计,怎样确
23、保同时执行的组件间对共享数据的一致性 ?,并发处理(顺序执行),1、 组件1查询X是否为空。 2、 组件1被告知X不为空。 3、 组件2查询X是否为空。 4、 组件2被告知X不为空。 5、 组件1出栈,删除最后一个元素。 6、 组件2想出栈,但X已为空,系统进入非法状态。,并发处理,1、组件1询问栈X是否为空。 2、组件1被告知栈X不为空。 3、组件2询问栈X是否为空。 4、组件2被告知栈X不为空。 5、组件1出栈,删去最后一个元素,并锁住栈X。 6、组件2想出栈,但被告知X已上锁。 7、另一个组件加了一个元素到栈X中。 8、组件2被告知X已开锁(由于外部进程或者因为组件2 再次尝试) 9、
24、组件2出栈。,好的设计具备的特性,模块独立性 异常的识别和处理 检错和容错机制,软件设计文档,软件设计说明书 1) 范围 2) 数据设计 3) 体系结构设计 4) 接口设计 5) 模块的过程设计 6) 其他 包括测试的考虑,确保设计满足所有需求,设计约束和一些特殊注解等内容。,设计复审(design review),及早发现设计中的缺陷 差错的传播 复审的内容 概要设计复审 系统的总体结构,模块划分,内外接口 详细设计复审 各个模块的具体设计,差错传播模型,传往下阶 段的差错,来自前阶 段的差错,不扩大的差错,扩大的差错,新产生的差错,差错 检出 率,有/无设计复审的纠错费用比较,1.在传统软
25、件设计中,概要设计复审与过程设计复审应该分开进行,不允许合并为一次复审。 2.除软件开发人员外,概要设计复审必须有用户代表参加,必要时还可邀请有关领域的专家到会。过程设计复审一般不邀请用户和其他领域的代表。,复审的5条指导原则,复审的5条指导原则,3.参加复审的设计人员应欢迎别人提出批评和建议,不要为设计的缺陷“护短”。 4.复审中提出的问题应详细记录,但不要谋求当场解决。 5.复审结束时,应作出本次复审能否通过的结论。,设计复审(design review),复审的方式 Formal review Design review meeting Informal review Walk-through,作 业,习 题 P85 1. 2. 3 5 7,? ?,