1、 需求分析的任务: 确定目标系统必须做什么 需求分析的步骤,回顾, 需求获取, 分析建模, 需求规格说明编写, 需求验证,结构化分析建模,面向对象分析建模,4.1 设计的任务 4.2 设计原理4.2.1 模块化4.2.2 抽象4.2.3 逐步求精4.2.4 信息隐藏和局部化4.2.5 模块独立,第四章 软件设计概述,4.3 启发式规则 4.4 体系结构 4.5 人机界面设计,你存了一笔钱,买了一块土地,准备盖一栋自己梦想中的房子。由于没有这方面的经验,你拜访了一位建筑师,向建筑师解释了自己的要求:房间的大小和数目、式样、屋顶。建筑师仔细的听了,问了几个问题,然后表示需要花几个星期进行设计。 你
2、在焦急中等待自己的房子会是什么样的。最后建筑师来了一个电话,说对于未来了房子已经有了初步的想法,可以直接盖房子了,结构和细节问题以后再说。 这种做法很明显是错误的,你需要看到房子的草图,楼层的平面图以及每个房间的设计图纸。但是在软件设计的过程中,这种现象却经常发生。我们试图匆忙完成设计过程,以便在项目结尾时节省足够的时间去发现由于我们匆忙完成设计过程而造成的错误来解决问题。 基本准则是:不要匆忙完成它!设计是值得花费精力的。,4.1 设计的任务,任务, 系统应该如何实现 使用一种设计方法,软件分析模型中通过数据、功能和行为模型所展示的软件需求的信息被传送给设计阶段,产生数据/类设计、体系结构设
3、计、接口设计、部件级设计。,数据/类设计:将分析类模型变换成类的实现和软件实现所需要的数据结构 体系结构设计:体系结构设计定义了软件的整体结构 接口设计:接口设计描述了软件内部、软件和协作系统之间以及软件同人之间如何通信 部件级设计(过程设计):部件级设计将软件体系结构的组成部件变换为对软件组件的过程性描述,4.2 设计原理,设计原理, 模块化, 抽象, 信息隐藏和局部化, 模块独立, 逐步求精,4.2 设计原理,模块化, 模块化,模块:是由边界元素限定的相邻程序元素的序列,并且有一个总体标识符代表它。,模块化:把程序划分成模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成
4、指定的功能满足用户的需求。,模块化的依据,设函数C(x) 定义问题x的复杂程度,函数E(x)定义解决问题x需要的工作量.对于两个问题P1和P2,如果C(P1)C(P2)显然 E(P1)E(P2) 而根据人类解决问题的经验,存在下面的规律C(P1+P2)C(P1)+C(P2)所以 E(P1+P2)E(P1)+E(P2) 将复杂问题分解成许多容易解决的小问题,原来的问题也容易解决了,模块化和软件成本,模块化和软件成本,4.2 设计原理,抽象和逐步求精, 抽象,抽出事物的本质特征而暂时不考虑它们的细节。,软件工程的每一步都是对软件解法的抽象层次的一次精化。,为了能集中精力解决主要问题而尽量推迟对问题
5、细节的考虑。, 逐步求精,4.2 设计原理,信息隐藏和局部化,信息隐藏模块内包含的信息对于不需要这些信息的模块来说,是不能访问的。,局部化将一些关系密切的软件元素物理地放得彼此靠近。, 信息隐藏和局部化,module,controlled,interface,“secret“, algorithm, data structure, details of external interface, resource allocation policy,clients,Design of Computer,A highly incompetent computer architect decides
6、to build an ALU, shifter and 16 registers with AND, OR, and NOT gates, rather than NAND or NOR gates.,Design of Computer,Architect designs 3 silicon chips,Design of Computer,Redesign with one gate type per chip,Computer Design,The two designs are functionally equivalent Second design is Hard to unde
7、rstand Hard to locate faults Difficult to extend or enhance Cannot be reused in another product Modules must be like the first design Maximal relationships within modules, minimal relationships between modules,4.2 设计原理,模块独立,度量标准(1)耦合:衡量不同模块彼此间互相依赖的紧密程度(2)内聚:衡量一个模块内部各元素彼此结合的紧密程度,耦合, 模块独立,4.2 设计原理,无直接
8、耦合,耦合, 模块独立,(1)无直接耦合两个模块完全独立,没有信息传递,4.2 设计原理,数据耦合,耦合, 模块独立,(2)数据耦合两个模块之间通过参数交换信息,且交换的是简单变量,4.2 设计原理,特征耦合,耦合, 模块独立,(3)特征耦合两个模块之间通过参数交换信息,且交换的是数据结构(部分需要),“住户情况”是一个数据结构,包括用水量,用电量,住户名,4.2 设计原理,特征耦合,耦合, 模块独立,(3)特征耦合两个模块之间通过参数交换信息,且交换的是数据结构,将特征耦合修改为数据耦合,4.2 设计原理,控制耦合,耦合, 模块独立,(4)控制耦合一个模块向下属模块传递控制信息,控制被调用模
9、块的内部逻辑,4.2 设计原理,控制耦合,耦合, 模块独立,(4)控制耦合,去除控制耦合的方法: (1)将被调用模块内的判定上移到调用模块中进行 (2)被调用模块分解成若干单一功 能模块,A,4.2 设计原理,外部耦合,耦合, 模块独立,(5)外部耦合一组模块均与同一外部环境关联(例如,I/O将模块耦合到特定的设备、格式和通信协议相关联),它们之间便存在外部耦合。外部偶合必不可少,但这种模块数目应尽量少。,4.2 设计原理,公共耦合,耦合, 模块独立,(6)公共耦合一组模块引用同一个公用数据区,4.2 设计原理,内容耦合,耦合, 模块独立,(7)内容耦合一个模块直接引用了另一个模块的内容,4.
10、2 设计原理,设计原则,耦合 设计系统时,建立模块间耦合度尽可能松散的系统设计原则:, 模块独立,尽量使用数据耦合 少用控制耦合和特征耦合 限制公共耦合的范围 坚决避免使用内容耦合,4.2 设计原理,内聚,内聚, 模块独立,低 偶然内聚 逻辑内聚 时间内聚过程内聚通信内聚顺序内聚 高 功能内聚,模 块 独 立 性,强(功能单一),(低内聚),弱(功能分散),(中内聚),(高内聚 ),内 聚 性,4.2 设计原理,偶然内聚,内聚, 模块独立,(1)偶然内聚模块内各组成成分在功能上互不相关或联系松散,4.2 设计原理,逻辑内聚,内聚, 模块独立,(2)逻辑内聚模块完成的任务在逻辑上属于相同或相似的
11、一类,E、F、G 逻辑功能 相似,组 成新模块 EFG,4.2 设计原理,时间内聚,内聚, 模块独立,(3)时间内聚模块包含的任务必须在同一段时间内完成例如:初始化系统模块、系统结束模块、紧急故障处理模块,4.2 设计原理,过程内聚,内聚, 模块独立,(4)过程内聚一个模块完成多个任务,任务需要按指定的过程执行,4.2 设计原理,通信内聚,内聚, 模块独立,(5)通信内聚模块内的所有元素都使用同一个输入数据和(或)产生同一个输出数据,4.2 设计原理,顺序内聚,内聚, 模块独立,(6)顺序内聚一个模块完成多个功能,且这些功能必须顺序执行(通常前一个处理元素的输出作为下一个处理元素的输入数据),
12、(7)功能内聚模块内的所有处理元素完成一个单一的功能,缺一不可,4.2 设计原理,模块独立,内聚设计原则, 模块独立,力求争做高内聚 可以采用中等强度的内聚 尽量不用低内聚,4.3 启发规则,启发规则, 改进软件结构提高模块独立性, 模块规模应该适中, 模块的作用域应该在控制域之内, 力争降低模块接口的复杂程度, 深度、宽度、扇入和扇出都应适当, 设计单入口单出口的模块, 模块功能应该可以预测,4.3 启发规则,启发规则, 模块规模应该适中,模块过大:可理解程度下降 模块过小:开销大于有效操作系统接口复杂 一般模块的规模最好能写在一页纸之内,4.3 启发规则,启发规则,经验表明:设计得好的软件
13、结构通常顶层扇出比较高,中层扇出比较少,底层扇入到公共的使用模块中去;典型系统的平均扇出是3或4(上限通常为5-9), 深度、宽度、扇入和扇出都应适当, 深度:软件结构中控制的层次, 宽度:软件结构内同一层次上模块总数的最大值, 扇入:直接调用该模块的上层模块数, 扇出:一个模块直接调用的模块数目,A,B,C,E,F,D,4.3 启发规则,启发规则, 深度、宽度、扇入和扇出都应适当,高扇出的模块结构举例,4.3 启发规则,启发规则, 深度、宽度、扇入和扇出都应适当,增加中间层降低扇出,4.3 启发规则,启发规则, 作用域:受该模块内一个判定影响的所有模块的集合, 控制域:模块本身及直接或间接从
14、属于它的模块的集合, 模块的作用域应该在控制域之内,C,H,D,E,G,X,F,A,I,L,J,K,B,模块C的控制范围: C、D、E、F、G、H,如果模块C 作出的决策影响了模块L,L超出了C 的控制范围,4.3 启发规则,启发规则, 模块接口复杂是软件发生错误的一个重要原因。接口复杂或不一致,是高耦合或低内聚的征兆,应该重新分析这个模块的独立性。, 力争降低模块接口的复杂程度,QUAD-ROOT(TBL,X)求一元二次方程的根的模块,数组TBL传送方程的系数,数组X回送求得的根.修改后得到:QUAD-ROOT(A,B,C,ROOT1,ROOT2),4.3 启发规则,启发规则, 设计单入口单
15、出口的模块, 避免内容耦合, 体系结构的发展单主机结构C/S(Client/Server)结构 B/S(Browser/Server)结构,4.4 体系结构, 仓库体系结构, 体系结构的风格, 数据流风格的体系结构,数据在不同的子系统间流动,每个子系统处理输入的一组数据,并将处理结构输出给其他子系统。适用于实现数据流的变换而不需要用户干涉的系统,一般不适用于用户交互比较复杂的系统。, 调用和返回风格的体系结构,这种风格使一个软件设计者设计出非常容易修改和扩充的体系结构。, 层次式风格的体系结构,4.5 人机界面设计,抽象和逐步求精,Easy to use?,Easy to understand
16、?,Easy to learn?,对于许多计算机化的信息系统用户来说,挫折和 焦虑是他们日常生活的一部分。很多的用户界面 难学、难用、令人迷惑、让人感到沮丧。但是仍 然有人花费时间和精力去开发这样的界面。看起 来,他们并不是有意地制造这些问题。, 设计问题,4.5 人机界面设计,设计问题, 系统响应时间系统响应时间指从用户完成某个控制动作(例如,按回车键或点击鼠标),到软件给出预期的响应(输出或做动作)之间的这段时间。 系统响应时间有两个重要属性,分别是长度和易变性。, 用户帮助设施常见的帮助设施有集成的和附加的两类。要考虑怎样请求帮助,怎样显示帮助,怎样返回到正常交互方式,如何组织帮助信息?
17、, 出错信息处理用户可理解,有助于从错误中恢复,指出导致的负面后果,听觉或视觉上的提示,不能指责用户。, 命令交互命令行、菜单、快捷键, 设计过程,4.5 人机界面设计,设计过程,用户界面设计是一个迭代的过程,通常先对用户、任务和环境进行分析,创建设计模型,再用原型实现这个设计模型,并由用户试用和评估,然后根据用户的意见进行修改。, 设计原则,4.5 人机界面设计,设计过程, 用户控制式用户启动行为并取得结果,如果程序取得控制权的话,用户也要获得必要的反馈(一个沙漏、一个等待的指示器或其他类似的东西)。, 界面一致性遵循标准和常规的方式,应该让用户处在一个熟悉的和可预见的环境之中。若应用是为W
18、indows 开发的,则应采用Windows “外观和感觉”;菜单、活动按钮、屏幕区域等的命名和编码、对象在屏幕上处于什么位置的标准等的一致性也不能低估。, 设计原则,4.5 人机界面设计,设计过程, 界面容错性一个好的界面应该以一种宽容的态度允许用户进行实验和出错,用户在出现错误时能够方便地从错误中恢复。, 设计原则,4.5 人机界面设计,设计过程, 界面可适应性界面可适应性是指用户界面应该根据用户的个性要求及其对界面的熟知程度而改变,即满足定制化和个性化的要求。所谓定制化是在程序中声明用户的熟知程度,用户界面可以根据熟知程度改变外观和行为;所谓个性化是使用户按照自己的习惯和爱好来设置用户界面元素。,Jakob Nielsen 1995年为Sun网站设计图标的过程 Technology and developer,products and solutions (最后一个为最终设计稿),Sun on the net(最后一个为最终设计稿),http:/ 软件设计概述(小结),小结,4.1 设计的任务 数据/类设计 体系结构设计 接口设计 部件级设计(过程设计) 4.2 设计原理 模块化 抽象 逐步求精 信息隐藏和局部化 模块独立,4.3 启发式规则 4.4 体系结构 4.5 人机界面设计 设计的问题 设计原则,