购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 软件设计

从功能上的划分来看,软件设计应该是软件设计师的工作,但作为一名项目管理师,首先自己必须懂得软件设计的基本原则和理论,掌握基本的软件设计方法,具有一定的软件设计经验。

2.2.1 软件设计基本原则

1.信息隐蔽

在一节不和谐的课堂里,老师叹气道:“要是坐在后排聊天的同学能像中间打牌的同学那么安静,就不会影响到前排睡觉的同学”。

这个故事告诉我们,如果不想让坏事传播开来,就应该把坏事隐藏起来,“家丑不可外扬”就是这个道理。为了尽量避免某个模块的行为去干扰同一系统中的其他模块,在设计模块时就要注意信息隐藏。应该让模块仅仅公开必须要让外界知道的内容,而隐藏其他一切内容。

在软件设计中同样有信息隐蔽原则。Parnas提出:在概要设计时列出将来可能发生变化的因素,并在模块划分时将这些因素放到个别模块的内部。也就是说,每个模块的实现细节对于其他模块来说是隐蔽的,模块中所包含的信息(包括数据和过程)不允许其他不需要这些信息的模块使用。这样,在将来由于这些因素变化而需修改软件时,只需修改这些个别的模块,其他模块不受影响。信息隐蔽技术不仅提高了软件的可维护性,而且也避免了错误的蔓延,改善了软件的可靠性。现在信息隐蔽原则已成为软件工程学中的一条重要原则。

2.模块独立性

软件设计中的模块独立性是指软件系统中每个模块只涉及软件要求的具体子功能,而和软件系统中其他的模块接口是简单的。模块独立的概念是模块化、抽象、信息隐蔽和局部化概念的直接结果。

一般采用两个准则度量模块独立性,即模块间耦合和模块内聚。

耦合是模块之间的相对独立性(互相联系的紧密程度)的度量。模块之间的联系越紧密,联系越多,耦合性就越高,而其模块独立性就越弱。

内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。一个模块内部各个元素之间的联系越紧密,则它的内聚性就越高,相对地,它与其他模块之间的耦合性就会减低,而模块独立性就越强。由此可见,模块独立性比较强的模块应是高内聚低耦合的模块。

(1)内聚。 内聚是信息隐蔽功能的自然扩展。内聚的模块在软件过程中完成单一的任务,同程序其他部分执行的过程交互很少,简而言之,内聚模块(理想情况下)应该只完成一件事。在设计模块时应尽量争取高内聚。

一般模块的内聚性分为七种,如图2-9所示。

一般认为,巧合(偶然)、逻辑和时间上的聚合是低聚合性的表现;信息的聚合则属于中等聚合性;顺序的和功能的聚合是高聚合性的表现。表2-5列出了各类聚合性与模块各种属性的关系。

图2-9 模块的内聚性

表2-5 各类聚合性与模块各种属性的关系

(2)耦合。 耦合是程序结构中模块相互关联的度量。耦合取决于各个模块间接口的复杂程度、调用模块的方式,以及哪些信息通过接口。

耦合的强度依赖于以下几个因素:

一般模块之间可能的连接方式有7种,它们构成耦合性的7种类型,如图2-10所示。

耦合是影响软件复杂程度的一个重要因素,在软件设计过程中,应尽量使用数据耦合,少用控制耦合,限制公共耦合的范围,完全不用内容耦合。表2-6列出了各类耦合性与模块各种属性的关系。

图2-10 模块之间的耦合性

表2-6 各类耦合性与模块各种属性的关系

2.2.2 结构化设计方法

结构化设计方法是基于模块化、自顶向下逐层细化、结构化程序设计等程序设计技术基础上发展起来的,该方法实施的过程如下。

(1)总结出系统应有的功能,对一个功能,从功能完成的过程考虑,将各个过程列出,标志出过程转向和传递的数据。这样,可以将所有的过程都画出来。

(2)细化数据流。确定应该记录的数据。

(3)分析各过程之间的耦合关系,合理地进行模块划分以提高它们之间的内聚性。实际上,对于这个练习,可以使模块具有信息内聚性。

1.系统结构图中的模块

在系统结构图中,不能再分解的底层模块称为原子模块。如果一个软件系统的全部实际加工都由原子模块来完成,而其他所有非原子模块仅仅执行控制或协调功能,这样的系统就是完全因子分解的系统。如果系统结构图是完全因子分解的,就是最好的系统。但实际上,这只是力图达到的目标,大多数系统做不到完全因子分解。

一般来说,结构图中可能出现如图2-11所示的4种类型的模块。

图2-11 4种模块类型

值得注意的是,结构图着重反映的是模块间的隶属关系,即模块间的调用关系和层次关系。它和程序流程图(常称为程序框图)有着本质的区别。程序流程图着重表达的是程序执行的顺序,以及执行顺序所依赖的条件。结构图则着眼于软件系统的总体结构,它并不涉及模块内部的细节,只考虑模块的作用,以及它和上、下级模块的关系。而程序流程图则用来表达执行程序的具体算法。

没有学过软件开发技术的人,一般习惯于使用流程图编写程序,往往在模块还未做划分,程序结构的层次尚未确定以前,便急于用流程图表达他们对程序的构想。这就像造一栋大楼,在尚未决定建筑面积和楼屋有多少时,就已经开始砌砖了。这显然是不合适的。

Adele Goldberg在Succeeding with Objects中叙述了一位犹太教教士在新年伊始的宗教集会上讲述的故事:

“一位教士登上一列火车,由于他经常乘坐这辆车,因此列车长认识他。教士伸手到口袋中掏车票。但没有找到,他开始翻他的行李。列车长阻止了他:‘教士,我知道您肯定有车票。现在别急着找。等找到后再向我出示。’但教士仍在找那张车票。当列车长再次见到他时,教士说:‘你不明白。我知道你相信我有车票,但……我要去哪里呢?’”

有太多项目失败就是因为它们没有明确的目标就开始了。

在结构化分析和设计技术中,通常存在着两种典型的问题类型,变换型问题和事务型问题,它们的数据流图和结构图都有明显的特征。下面分别讨论它们的数据流图形态及其映射成结构图的过程。

结构图(Structured Charts,SC)是准确表达程序结构的图形表示方法,它能清楚地反映出程序中各模块间的层次关系和联系。与数据流图反映数据流的情况不同,结构图反映的是程序中控制流的情况。图2-12为某大学教务管理系统的结构图。

图2-12 大学教务管理系统结构图

2.系统结构图中的主要成分

结构图中的主要成分有四种。

(1)模块。 以矩形框表示,框中标有模块的名字。对于已定义(或者已开发)的模块,则可以用双纵边矩形框表示,如图2-13所示。

图2-13 模块的表示

(2)模块间的调用关系。 两个模块,一上一下,以箭头相连,上面的模块是调用模块,箭头指向的模块是被调用模块,如图2-14中,模块A调用模块B。在一般情况下,箭头表示的连线可以用直线代替。

(3)模块间的通信。 以表示调用关系的长箭头旁边的短箭头表示,短箭头的方向和名字分别表示调用模块和被调用模块之间信息的传递方向和内容。如图2-14所示,首先模块A将信息C传给模块B,经模块B加工处理后的信息D再传回给A。

图2-14 模块的调用关系及信息传递关系的表示

(4)辅助控制符号。 当模块A有条件地调用模块B时,在箭头的起点标以菱形。模块A反复地调用模块D时,另加一环状箭头。如图2-15所示。

图2-15 条件调用和循环调用的表示

在结构图中条件调用所依赖的条件和循环调用的循环控制条件通常都无需注明。

3.常用的系统结构图

常用的系统结构图有以下几种。

(1)变换型系统结构图。 在数据处理问题中,我们通常会遇到这样一类问题,即从(程序)“外部”取得数据(例如从键盘、磁盘文件等),对取得的数据进行某种变换,然后再将变换得到的数据传回“外部”。其中取得数据这一过程称为传入信息(数据)流程、变换数据的过程称为变换信息(数据)流程,传回数据过程称为传出信息(数据)流程,如图2-16所示。

图2-16 变换型问题

当数据流图或其中某一段数据流表现出上述特征时,该数据流图或该段数据流图表示的是一个变换型问题。完成数据变换的处理单元叫变换中心。变换型问题数据流图基本形态及其对应的基本结构图分别如图2-17(a)和(b)所示。

图2-17 基本变换型问题数据流图及其结构图

根据图2-17所示的基本映射关系所得到的图2-16所示变换型问题的结构图如图2-18所示。“变换控制”模块首先获得控制,然后控制沿着结构到达底层的“传入A”模块,物理输入数据A由“传入A”模块读入后,从底层逐步向上传送。在传送过程中,数据经“变换A成B”、“变换B成C”等模块的预处理,逐渐变换成纯粹的逻辑输入C、E。接着在“变换控制”模块的控制下,将逻辑输入经变换中心模块“变换C和E成W”处理后,变换成逻辑输出W,再从顶层逐步向下传送。在这一传送过程中,数据经“变换W成X”、“变换X成Y”等模块的后处理,逐渐变换成适当的输出形式,最后由“传出Y”模块完成物理输出。

图2-18 变换型问题结构图

(2)事务型系统结构图。 在实际中,我们还常常会遇到另一类问题,即通常在接受某一项事务后,根据事务的特点和性质,选择分派给一个适当的处理单元,然后给出结果,如图2-19所示。

这类问题就是事务型问题。它的特点是,数据沿着接收分支把外部信息(数据)转换成一个事务项,然后计算该事务项的值,并根据它的值从多条数据流中选择其中的某一条数据流。发出多条数据流的处理单元叫事务中心。这类问题的典型结构图如图2-20所示。事务控制模块按所取得事务的类型,选择调用某一个处理事务模块。

(3)混合型系统结构图。 在实际中,一些大型问题往往既不是单纯的变换型问题,也不是单纯的事务型问题,而是两种混合在一起的混合型问题。图2-21表示的就是一个混合型问题数据流图,图2-22是图2-21相应的结构图。

图2-19 事务型问题

图2-20 事务型问题结构图

图2-21 混合型问题数据流图

图2-22 混合型问题结构图

对于这种混合型问题,一般以变换型问题为主,首先找出变换中心,设计出结构图的上层;然后根据数据流图的各部分具体类型分别映射得到它们的结构图。例如,对于如图2-22所示混合型问题,从整体上可以将其看成是一个从A到M的变换型问题,从D到K之间的变换是变换中心;从A到D是传入分支,具有事务型问题的特点;从K到M是传出分支。因此,该混合型问题结构图的上层可以由“传入D”模块、“变换D成K”模块和“传出K”模块组成,“传入D”模块的下层结构图由从传入分支映射得到的事务型问题结构图组成,“变换D成K”模块和“传出K”模块的下层结构图可以按通常的变换型问题映射方法获得。

2.2.3 用户界面设计

像人类追求心灵美和外表美那样,软件系统也追求(内在的)功能强大和(外表的)界面友好。

美的界面能消除用户由感觉引起的乏味、紧张和疲劳(情绪低落),大大提高用户的工作效率,从而进一步为发挥用户技能和完成任务做出贡献。从人-机界面发展历史与趋势上可以看出人们对界面美的需求,以及美在界面设计中的导向作用。

界面设计已经经历了两个界限分明的时代。第一代是以文本为基础的简单交互,如常见的命令行、字符菜单等。由于第一代界面考虑人的因素太少,用户兴趣不高。随着技术的发展,出现了第二代直接操纵的界面。它大量使用图形、语音和其他交互媒介,充分地考虑了人对美的需求。直接操纵的界面使用视听、触摸等技术,让人可以凭借生活常识、经历和推理来操纵软件,愉快地完成任务。更高层次的界面甚至模拟了人的生活空间,例如,虚拟现实环境。

界面的美充分体现了人-机交互作用中人的特性与意图,越来越多的用户将通过具有吸引力而令人愉快的人-机界面与计算机打交道。

一个好的用户界面应具有以下特点。

1.可使用性

(1)使用的简单性;

(2)用户界面中所用术语的标准化和一致性;

(3)拥有帮助功能;

(4)快速的系统响应和低的系统成本;

(5)用户界面应具有容错能力。

2.灵活性

(1)考虑用户的特点、能力、知识水平,应当使用户界面能够满足不同用户的要求;

(2)用户可以根据需要制订和修改界面方式;

(3)系统能够满足用户的希望和需要;

(4)与其他软件系统应有标准的接口。

3.复杂性和可靠性

(1)用户界面的规模和组织的复杂程度就是界面的复杂性;

(2)用户界面的可靠性是指无故障使用的间隔时间。

2.2.4 设计评审

在开发时期的每个阶段,特别是设计阶段结束时都要进行严格的技术评审,尽量不让错误传播到下一个阶段。设计评审一般采用评审会议的形式来进行。

软件设计评审流程如图2-23所示。

图2-23 软件设计评审流程图 dV1ehSQwlyaaFXDAU51eHQwwcPIkG6kdE8f58mwjUijNZ8NoBK8skov9+k3ytClx

点击中间区域
呼出菜单
上一章
目录
下一章
×