软件设计的基本特征:目标,形态,内容
从技术角度考虑,软件设计主要包括4方面内容:
C/S结构的层次性:
从应用系统开发的角度考虑,C/S结构的应用系统通常可以由3个相对独立的部分组成,每一部分承担着不同的职责:
用户界面部分:即表示层,主要实现用户与应用系统之间的交互接口,用于接收用户输入的数据,并显示应用系统输出的数据。一般采用图形用户界面(GUI)。
应用逻辑部分:即业务逻辑层(或功能层),主要实现应用系统的各种处理功能。一般通过应用程序来实现各种功能的业务处理逻辑。
数据管理部分:即数据层,主要实现数据的存储以及对数据的存取操作任务。一般采用关系型数据库管理系统。
胖客户端结构 | 瘦客户端结构 |
---|---|
服务器端负责数据管理 | 服务器端负责应用逻辑部分和数据管理 |
客户端负责实现应用逻辑部分和用户界面部分 | 客户端负责用户界面部分 |
胖客户端的C/S系统执行效率比瘦客户端更高
浏览器/服务器(B/S)结构:
基于集群(Cluster)的C/S或B/S物理分布
通常,应用逻辑层并不一定只驻留在一台服务器上,数据层也是如此;如果应用逻辑层(或数据层)分布在多台服务器上,那么就形成了基于集群(Cluster)的物理分布模式;
目的:提高服务器并发处理的性能,以改善系统的运行速度;提高系统的可靠性与可用性。
结构化设计方法(Structured Design,SD)强调将软件系统划分成若干个模块。模块作为可合并、可分解的基本单元,主要包括 功能 接口 和 逻辑 三个基本属性,其中 逻辑 属性反映模块的内部特性。
是一种面向数据流的设计方法:根据数据流图(DFD)的不同类型,将其转换为相应的软件体系结构(属于“主程序-子过程”风格)
目标:通过对模块的合理划分,得到软件的体系结构图,进而再细化每个模块内部的处理流程。
结构化设计的核心原则——模块化
模块独立性是软件系统划分模块时的一个主要准则,也是评价模块构造是否合理的主要标准之一。如果一个模块只完成一个相对独立的子功能,即功能单一,并且与其它模块之间没有过多的相互作用和复杂的联系,则称这样的模块具有独立性。通常从以下两方面来衡量模块的独立性:模块本身的内聚性,模块之间的耦合性
内聚性是从“功能”的角度来衡量模块内部的联系,是对模块功能强度的度量: 如果一个模块内部的所有成分,都是为了完成某个单一功能,而彼此紧密结合在一起,则说明该模块的内聚性强。耦合性表示模块与模块之间相互联系、相互依赖的紧密程度。模块间连接越紧密,联系越复杂,耦合性越高
按照块内联系的各种类型(内聚性从小到大):
偶然型:模块内部沒有必然联系;
逻辑型:逻辑上相似的功能放进一个模块;
瞬时型:将同时执行的语句放在一个模块;
通讯型:模块中的各部分引用共同的数据;
顺序型:模块中一部分的输出是另一部分的收入;
功能型: 模块中刚好包含了完成一个基本任务所必需的成分
按照块间联系分类法(按照耦合度由大到小):
内容型:直接引用另一模块的内部信息;
公共型:两个模块引用共同的全程数据区;
控制型:模块间传送的信息用于控制模块的内部逻辑;
复合型:模块间传送复合的数据结构;
数据型:模块间传送单个数据项。
模块化设计的目标:高内聚,低耦合(即提高模块内部的联系,降低模块之间的联系)
改进方法:
1)尽可能建立功能模块;
2)消除重复功能;
3)模块的作用范围与控制范围,即当作用范围为控制范围的子集时,才能获得较低的块间联系;
4)模块的大小适当;
5)模块的扇入扇出数不宜太多。
模块化设计:
便于由多个人分工编制大型程序;软件的功能便于扩充程序;易于理解,也便于排错;只要模块之间的接口关系不变,各模块内部实现细节的修改将不会影响别的模块; 模块间的单向调用关系叫做模块的层次结构
结构图
模块:实现特定功能,有明确的输入、内部处理逻辑、输出。一般用矩形框表示,框内注明该模块的名称(常以其功能做为模块名)。
调用关系:模块之间通过“过程/函数调用”的方式建立连接。一般用自上而下的箭头连线表示两个模块之间的调用关系。
模块间的信息传递:模块调用过程中,相互传递的信息。
数据信息:模块间相互调用时所传递的业务性数据。通常是一些简单数据类型或复杂数据类型(比如,结构体);
控制信息:模块间相互调用时所传递的标志性数据。比如,“Y”/“N”、“T”/“F”、状态标志等。
结构深度:结构图中的层次总数
结构宽度:结构图中,同一层次上模块总数的最大值
模块的扇入:能直接调用某模块的模块个数
模块的扇出:某个模块直接调用的模块个数
DFD的两种特征:
变换型DFD
信息沿着输入路径进入系统,同时由外部形式变换为内部形式,然后经过系统内部的 “变换中心”进行处理,处理后的结果再沿着输出路径变换成外部形式离开系统。 输入部分与变换中心之间,变换中心与输出部分之间都具有较为明显的边界
变换型结构由至少一条传入路径、变换中心和传出路径组成
事务型DFD
信息沿着输入路径进入系统,由外部形式变换为内部形式后,到达某个数据加工(称为事务中心),然后该事务中心根据输入信息的类型,在之后的多条“加工路径”中选择一个去执行。事务中心的任务: 接收事务信息,根据事务类型选取一条加工路径执行
事务型结构由至少一条接受路径、一个事务中心与若干条动作路径组成
从DFD图到SC图的映射规则:
(1)复审DFD图,必要时可再次进行修改或细化;
(2)鉴别DFD图所表示的软件系统的结构特征,确定它所代表的软件结构是属于变换型还是事务型。
(3)按照SD方法规定一组规则,把DFD图转换为初始的SC图;
(4)按照优化设计的指导原则改进初始的SC图,获得最终SC图。
逻辑输入通常是距离物理输入端最远的,但仍可以被视为系统输入的那些数据流。
变换中心的两端分别是逻辑输入和逻辑输出,其任务是把系统的逻辑输入加工处理为系统的逻辑输出
顶层结构:只有一个主模块MC ,代表整个系统,用于控制协调其它模块
第一层结构:通常包括三个模块:
输入信息处理模块MA :管理所有输入信息的接收(从物理输入到逻辑输入);
变换中心控制模块MT :管理所有对逻辑输入的操作;
输出信息处理模块ME :管理所有输出信息的产生(从逻辑输出到物理输出)。
输入分支:从逻辑输入开始,逆着输入路径向外移动,将输入路径中的每个数据加工依次映射成为模块 MA 控制下的一个低层模块;
变换分支:将变换中心内的每个数据加工映射成为模块 MT 控制下的一个低层模块;
输出分支:从逻辑输出开始,顺着输出路径向外移动,将输出路径中的每个数据加工依次映射成为模块 ME 控制下的一个低层模块
在事务型DFD上区分出输入部分、事务中心和发送部分(由事务中心发射出的多条加工路径构成),并划出分界线。顶层结构只包含一个主模块。第一层结构主要包括两个分支:输入分支和发送分支
输入分支:映射方法与变换分析中映射输入分支的方法相同,即从事务中心的边界开始,将逆着输入路径中的数据加工依次映射成模块。
发送分支:包含一个调度模块,对应事务中心。由事务中心发射出的每条加工路径可根据其各自的流特征(变换型或事务型)映射成相应结构,由调度模块“选择调用”。
例题
结构图SC的优化原则:
一个良好的结构,通常上层扇出较高,中层扇出较低,底层扇入较高
SD方法中常用的过程设计描述工具
PAD图的特点:
⑴ 清晰地反映了程序的层次结构。图中的竖线为程序的层次线,最左竖线是程序的主线,其后一层一层展开,层次关系一目了然。
⑵ 支持逐步求精的设计方法,左边层次中的内容可以抽象,然后由左到右逐步细化。
⑶ 易读易写,使用方便。
⑷ 支持结构化的程序设计原理。
⑸ 可自动生成程序。
判定表/判定树
判定表由四部分组成:
左上部列出所有条件
左下部是所有可能做的动作
右上部表示各种条件组合
右下部是和每种条件组合相对应的动作
过程设计语言PDL
PDL也称为伪码。
如:if I>0 then
执行订单数据输入模块
else
报告出错信息
end if
用PDL表示的程序结构一般有:⑴ 顺序结构:采用自然语言描述⑵ 选择结构⑶ 重复结构
⑷ 出口结构 ⑸ 模块定义与调用 ⑹ 数据定义⑺ 输入输出
软件用户界面的组成部分:
信息输入方式:键盘输入,鼠标输入,硬件接口输入,软件接口输入
指令输入方式:键盘输入,直接操纵图形元素
信息输出形式:单一数据,成组数据,大量数据,软件接口输出,动态数据
软件用户界面设计的基本原则:
置系统于用户的控制之下:允许用户与系统的交互被中断或撤销;允许用户与出现在屏幕上的任何对象进行直接交互。
减少用户的记忆负担:建立有意义的缺省值;定义直观的快捷方式:如快捷键
保持界面的一致性:一致性要求UI遵循标准和常规的方式,让用户处在一个熟悉的和可预见的环境之中
个性化:可以使不同的用户按照自己的习惯、爱好以及对系统的熟悉程度来设置UI元素
宽容性:允许用户进行实验性操作和出错,用户在出错时能够方便的从错误中恢复
反馈:在发生错误或程序运行时间较长时,系统应给用户提供有意义的、可视化的
反馈,以便用户了解错误性质或程序的执行进度。
美观性
可用性
简洁性:避免使用许多复杂的图片和动画等,造成用户操作时的分心;界面布局应当适合清晰地表达信息;具有与之匹配的导航性
软件用户界面设计的几种常见模式
软件用户界面设计需要考虑的若干因素