《第一章软件工程概述.docx》由会员分享,可在线阅读,更多相关《第一章软件工程概述.docx(48页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第一章软件工程概述1.1软件危机软件危机的介名1)软件危机:在计算机软件的开发和维护过程中所遇到的一系列严重问题。2)软件危机的两个主要问题:如何开发软件,以满足对软件日益增长的需求; 如何维护数量不断膨胀的已有软件。3)软件危机的典型表现:对软件开发成本和进度的估计常常很不准确。(2)用户对“已完成的”软件系统不满意的现象经常发生。 软件产品的质量往往靠不住。(4)软件常常是不可维护的。 软件通常没有适当的文档资料。(6)软件成本在计算机系统总成本中所占的比例逐年上升。 软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入趋 势。产生软件危机的原因软件本身特点:1)缺乏可见性,在运行之
2、前往往难以衡量,质量也难以评价2)不会因为长期使用而用坏,软件维护通常意味着修正或修改原来的设计,较 难维护。3)规模庞大,需分工合作,如何保证每个人的工作合在一起是极端复杂的问题。 软件开发与维护的方法不正确产生软件危机的原因可归结为两个重要的方面:软件生产本身存在的复杂性; 软件开发所使用的方法和技术。软件生命周期:一个软件从定义、开发、使用和维护直到最早被废弃。软件产品必须由一个完整的配置组成(程序、文档、数据)1.13消除软件危机的途径1)正确认识计算机软件2)认识到软件开发是一个协同配合、共同完成的工程项目并吸取经验。3)推广使用已总结的开发软件成功的技术和方法4)开发使用更好的软件
3、工具水平出发判断需求的现实性。4)有效性必须证明需求是正确有效的,确实能解决用户面对的问题。(2) 验证软件需求的方法(3)用于需求分析的软件工具RSL (需求陈述语言)PSL/PSA (问题陈述语言/问题陈述分析程序)第四章形式化说明技术4.1 概述4.1.1 非形式化方法的缺点用自然语言书写的系统规格说明书,可能存在矛盾、二义性、含糊性、不完整性及抽象 层次混乱等问题。所谓矛盾是指一组相互冲突的陈述。二义性是指读者可以用不同方式理解的陈述。系统规格说明书是很庞大的文档,因此,几乎不可避免地会出现含糊性。实际上,这样 笼统的陈述并没有给出任何有用的信息。不完整性可能是在系统规格说明中最常遇到
4、的问题之一。抽象层次混乱是指在非常抽象的陈述中混进了一些关于细节的低层次陈述。这样的规格 说明书使得读者很难了解系统的整体功能结构。4.1.2 形式化方法的优点人在理解用自然语言描述的规格说明时,容易产生二义性。为了克服非形式化方法的缺 点,人们把数学引入软件开发过程,创造了基于数学的形式化方法。在开发大型软件系统的过程中应用数学,能够带来下述的几个优点:数学最有用的一个性质是,它能够简洁准确地描述物理现象、对象或动作的结果,因此 是理想的建模工具。数学特别适合于表示状态,也就是表示做什么。需求规格说明书主要描述应用系统在运行前和运行后的状态,因此,数学比自然语言更 适于描述详细的需求。在理想
5、情况下,分析员可以写出系统的数学规格说明,它准确到几乎 没有二义性,而且可以用数学方法来验证,以发现存在的矛盾和不完整性,在这样的规格说 明中完全没有含糊性。但是,实际情况并不这么简单,软件系统的复杂性是出了名的,希望 用少数几个数学公式来描述它,是根本不可能的。此外,即使应用了形式化方法,完整性也 是难于保证的:由于沟通不够,可能遗漏了客户的一些需求;规格说明的撰写者可能有意省 略了系统的某些特征,以便设计者在选择实现方法时有一定自由度;要设想出使用一个大型 复杂系统的每一个可能的情景,通常是做不到的。在软件开发过程中使用数学的另一个优点是,可以在不同的软件工程活动之间平滑地过 渡。不仅功能
6、规格说明,而且系统设计也可以用数学表达,当然,程序代码也是一种数学符 号(虽然是一种相当繁琐、冗长的数学符号)。数学作为软件开发工具的最后一个优点是,它提供了高层确认的手段。可以使用数学方 法证明,设计符合规格说明,程序代码正确地实现了设计结果。4.13 应用形式化方法的准则人们对形式化方法的看法并不一致。形式化方法对某些软件工程师很有吸引力,其拥护 者甚至宣称这种方法可以引发软件开发方法的革命;另一些人则对把数学引入软件开发过程 持怀疑甚至反对的态度。编者认为,对形式化方法也应该一分为二,既不要过分夸大它的 优点也不要一概排斥。为了更好地发挥这种方法的长处,下面给出应用形式化方法的几条准 则
7、,供读者在实际工作中使用。 应该选用适当的表示方法。通常,一种规格说明技术只能用自然的方式说明某一类 概念,如果用这种技术描述其不适于描述的概念,则不仅工作量大而且描述方式也很复杂。 因此,应该仔细选择一种适用于当前项目的形式化说明技术。 应该形式化,但不要过分形式化。目前的形式化技术还不适于描述系统的每个方面。 但是,也不能因此就认为完全没必要采用形式化方法。形式化规格说明技术要求我们非常准 确地描述事物,因此有助于防止含糊和误解。事实上,如果用形式化方法仔细说明系统中易 出错的或关键的部分,则只用适中的工作量就能获得较大回报。 应该估算成本。为了使用形式化方法,通常需要事先进行大量的培训。
8、最好预先估 算所需的成本并编入预算。(4)应该有形式化方法顾问随时提供咨询。绝大多数软件工程师对形式化方法中使用的 数学和逻辑并不很熟悉,而且没受过使用形式化方法的专业训练,因此,需要专家指导和培 训。不应该放弃传统的开发方法。把形式化方法和结构化方法或面向对象方法集成起来 是可能的,而且由于取长补短往往能获得很好的效果。(6)应该建立详尽的文档。建议使用自然语言注释形式化的规格说明书,以帮助用户和 维护人员理解系统。(7)不应该放弃质量标准。形式化方法并不能保证软件的正确性,它们只不过是有助于 开发出高质量软件的一种手段。除了使用形式化说明技术外,在系统开发过程中仍然必须一 如既往地实施其他
9、质量保证活动。(8)不应该盲目依赖形式化方法。这种方法不是包治百病的灵丹妙药,它们只不过是众 多工具中的一种。形式化方法并不能保证开发出的软件绝对正确,例如,无法用形式化方法 证明从非形式化需求到形式化规格说明的转换是正确的,因此,必须用其他方法(例如,评 审、测试)来验证软件正确性。(9)应该测试、测试再测试。形式化方法不仅不能保证软件系统绝对正确,也不能证明 系统性能或其他质量指标符合需要,因此,软件测试的重要性并没有降低。(10)应该重用。即使采用了形式化方法,软件重用仍然是降低软件成本和提高软件质 量的惟一合理的方法。而且用形式化方法说明的软件构件具有清晰定义的功能和接口,使得 它们有
10、更好的可重用性。4.2 有穷状态机4.2.1 概念下面通过一个简单例子介绍有穷状态机的基本概念。一个保险箱上装了一个复合锁,锁有三个位置,分别标记为1、2、3,转盘可向左(L) 或向右(R)转动。这样,在任意时刻转盘都有6种可能的运动,即IL、1R、2L、2R、3L和3R。 保险箱的组合密码是IL、3R、2L,转盘的任何其他运动都将引起报警。状态集J: 保险箱锁定,A, B,保险箱解锁,报警。输入集 K: IL, 1R, 2L, 2R, 3L, 3R。转换函数T:如表4.1所示。初始态S:保险箱锁定。终态集F: 保险箱解锁,报警。如果使用更形式化的术语,一个有穷状态机可以表示为一个5元组(J,
11、 K, T, S, F),其J是一个有穷的非空状态集;K是一个有穷的非空输入集;T是一个从(J.F)XK至U J的转换函数;sej,是一个初始状态;F J,是终态集。终态终态初始态图1保险箱状态图有穷状态机的概念在计算机系统中应用得非常广泛。例如,每个菜单驱动的用户界面都 是一个有穷状态机的实现。一个菜单的显示和一个状态相对应,键盘输入或用鼠标选择一个 图标是使系统进入其他状态的一个事件。状态的每个转换都具有下面的形式:当前状态1菜单)+事件所选择的项) 下个状态。为了对一个系统进行规格说明,通常都需要对有穷状态机做一个很有用的扩展,即在前 述的5元组中加入第6个组件一一谓词集P,从而把有穷状
12、态机扩展为一个6元组,其中每 个谓词都是系统全局状态Y的函数。转换函数T现在是一个从(J.F)XKXP至卜的函数。现在 的转换规则形式如下:当前状态1菜单)+事件所选择的项)+谓词 下个状态。4.2.2 例子为了具体说明怎样用有穷状态机技术表达系统的规格说明,现在用这种技术给出大家熟 悉的电梯系统的规格说明。首先给出用自然语言描述的对电梯系统的需求:在一幢m层的大厦中需要一套控制n部电梯的产品,要求这n部电梯按照约束条件C1, C2和C3在楼层间移动。C1:每部电梯内有m个按钮,每个按钮代表一个楼层。当按下一个按钮时该按钮指示 灯亮,同时电梯驶向相应的楼层,到达按钮指定的楼层时指示灯熄灭。C2
13、:除了大厦的最低层和最高层之外,每层楼都有两个按钮分别请求电梯上行和下行。 这两个按钮之一被按下时相应的指示灯亮,当电梯到达此楼层时灯熄灭,电梯向要求的方向 移动。C3:当对电梯没有请求时,它关门并停在当前楼层。现在使用一个扩展的有穷状态机对本产品进行规格说明。这个问题中有两个按钮集。n 部电梯中的每一部都有m个按钮,一个按钮对应一个楼层。因为这mXn个按钮都在电梯 中,所以称它们为电梯按钮。此外,每层楼有两个按钮,一个请求向上,另一个请求向下, 这些按钮称为楼层按钮。电梯按钮的状态转换图如图4.2所示。令EB(e,f)表示按下电梯e内的按钮并请求到f层 去。EB(e,f)有两个状态,分别是按
14、钮发光(打开)和不发光(关闭)。更精确地说,状态是:EBON(e,f):电梯按钮(e,f)打开EBOFF(ezf):电梯按钮(e用关闭如果电梯按钮(e,f)发光且电梯到达f层,该按钮将熄灭。相反如果按钮熄灭,则按下它 时,按钮将发光。上述描述中包含了两个事件,它们分别是:EBP(eJ):电梯按钮(e,f)被按下EAF(e,f):电梯e到达f层EBOFF(%7)eaf(%7)图2电梯按钮的状态转换图FBOFF(dJ)EAF(199 3f)图3楼层按钮的状态转换图为了定义与这些事件和状态相联系的状态转换规则,需要一个谓词V(e,f),它的含义如V(eJ):电梯e停在f层如果电梯按钮(e,f)处于关
15、闭状态当前状态),而且电梯按钮(e,f)被按下事件),而且 电梯e不在f层(谓词),则该电梯按钮打开发光下个状态)。状态转换规则的形式化描述 如下:EBOFF(e,f)+EBP(e,f)+not V(e,f) EBON(e,f)反之,如果电梯到达f层,而且电梯按钮是打开的,于是它就会熄灭。这条转换规则可 以形式化地表示为:EBON(e,f)+EAF(e/f) EBOFF(e,f)接下来考虑楼层按钮。令FB(d,f)表示f层请求电梯向d方向运动的按钮。楼层按钮的状态如下:FBON(d,f):楼层按钮(d,f)打开FBOFF(dJ):楼层按钮(d,f)关闭如果楼层按钮已经打开,而且一部电梯到达f层
16、,则按钮关闭。反之,如果楼层按钮原 来是关闭的,被按下后该按钮将打开。这段叙述中包含了以下两个事件。FBP(d,f):楼层按钮(d,f)被按下EAF(l.n,f):电梯1或或n到达f层其中l.n表示或为1或为2或为no为了定义与这些事件和状态相联系的状态转换规则,同样也需要一个谓词,它是S(df), 它的定义如下。S(d,e,f):电梯e停在f层并且移动方向由d确定为向上(d二U)或向下(d二D)或待定(d二N)。这个谓词实际上是一个状态,形式化方法允许把事件和状态作为谓词对待。使用谓词S(df),形式化转换规则为:FBOFF(d/f)+FBP(d,f)+not S(d,l.n,f) FBON
17、(d,f)FBON(d,f)+EAF(l.n,f)+S(d/l.n/f) FBOFF(d/f)其中,d=UorDo也就是说,如果在f层请求电梯向d方向运动的楼层按钮处于关闭状态,现在该按钮被 按下,并且当时没有正停在f层准备向d方向移动的电梯,则该楼层按钮打开。反之,如果 楼层按钮已经打开,且至少有一部电梯到达f层,该部电梯将朝d方向运动,则按钮将关闭。在讨论电梯按钮状态转换规则时定义的谓词V(e,f),可以用谓词S(df)重新定义如下:V(e,f)=S(U,e,f)or S(D,e,f)or S(N,e,f)定义电梯按钮和楼层按钮的状态都是很简单、直观的事情。现在转向讨论电梯的状态及 其转换
18、规则,就会出现一些复杂的情况。一个电梯状态实质上包含许多子状态。下面定义电梯的3个状态:M(d,e,f):电梯e正沿d方向移动,即将到达的是第f层S(d,e,f):电梯e停在f层,将朝d方向移动(尚未关门)W(e,f):电梯e在f层等待(已关门)其中s(df)状态已在讨论楼层按钮时定义过,但是,现在的定义更完备一些。图4.电梯的状态转换图3个电梯停止状态S(Uf)、S(Nf)和S(Df)已被组合成一个大的状态,这样做的目的 是减少状态总数以简化流图。图4中包含了下述3个可触发状态发生改变的事件。DC(e,f):电梯e在楼层f关上门ST(e,f):电梯e靠近f层时触发传感器,电梯控制器决定在当前
19、楼层电梯是否停下RL:电梯按钮或楼层按钮被按下进入打开状态,登录需求最后,给出电梯的状态转换规则。为简单起见,这里给出的规则仅发生在关门之时。S(U,e,f)+DC(ezf) M(U,e,f+l)S(D,e,f)+DC(ezf) M(D,e,f-l)S(Nf)+DC(e,f) W(e,f)第一条规则表明,如果电梯e停在f层准备向上移动,且门已经关闭,则电梯将向上一 楼层移动。第二条和第三条规则,分别对应于电梯即将下降或者没有待处理的请求的情况。4.2.3 评价有穷状态机方法采用了一种简单的格式来描述规格说明:当前状态+事件+谓词下个状态这种形式的规格说明易于书写、易于验证,而且可以比较容易地把
20、它转变成设计或程序 代码。事实上,可以开发一个CASE工具把一个有穷状态机规格说明直接转变为源代码。维 护可以通过重新转变来实现,也就是说,如果需要一个新的状态或事件,首先修改规格说明, 然后直接由新的规格说明生成新版本的产品。有穷状态机方法比数据流图技术更精确,而且和它一样易于理解。不过,它也有缺点:在开发一个大系统时三元组(即状态、事件、谓词)的数量会迅速增长。此外,和数据流图方 法一样,形式化的有穷状态机方法也没有处理定时需求。下节将介绍的Petri网技术,是一 种可处理定时问题的形式化方法。4.3 Petri 网概念并发系统中遇到的一个主要问题是定时问题。这个问题可以表现为多种形式,如
21、同步问 题、竞争条件以及死锁问题。定时问题通常是由不好的设计或有错误的实现引起的,而这样 的设计或实现通常又是由不好的规格说明造成的。如果规格说明不恰当,则有导致不完善的 设计或实现的危险。用于确定系统中隐含的定时问题的一种有效技术是Petri网,这种技术 的一个很大的优点是它也可以用于设计中。etri网是由Carl Adam Petri发明的。最初只有自动化专家对Petri网感兴趣,后来Petri 网在计算机科学中也得到广泛的应用,例如,在性能评价、操作系统和软件工程等领域,Petri 网应用得都比较广泛。特别是已经证明,用Petri网可以有效地描述并发活动。Petri网包含4种元素:一组位
22、置P、一组转换T、输入函数I以及输出函数0。图4.5 举例说明了 Petri网的组成。图5 Petri网的组成一组位置P为Pl, P2, P3, P4,在图中用圆圈代表位置。一组转换T为(tl, t2,在图中用短直线表示转换。两个用于转换的输入函数,用由位置指向转换的箭头表示,它们是:l(tl)= P2, P4)I(t2)= P2两个用于转换的输出函数,用由转换指向位置的箭头表示,它们是:0(tl)= Pl0(t2)= P3, P3注意,输出函数0(t2)中有两个P3,是因为有两个箭头由t2指向P3。更形式化的Petri网结构,是一个四元组C=(P,T,l,0)o其中,P= Pl, Pn)是一
23、个有穷位置集,nOoT= tl, tm)是一个有穷转换集,m20,且T和P不相交。I: T-P8为输入函数,是由转换到位置无序单位组(bags)的映射。0: T-P8为输出函数,是由转换到位置无序单位组的映射。一个无序单位组或多重组是允许一个元素有多个实例的广义集。Petri网的标记是在Petri网中权标(token)的分配。例如,在图4.6中有4个权标,其中 一个在P1中,两个在P2中,P3中没有,还有一个在P4中。上述标记可以用向量(L 2, 0, 1)表示。由于P2和P4中有权标,因此tl启动(即被激发)。通常,当每个输入位置所拥有的 权标数大于等于从该位置到转换的线数时,就允许转换。当
24、tl被激发时,P2和P4上各有 一个权标被移出,而P1上则增加一个权标。Petri网中权标总数不是固定的,在这个例子中 两个权标被移出,而P1上只能增加一个权标。在图4.6中P2上有权标,因此t2也可以被激发。当t2被激发时,P2上将移走一个权 标,而P3上新增加两个权标。Petri网具有非确定性,也就是说,如果数个转换都达到了激 发条件,则其中任意一个都可以被激发。图4.6所示Petri网的标记为(1, 2, 0, 1), tl和t2 都可以被激发。假设tl被激发了,则结果如图4.7所示,标记为(2, 1, 0, 0)o此时,只有 t2可以被激发。如果t2也被激发了,则权标从P2中移出,两个
25、新权标被放在P3上,结果 如图4.8所示,标记为(2, 0, 2, 0)o图7 Petri网被激发后的情况P2图8含禁止线的Petri网更形式化地说,Petri网C=(P, T, I, 0)中的标记M,是由一组位置P到一组非负整数 的映射:M: P - 0, 1, 2,这样,带有标记的Petri网成为一个五元组(P, T, I, 0, M)o对Petri网的一个重要扩充是加入禁止线。如图4.9所示,禁止线是用一个小圆圈而不 是用箭头标记的输入线。通常,当每个输入线上至少有一个权标,而禁止线上没有权标的时 候,相应的转换才是允许的。在图4.9中,P3上有一个权标而P2上没有权标,因此转换tl 可
26、以被激发。例子现在把Petri网应用于上一节讨论过的电梯问题。当用Petri网表示电梯系统的规格说明 时,每个楼层用一个位置Ff代表(lWfWm),在Petri网中电梯是用一个权标代表的。在位置 Ff上有权标,表示在楼层f上有电梯。1 .电梯按钮电梯问题的第一个约束条件描述了电梯按钮的行为,现在复述一下这个约束条件。第一条约束C1:每部电梯有m个按钮,每层对应一个按钮。当按下一个按钮时该按钮 指示灯亮,指示电梯移往相应的楼层。当电梯到达指定的楼层时,按钮将熄灭。为了用Petri网表达电梯按钮的规格说明,在Petri网中还必须设置其他的位置。电梯中 楼层f的按钮,在Petri网中用位置EBf表示
27、(lWfWm)。在EBf上有一个权标,就表示电梯 内楼层f的按钮被按下了。电梯按钮只有在第一次被按下时才会由暗变亮,以后再按它则只会被忽略。图4.10所 示的Petri网准确地描述了电梯按钮的行为规律。首先,假设按钮没有发亮,显然在位置EBf 上没有权标,从而在存在禁止线的情况下,转换EBf被按下是允许发生的。假设现在按下 按钮,则转换被激发并在EBf上放置了一个权标,如图4.10所示。以后不论再按下多少次 按钮,禁止线与现有权标的组合都决定了转换EBf被按下不能再被激发了,因此,位置EBf 上的权标数不会多于1。4.4 软件工程的介绍软件工程是指导计算机软件开发和维护的一门工程学科。采用工程
28、的概念、原 理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和 当前能够得到的最好的技术方法结合起来,以经济地、高效的开发出高质量的 软件并有效地维护它,这就是软件工程。本质特性:1)软件工程关注于大型程序的构造2)软件工程的中心课题是控制复杂性3)软件经常变化4)开发软件的效率非常重要5)和谐地合作是开发软件的关键6)软件必须有效地支持它的用户7)在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的 人创造产品。4.5 软件工程的基本原理1)用分阶段的生命周期计划严格管理2)坚持进行阶段评审3)实行严格的产品控制4)采用现代程序设计技术5)结果应能清楚地审查6)
29、开发小组的人员应该少而精7)承认不断改进软件工程实践的必要性4.6 软件工程方法学在软件生命周期全过程中使用的一整套技术方法的集合称为方法学。 软件工程方法学,三要素:方法、工具和过程。1)传统方法学2)面向对象方法学1.4J软件生命周期:定义、开发、维护(1) 问题定义(2) 可行性研究(3) 需求分析(4) 总体设计(5) 详细设计(6) 编码和单元测试(7) 综合测试(8) 软件维护图9 Petri网表示的电梯按钮假设电梯由g层驶向f层,因为电梯在g层,如图4.10所示,位置Fg上有一个权标。 由于每条输入线上各有一个权标,转换电梯在运行被激发,从而EBf和Fg上的权标被移 走,按钮EB
30、f被关闭,在位置Ff上出现一个新权标,即转换的激发使电梯由g层驶到f层。事实上,电梯由g层移到f层是需要时间的,为处理这个情况及其他类似的问题(例如, 由于物理上的原因按钮被按下后不能马上发亮),Petri网模型中必须加入时限。也就是说, 在标准Petri网中转换是瞬时完成的,而在现实情况下就需要时间控制Petri网,以使转换与 非零时间相联系。2.楼层按钮在第二个约束条件中描述了楼层按钮的行为。第二条约束C2:除了第一层与顶层之外,每个楼层都有两个按钮,一个要求电梯上行, 另一个要求电梯下行。这些按钮在按下时发亮,当电梯到达该层并将向指定方向移动时,相 应的按钮才会熄灭。在Petri网中楼层
31、按钮用位置FBfu和FBfd表示,分别代表f楼层请求电梯上行和下行的 按钮。底层的按钮为FBlu,最高层的按钮为FBmd,中间每一层有两个按钮FBfu和FBfd(l fm)o阳;被按下 斤巧电梯在运行 号图10 Petri网表示楼层按钮最后,考虑第三条约束。第三条约束C3:当电梯没有收到请求时,它将停留在当前楼层并关门。这条约束很容易实现,当没有请求(FBfu和FBfd上无权标)时,任何一个转换电 梯在运行都不能被激发。4.4 Z语言简介用Z语言描述的、最简单的形式化规格说明含有下述4个部分:给定的集合、数据类型及常数。状态定义。初始状态。操作。1 .给定的集合一个Z规格说明从一系列给定的初始
32、化集合开始。所谓初始化集合就是不需要详细定义 的集合,这种集合用带方括号的形式表示。对于电梯问题,给定的初始化集合称为Button, 即所有按钮的集合,因此,Z规格说明开始于:Button)2 .状态定义一个Z规格说明由若干个格(schema)组成,每个格含有一组变量说明和一系列限定变 量取值范围的谓词。例如,格S的格式如图4.12所示。 S谓词 说明图11Z格S的格式在电梯问题中,Button有4个子集,即floor_buttons(楼层按钮的集合)、 elevator_buttons(电梯按钮的集合)、buttons(电梯问题中所有按钮的集合)以及pushed(所有被 按的按钮的集合,即所
33、有处于打开状态的按钮的集合)。图4.13 (见书76页)描述了格 Button_State,其中,符号P表示累集(即给定集的所有子集)。约束条件声明,floor-buttons 集与elevator_buttons集不相交,而且它们共同组成buttons集(在下面的讨论中并不需要 floojbuttons集和elevatojbuttons集,把它们放于图4.13中只是用来说明Z格包含的内容)。Button_State fl oor_b utons, e lev ator_b utton: P Buttonbutons: P Buttonpushed: P Buton floor_buttons
34、 n e 1 ev atoib utt on s=(pfloor_buttons U e 1 ev at oib utt on s=b utt on s图12 Z格包含的内容3 .初始状态抽象的初始状态是指系统第一次开启时的状态。对于电梯问题来说,抽象的初始状态为:Buttonjnit (Button_State I pushed二上式表示,当系统首次开启时pushed集为空,即所有按钮都处于关闭状态。4 .操作如果一个原来处于关闭状态的按钮被按下,则该按钮开启,这个按钮就被添加到pushed 集中。图4.14 (见书77页)定义了操作Push_Button(按按钮)。操作的谓词部分,包含了一
35、组调用操作的前置条件,以及操作完全结束后的后置条件。 如果前置条件成立,则操作执行完成后可得到后置条件。但是,如果在前置条件不成立的情 况下调用该操作,则不能得到指定的结果(因此结果无法预测)。假设电梯到达了某楼层,如果相应的楼层按钮已经打开,则此时它会关闭;同样,如果 相应的电梯按钮已经打开,则此时它也会关闭。也就是说,如果button?属于pushed集, 则将它移出该集合,如图4.15 (见书77页)所示(符号表示集合差运算)。评价已经在许多软件开发项目中成功地运用了Z语言,目前,Z也许是应用得最广泛的形式 化语言,尤其是在大型项目中Z语言的优势更加明显。Z语言之所以会获得如此多的成功,
36、 主要有以下几个原因:(I)可以比较容易地发现用Z写的规格说明的错误,特别是在自己审查规格说明,及根 据形式化的规格说明来审查设计与代码时,情况更是如此。 用Z写规格说明时、要求作者十分精确地使用Z说明符。由于对精确性的要求很高, 从而和非形式化规格说明相比,减少了模糊性、不一致性和遗漏。(3) Z是一种形式化语言,在需要时开发者可以严格地验证规格说明的正确性。(4)虽然完全学会Z语言相当困难,但是,经验表明,只学过中学数学的软件开发人员 仍然可以只用比较短的时间就学会编写Z规格说明,当然,这些人还没有能力证明规格说明 的结果是否正确。(5)使用Z语言可以降低软件开发费用。虽然用Z写规格说明所
37、需用的时间比使用非形式化技术要多,但开发过程所需要的总时间却减少了。(6)虽然用户无法理解用Z写的规格说明,但是,可以依据Z规格说明用自然语言重写 规格说明。经验证明,这样得到的自然语言规格说明,比直接用自然语言写出的非形式化规 格说明更清楚、更正确。使用形式化规格说明是全球的总趋势,过去,主要是欧洲习惯于使用形式化规格说明技 术,现在越来越多的美国公司也开始使用形式化规格说明技术。第五章总体设计总体设计的基本目的就是回答“概括地说,系统应该如何实现?”这个问题,因此,总体 设计又称为概要设计或初步设计。总体设计过程两个主要阶段:(1)系统设计阶段,确定系统的具体实现方案(2)结构设计阶段,确
38、定软件结构5.1设计过程(1)设想供选择的方案(2)选取合理的方案(3)推荐最佳方案(4)功能分解(结构设计及由哪些模块组成和过程设计-确定每个模块的处理过程)(5)设计软件结构(层次图或结构图)(6)设计数据库(7)制定测试计划(8)书写文档:系统说明、用户手册、测试计划、详细的实现计划、数据库设计结果;(9)审查和复审设计原理(1) 模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些 模块集成起来构成一个整体,可以完成指定的功能满足用户的需求.把复杂的问题 分解成许多容易解决的小问题,原来的问题也就容易解决了.模块化和软件成本关系:根据总成本曲线,每个程序都相
39、应地有一个最适当的模块数 目可,使得系统的开发成本最小.(2) 抽象抽出事务的本质特性而暂时不考虑它们的细节.(3) 逐步求精(4) 信息隐藏和局部化模块中所包括的信息不允许其它不需这些信息的模块调用信息局部化:是把一些关系密切的软件元素物理地放得彼此靠近(5) 模块独立是软件系统中每个模块只涉及软件要求的具体子功能,而和软件系统中的其它的模 块接口是简单的。模块独立的概念是模块化、抽象、信息隐蔽和局部化概念的直接 结果。1)耦合也称块间联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模 块之间联系越紧密,其耦合性就越强,模块的独立性则越差。模块间耦合高低 取决于模块间接口的复杂性、
40、调用的方式及传递的信息。(a)数据耦合:如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅 是数据。(b)控制耦合:模块传递的信息中有控制信息,就称作控制耦合。(c)特征耦合:把整个数据结构作为参数传递而被调用的模块只需要使用其中 一部分数据元素。(d)公共耦合:一组模块通过同一个公共数据环境相互作用,则它们之间的耦 合称为公共耦合。(e)内容耦合:如果发生下列情形之一,两个模块之间就发生了内容耦合。一个模块直接访问另一个模块的内部数据一个模块不能通过正常入口转到另一模块的内部两个模块有一部分程序代码重叠(只可能出现在汇编语言中) 一个模块有多个入口2)内聚又称块内联系。指模块的功能强度的
41、度量,即一个模块内部各个元素彼此结合的 紧密程度的度量。若一个模块内各元素(语句之间、程序段之间)联系得越紧密, 则它的内聚性就越高。(a)偶然内聚:如果一个模块各部分之间没有关系,或者即使有关系,这种关 系也是很松散的,则称作偶然内聚。(低内聚)(b)时间内聚:如果一个模块所包含的任务必须在同一时间内执行,称作时间 内聚。(低内聚)(c)逻辑内聚:一个模块完成的任务在逻辑上属于相同或相似的一类(低内聚)(d)过程内聚:如果一个模块内的处理是相关的,而且必须以特定次序执行, 则称为过程内聚。(中内聚)(e)通信内聚:如果一个模块中的所有元素都使用了相同的输入数据,或产生 了相同的输出数据,则称
42、为通信内聚。(中内聚)(f)顺序内聚:如果一个模块内的处理元素和同一个功能密切相关,而且这些 处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素 的输入数据),则称为顺序内聚。(高内聚)(g)功能内聚:如果一个模块内所有处理元素属于一个整体,完成一个单一的 功能,则称作功能内聚。(高内聚)耦合性与内聚性是模块独立性的两个定性标准,将软件系统划分模块时,尽量做到高内 聚低耦合,提高模块的独立性,为设计高质量的软件结构奠定基础。模块的高内聚、低耦合的原则称为模块独立原则,也称为模块设计的原则。5.2 启发规则(1)改进软件结构提高模块独立性(2)模块规模应该适中(3)深度、宽度、扇出、
43、和扇入都应适当深度表示软件结构中控制的层数,它往往能粗略地标志一个系统的大小和复杂程度。 宽度是软件结构内同一个层次上的模块总数的最大值;一般来说,宽度越大系统越复 杂。宽度影响最大的因素是模块的扇出。一个模块的扇入是指直接调用该模块的上级模块的个数。一个模块的扇出是指该模块直接调用的下级模块的个数。设计原则:低扇出、高扇入。模块的作用域应该在控制域内。模块的作用域定义为受该模块内一个判定影响的所有模 块的集合。模块的控制域是这个模块本身以及所有直接或间接从属于它的模块的集合。 力争降低模块接口的复杂程度。设计单入口和单出口的模块。模块功能应该可以预测.描绘软件结构的图形工具(1) 层次图和H
44、IPO(层次图加输入/处理/输出图)层次图是用来描述软件的层次结构的。图1层次图图2 HIPO图(2) 结构图结构图和层次图类似,都是描述软件结构的图形工具产生最佳解计算最佳解读输入编辑输入结果格式化显示结果图3结构图.面向数据流的设计方法面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。面 向数据流的设计要解决的任务,就是上述需求分析的基础上,将DFD图映射为软件系统 的结构。(1) 概念变换流事务流数据流图的类型:交换型结构和事务型结构交换型结构:由3部分组成,传入路径,变换中心,输出路径。系统的传入流经过变换中心 的处理,变换为系统的传出流。事务型结构:有至少一条
45、接受路径,一个事务中心与若干条动作路径组成。当外部信息沿着 接受路径进入系统后,经过事务中心获得某个特定值,就能据此启动某一条动作路径的操作。(2) 变换分析变换分析是一系列设计步骤的总称,经过这些步骤把具有变换流特点的数据流 图按预先确定的模式映射成软件结构。(3) 事务分析(4) 设计优化第六章详细设计6.1 详细设计的任务详细设计的目的是为软件结构图(SC图或HC图)中的每一个模块确定使用的算法和块 内数据结构,并用某种选定的表达工具给出清晰的描述。这一阶段的主要任务:1 .为每个模块确定采用的算法,选择某种适当的工具表达算法的过程,写出模块的详 细过程性描述;2 .确定每一模块使用的数
46、据结构;3 .确定模块接口的细节,包括对系统外部的接口和用户界面,对系统内部其它模块的 接口,以及模块输入数据、输出数据及局部数据的全部细节。在详细设计结束时,应该把上述结果写入详细设计说明书,并且通过复审形成正式文档。 交付给下一阶段(编码阶段)的工作依据。4 .要为每一个模块设计出一组测试用例,以便在编码阶段对模块代码(即程序)进行 预定的测试,模块的测试用例是软件测试计划的重要组成部分,通常应包括输入数据,期望 输出等内容。6.2 详细设计的原则1 .由于详细设计的蓝图是给人看的,所以模块的逻辑描述要清晰易读、正确可靠。2 .采用结构化设计方法,改善控制结构,降低程序的复杂程度,从而提高
47、程序的可读 性、可测试性、可维护性。其基本内容归纳为如下几点。(1)程序语言中应尽量少用GOTO语句,以确保程序结构的独立性。(2)使用单人口单出口的控制结构,确保程序的静态结构与动态执行情况相一致。保证 程序易理解。(3)程序的控制结构一般采用顺序、选择、循环三种结构来构成,确保结构简单。 用自顶向下逐步求精方法完成程序设计。结构化程序设计的缺点是存储容量和运行 时间增加10-20%,但易读易维护性好。(5)经典的控制结构为顺序,IF THEN ELSE分支,DO-WHILE循环。扩展的还有多分支 CASE, DO-UNTIL循环结构,固定次数循环DOWHILE。3 .选择恰当描述工具来描述各模块算法。6.3 详细设计的方法详细设计的工具:1 .图形工具利用图形工具可以把过程的细节用图形描述出来。2 .表格工具可以用一张表来描述过程的细节,在这张表中列出了各种可能的操作和相应的条件。3 .语言工具用某种高级语言(称之为伪码)来描述过程的细节。4 .4程序流程
限制150内