《软件工程导论》(第6版)第5章 总体设计 复习笔记

news2024/11/26 13:57:19

第5章 总体设计

一、总体设计概念

1.定义

总体设计的基本目的就是回答“系统应该如何实现”这个问题,总体设计又称为概要设计或初步设计。

2.主要任务

(1)划分出组成系统的物理元素程序、文件、数据库、人工过程和文档等,但是每个物理元素仍然处于黑盒子级,这些黑盒子里的具体内容将在以后仔细设计。

(2)设计软件的结构,也就是要确定系统中每个程序是由哪些模块组成的,以及这些模块相互间的关系。

3.步骤

①寻找实现目标系统的各种不同的方案,需求分析阶段得到的数据流图是设想各种可能方案的基础。

②分析员从这些供选择的方案中选取若干个合理的方案,为每个合理的方案都准备一份系统流程图,列出组成系统的所有物理元素,进行成本/效益分析,并且制定实现这个方案的进度计划。

③进行必要的数据库设计,确定测试要求并且制定测试计划。

4.必要性 

可以站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。

二、设计过程

总体设计过程通常由两个主要阶段组成:系统设计阶段,确定系统的具体实现方案;结构设计阶段,确定软件结构。典型的总体设计过程包括下述9个步骤。

1.设想供选择的方案

在总体设计阶段应该考虑各种可能的实现方案,并且力求从中选出最佳方案。在总体设计阶段开始时只有系统的逻辑模型,分析员有充分的自由分析比较不同的物理实现方案,一旦选出了最佳的方案,将能大大提高系统的性能/价格比需求分析阶段得出的数据流图是总体设计的极好的出发点。常用的方法是,设想把数据流图中的处理分组的各种可能的方法,抛弃在技术上行不通的分组方法,余下的分组方法代表可能的实现策略,并且可以启示供选择的物理系统。

2.选取合理的方案

应该从前一步得到的一系列供选择的方案中选取若干个合理的方案,通常至少选取低成本、中等成本和高成本的3种方案。

对每个合理的方案,都应该准备下列4份资料:

(1)系统流程图。

(2)组成系统的物理元素清单。

(3)成本/效益分析。

(4)实现这个系统的进度计划。

3.推荐最佳方案

应该综合分析对比各种合理方案的利弊,推荐一个最佳的方案,并且为推荐的方案制定详细的实现计划。用户和有关的技术专家应该认真审查分析员所推荐的最佳系统,如果该系统确实符合用户的需要,并且是在现有条件下完全能够实现的,则应该提请使用部门负责人进一步审批。在使用部门的负责人也接受了分析员所推荐的方案之后,将进入总体设计过程的下一个重要阶段—结构设计。

4.功能分解

为确定软件结构,需要从实现角度把复杂的功能进一步分解。需要结合算法描述仔细分析数据流图中的每个处理,如果一个处理的功能过分复杂,必须把它的功能适当地分解成一系列比较简单的功能。

5.设计软件结构

把模块组织成良好的层次系统,顶层模块调用它的下层模块以实现程序的完整功能,每个下层模块再调用更下层的模块,从而完成程序的一个子功能,最下层的模块完成最具体的功能。软件结构,即由模块组成的层次系统可以用层次图或结构图来描绘。

6.设计数据库

对于需要使用数据库的那些应用系统,应该在需求分析阶段所确定的系统数据需求的基础上,进一步设计数据库。

7.制定测试计划

在软件开发的早期阶段考虑测试问题,能促使软件设计人员在设计时注意提高软件的可测试性。

8.书写文档

用正式的文档记录总体设计的结果,在这个阶段应该完成的文档通常有下述几种。

(1)系统说明,主要包括用系统流程图描绘的系统构成方案,组成系统的物理元素清单,成本/效益分析;对最佳方案的概括描述,精化的数据流图,用层次图或结构图描绘的软件结构,用IP0图或其他工具(例如,PDL语言)简要描述的各个模块的算法,模块问的接口关系,以及需求、功能和模块三者之间的交叉参照关系等。

(2)用户手册。

(3)测试计划,包括测试策略,测试方案,预期的测试结果,测试进度计划等。

(4)详细的实现计划。

(5)数据库设计结果。

9.审查和复审

最后对总体设计结果进行严格的技术审查,在技术审查通过后再由客户从管理角度进行复审。

三、设计原理

1.模块化

(1)模块

模块是由边界元素限定的相邻程序元素的序列,而且有一个总体标识符代表它。模块是构成程序的基本构件。过程、函数、子程序和宏等,都可作为模块。面向对象方法学中的对象是模块,对象内的方法也是模块。模块是构成程序的基本构件。

(2)模块化

模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。模块化是为了使一个复杂的大型程序能被人的智力所管理,是软件应该具备的唯一属性。

(3)优点

①使软件结构清晰,不仅容易设计也容易阅读和理解。

②使软件容易测试和调试,有助于提高软件的可靠性。

③提高软件的可修改性。

④有助于软件开发工程的组织管理。

2.抽象

(1)定义

把在现实世界中一定事物、状态或过程之间的共性集中和概括起来,暂时忽略它们之间的差异,这就是抽象或者说抽象就是抽出事物的本质特性而暂时不考虑它们的细节。抽象是人类在认识复杂现象的过程中使用的最强有力的思维工具。

(2)原理

处理复杂系统的唯一有效的方法是用层次的方式构造和分析它。一个复杂的动态系统先可以用一些高级的抽象概念构造和理解,这些高级概念又可以用一些较低级的概念构造和理解,不断循环进行下去,直至最低层次的具体元素。

(3)层次分析

①在抽象的最高层次使用问题环境的语言,以概括的方式叙述问题的解法;

②在较低抽象层次采用更过程化的方法,把面向问题的术语和面向实现的术语结合起来叙述问题的解法;

③在最低的抽象层次用可以直接实现的方式叙述问题的解法。

(4)在软件工程中的应用

软件工程过程的每一步都是对软件解法的抽象层次的一次精化。

①在可行性研究阶段,软件作为系统的一个完整部件;

②在需求分析期间,软件解法是使用在问题环境内熟悉的方式描述的;

③由总体设计向详细设计过渡时,抽象的程度也就随之减少了;

④源程序写出来以后,也就达到了抽象的最低层。

(5)优点

①简化了软件的设计和实现;

②提高了软件的可理解性和可测试性;

③使得软件更容易维护。

3.逐步求精

(1)定义

逐步求精是软件工程技术的基础。可以把逐步求精定义为:为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。逐步求精是人类解决复杂问题时采用的基本方法。

(2)要求

逐步求精是一项把一个时期内必须解决的种种问题按优先级排序的技术。逐步求精方法确保每个问题都将被解决,而且每个问题都将在适当的时候被解决,但任何时候一个人都不需要同时处理7个以上知识块。

(3)原理

①逐步求精最初是一种自顶向下的设计策略。程序的体系结构是通过逐步精化处理过程的层次而设计出来的。通过逐步分解对功能的宏观陈述而开发出层次结构,直至最终得出用程序设计语言表达的程序。

②求精实际上是细化过程。人们从在高抽象级别定义的功能陈述(或信息描述)开始,也就是说,该陈述仅仅概念性地描述了功能或信息,但是并没有提供功能的内部工作情况或信息的内部结构。

(4)抽象与求精

抽象与求精是一对互补的概念。抽象使得设计者能够说明过程和数据,同时却忽略了低层细节。求精则帮助设计者在设计过程中逐步揭示出低层细节。这两个概念都有助在设计演化过程中创造出完整的设计模型。

4.信息隐藏和局部化

(1)定义

信息隐藏原理是在设计和确定的模块中,使一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。

(2)局部化与信息隐藏

①局部化的概念和信息隐藏概念是密切相关的。局部化是指把一些关系密切的软件元素物理地放得彼此靠近。在模块中使用局部数据元素是局部化的一个例子,局部化有助于实现信息隐藏。

②“隐藏”意味着有效的模块化可以通过定义一组独立的模块而实现,这些独立的模块彼此间仅仅交换那些为了完成系统功能而必须交换的信息。

(3)优点

绝大多数数据和过程对于软件的其他部分而言是隐藏的,在修改期间由于疏忽而引入的错误就很少可能传播到软件的其他部分。

5.模块独立

(1)定义

开发具有独立功能而且和其他模块之间没有过多的相互作用的模块,就可以做到模块独立。使得每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单。模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结果。

(2)重要性

①具有独立的模块的软件比较容易开发出来。

②独立的模块比较容易测试和维护。

(3)耦合

①定义

耦合是对一个软件结构内不同模块之间互连程度的度量。耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点,以及通过接口的数据。模块间的耦合程度强烈影响着系统的可理解性、可测试性、可靠性和可维护性。耦合衡量不同模块彼此之间互相依赖(连接)的紧密程度。

②分类

a.完全独立

如果两个模块中的每一个都能独立地工作而不需要另一个模块的存在,则称它们彼此完全独立,耦合程度最低。但是,在一个软件系统中不可能所有模块之间都没有任何连接。

b.数据耦合

如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据,则称它们是数据耦合。数据耦合是低耦合,系统中至少必须存在这种耦合

c.控制耦合

如果两个模块彼此间通过参数交换信息,并且传递的信息中包含控制信息(这种控制信息可以以数据的形式出现),则称它们是控制耦合。控制耦合是中等程度的耦合,它增加了系统的复杂程度。控制耦合往往是多余的,可用数据耦合代替它。

d.特征耦合

如果整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素,则称它们是特征耦合。在这种情况下,被调用的模块可以使用的数据多于它确实需要的数据,这将导致对数据的访问失去控制,从而给计算机犯罪提供了机会。

e.公共环境耦合

如果两个或多个模块通过一个公共数据环境相互作用,则称它们是公共环境耦合。公共环境耦合的复杂程度随耦合的模块个数增加而增加。

如果只有两个模块有公共环境,那么这种耦合有下面两种可能:

第一,一个模块往公共环境送数据,另一个模块从公共环境取数据,属于数据耦合的一种形式,是比较松散的耦合。

第二,两个模块都既往公共环境送数据又从里面取数据,这种耦合比较紧密,介于数据耦合和控制耦合之间。

f.内容耦合

内容耦合是最高程度的耦合,当出现下列情况之一时,就发生了内容耦合。

第一,一个模块访问另一个模块的内部数据;

第二,一个模块不通过正常入口而转到另一个模块的内部;

第三,两个模块有一部分程序代码重叠;

第四,一个模块有多个入口。

③设计原则

耦合是影响软件负责程度的一个重要因素,在设计时应追求尽可能松散耦合的系统,力求做到低耦合,尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。

(4)内聚

①定义

内聚标志着一个模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展,即理想内聚的模块只做一件事情。设计时应该力求做到高内聚,内聚衡量一个模块内部各个元素彼此结合的紧密程度。

②内聚与耦合的关系

a.内聚和耦合是密切相关的,模块内的高内聚往往意味着模块间的松耦合。

b.内聚和耦合都是进行模块化设计的工具,但内聚更重要,应该把更多注意力集中到提高模块的内聚程度上。

③分类

a.低内聚

第一,偶然内聚

如果一个模块完成一组任务,这些任务彼此间即使有关系,关系也是很松散的,就叫做偶然内聚。有时在写完一个程序之后,发现一组语句在两处或多处出现,于是把这些语句作为一个模块以节省内存,这样就出现了偶然内聚的模块。

第二,逻辑内聚

如果一个模块完成的任务在逻辑上属于相同或相似的一类,则成为逻辑内聚。

第三,时间内聚

如果一个模块包含的任务必须在同一段时间内执行,就叫时间内聚。时间关系在一定程度上反映了程序的某些实质,所以时间内聚比逻辑内聚好一些。

b.中内聚

第一,过程内聚

如果一个模块内的处理元素是相关的,而且必须以特定次序执行,则称为过程内聚。使用程序流程图作为工具设计软件时,往往得到的是过程内聚的模块。

第二,通信内聚

如果模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通信内聚。

c.高内聚

第一,顺序内聚

如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行,则称为顺序内聚。根据数据流图划分模块时,通常得到顺序内聚的模块。

第二,功能内聚

如果模块内所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。

四、启发规则

1.改进软件结构提高模块独立性

设计出软件的初步结构后,应该审查分析这个结构,通过模块分解或合并,力求降低耦合提高内聚。

2.模块规模应该适中

(1)过大的模块往往是由于分解不充分,但是进一步分解必须符合问题结构,分解后不应该降低模块独立性。

(2)过小的模块开销大于有效操作,而且模块数目过多将使系统接口复杂。因此过小的模块有时不值得单独存在。

3.深度、宽度、扇出和扇入都应适当

(1)深度

深度表示软件结构中控制的层数,能粗略地标志一个系统的大小和复杂程度。深度和程序长度之间应该有粗略的对应关系,当然这个对应关系是在一定范围内变化的。如果层数过多则应该考虑是否有许多管理模块过分简单了,能否适当合并。

(2)宽度

宽度是软件结构内同一个层次上的模块总数的最大值。宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出。

(3)扇出

扇出是一个模块直接控制的模块数目。在设计时应注意:

①扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块,扇出太大一般是因为缺乏中间层次,应适当增加中间层次的控制模块。

②扇出过小可把下级模块分解成若干个子功能模块,或合并到它的上级模块中去。分解模块或合并模块必须符合问题结构,不能违背模块独立原理。

③一个设计得好的典型系统的平均扇出通常是3或4。

(4)扇入

扇入表明有多少个上级模块直接调用它,扇入越大则共享该模块的上级模块数目越多。但是,不能违背模块独立原理单纯追求高扇入。

设计得很好的软件结构通常顶层扇出比较高,中层扇出较少,底层扇入到公共的实用模块中去(底层模块有高扇入)。

4.模块的作用域应该在控制域之内

(1)定义

①模块的作用域定义为受该模块内一个判定影响的所有模块的集合。

②模块的控制域是这个模块本身以及所有直接或间接从属于它的模块的集合。

(2)规则

在一个设计得很好的系统中,所有受判定影响的模块应该都从属于做出判定的那个模块,最好局限于做出判定的那个模块本身及它的直属下级模块。

(3)修改方法

①把做判定的点往上移

②把在作用域内但不在控制域内的模块移到控制域内

到底采用哪种方法改进软件结构,需要根据具体问题统筹考虑。一方面应该考虑哪种方法更现实,另一方面应该使软件结构能最好地体现问题原来的结构。

5.力争降低模块接口的复杂程度

模块接口复杂是软件发生错误的一个主要原因。应该仔细设计模块接口,使得信息传递简单并且和模块的功能一致。接口复杂或不一致(即看起来传递的数据之间没有联系)是紧耦合或低内聚的征兆,应该重新分析这个模块的独立性。

6.设计单入口单出口的模块

这条规则警告软件工程师不要使模块间出现内容耦合。当从顶部进入模块并且从底部退出来时,软件是比较容易理解的,因此也是比较容易维护的。

7.模块功能应该可以预测

模块的功能应该能够预测,但也要防止模块功能过分局限。

(1)可预测

如果一个模块可以当做一个黑盒子,即只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。由于内部存储器对于上级模块而言是不可见的,所以这样的模块既不易理解又难于测试和维护。

(2)过分局限

如果一个模块任意限制局部数据结构的大小,过分限制在控制流中可以做出的选择或者外部接口的模式,那么这种模块的功能就过分局限,使用范围也就过分狭窄了。

五、描绘软件结构的图形工具

1.层次图

(1)定义

层次图用来描绘软件的层次结构。层次图中的一个矩形框代表一个模块,方框间的连线表示调用关系而不像层次方框图那样表示组成关系。图5-1是层次图的一个例子,最顶层的方框代表正文加工系统的主控模块,它调用下层模块完成正文加工的全部功能;第二层的每个模块控制完成正文加工的一个主要功能,第二层的模块又可以调用下一层的模块完成具体的工作。

图5-1 正文加工系统的层次图

(2)适用性

层次图很适于在自顶向下设计软件的过程中使用。通常用层次图作为描绘软件结构的文档。

2.HIPO图

(1)定义

HIPO图是“层次图加输入/处理/输出图”的缩写。使HIPO图具有可追踪性,在层次图里除了最顶层的方框之外,每个方框都加了编号。图5-1加了编号后得到图5-2。

图5-2 带编号的层次图(H图)

(2)特征

①HIPO图和层次图中每个方框相对应,应有一张IPO图描绘这个方框代表的模块的处理过程。

②HIPO图中的每张IPO图内都应该明显地标出它所描绘的模块在H图中的编号。

3.结构图

(1)定义

结构图是进行软件结构设计的一个有力工具,和层次图类似,也是描绘软件结构的图形工具,图5-3、图5-4、图5-5均是结构图的例子。

图5-3 产生最佳解的一般结构

①基本符号

a.结构图中一个方框代表一个模,框内注明模块的名字或主要功能;

b.方框之间的箭头(或直线)表示模块的调用关系;

c.尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。

②特殊符号

a.表示当模块M中某个判定为真时调用模块A,为假时调用模块B,如图5-4所示;

b.表示模块M循环调用模块A、B和C,如图5-5所示。

图5-4 判定为真时调用A,为假时调用B

图5-5 模块M循环调用模块A、B、C

(2)与层次图的共性

①层次图和结构图不严格表示模块的调用次序。

②层次图和结构图不指明什么时候调用下层模块。

③层次图和结构图只表明模块调用那些模块,至于模块内有没有其他成分则没有表示。

(3)适用性

利用IPO图或数据字典中的信息得到模块调用时传递的信息,从而由层次图导出结构图的过程,是检查设计正确性和评价模块独立性的好方法。

六、面向数据流的设计方法

1.概念

(1)定义

面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。

(2)目标

面向数据流的设计方法的目标是给出设计软件结构的一个系统化的途径。

(3)信息流的类型

①变换流

图5-6 变换流

图5-6是一个标准的变换流,变换流具有如下特征:

a.信息沿输入通路进入系统,同时由外部形式变换成内部形式;

b.进入系统的信息通过变换中心,经加工处理后沿输出通路变成外部形式离开软件系。

②事务流

图5-7 事务流

事务流是“以事务为中心的”的数据流,即数据沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。图5-7中的处理T称为事务中心,它完成下述任务:

a.接收输入数据;

b.分析每个事务以确定它的类型;

c.根据事务类型选取一条活动通路。

2.设计过程

图5-8说明了使用面向数据流方法逐步设计的过程。

图5-8 面向数据流方法的设计过程

注意:任何设计过程都不是机械的一成不变的。

3.变换分析

(1)例子

假设的仪表板将完成下述功能:

①通过模数转换实现传感器和微处理机接口。

②在发光二极管面板上显示数据。

③指示每小时英里数(mph),行驶的里程,每加仑油行驶的英里数(mpg)等。

④指示加速或减速。

⑤超速警告:如果车速超过55英里/小时,则发出超速警告铃声。

(2)设计步骤

①复查基本系统模型

复查的目的是确保系统的输入数据和输出数据符合实际。应该对需求分析阶段得出的数据流图认真复查,并且在必要时进行精化。不仅要确保数据流图给出了目标系统的正确的逻辑模型,而且应该使数据流图中每个处理都代表一个规模适中相对独立的子功能。

②复查并精化数据流图

a.目的

确保数据流图给出了目标系统的正确的逻辑模型,应该使数据流图中每个处理都代表一个规模适中相对独立的子功能。

b.实际操作

假设在需求分析阶段产生的数字仪表板系统的数据流图如图5-9所示。这个数据流图对于软件结构设计的第一次分割而言已经足够详细了,故不需要精化可进行下一个步骤。

图5-9 数字仪表板系统的数据流图

③确定数据流图具有变换特性还是事务特性

a.方法

第一,应该根据数据流图中占优势的属性,确定数据流的全局特性。

第二,还应该把具有和全局特性不同的特点的局部区域孤立出来,以后可以按照这些子数据流的特点精化根据全局特性得出的软件结构。

b.实际操作

从图5-9可以看出,数据沿着两条输入通路进入系统,然后沿着5条通路离开,没有明显的事务中心。因此可以认为这个信息流具有变换流的总特征。

④确定输入流和输出流的边界,从而孤立出变换中心

a.方法

输入流和输出流的边界和对它们的解释有关,即不同设计人员可能会在流内选取稍微不同的点作为边界的位置。

b.实际操作

对于汽车数字仪表板的例子,设计人员确定的流的边界如图5-10所示。

图5-10 具有边界的数据流图

⑤第一级分解

a.定义

软件结构代表对控制的自顶向下的分配,分解就是分配控制的过程。

b.方法

对于变换流的情况,数据流图被映射成一个特殊的软件结构,这个结构控制输入、变换和输出等信息处理过程。

图5-11 第一级分解的方法

图5-11说明了第一级分解的方法。位于软件结构最顶层的控制模块Cm协调下述从属的控制功能:

第一,输入信息处理控制模块Ca,协调对所有输入数据的接收。

第二,变换中心控制模块Ct,管理对内部形式的数据的所有操作。

第三,输出信息处理控制模块Ce,协调输出信息的产生过程。

c.实际操作

对于数字仪表板的例子,第一级分解得出的结构如图5-12所示。每个控制模块的名字表明了为它所控制的那些模块的功能。

图5-12 数字仪表板系统的第一级分解

⑥第二级分解

a.定义

第二级分解是把数据流图中的每个处理映射成软件结构中一个适当的模块。

b.方法

图5-13表示进行第二级分解的普遍途径。

图5-13 第二级分解的方法

第一,从变换中心的边界开始逆着输入通路向外移动,把输入通路中每个处理映射成软件结构中Ca控制下的一个低层模块;

第二,沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受模块Ce控制的一个低层模块;

第三,最后把变换中心内的每个处理映射成受Ct控制的一个模块。

c.实际操作

第一,对于数字仪表板系统的例子,第二级分解的结果分别用图5-14、图5-15和图5-16描绘。

图5-14 未经精化的输入结构

图5-15 未经精化的变换结构

图5-16 未经精化的输出结构

第二,应该为每个模块写一个简要说明,如下:

进出该模块的信息(接口描述);模块内部的信息;过程陈述,包括主要判定点及任务等;对约束和特殊特点的简短讨论。

⑦使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化。

a.目的

为了产生合理的分解,得到尽可能高的内聚、尽可能松散的耦合,更为了得到一个易于实现、易于测试和易于维护的软件结构,应该对初步分割得到的模块进行再分解或合并。

b.实际操作

数字仪表板的例子中,经过修改后的软件结构画在图5-17中。修改的步骤如下:

第一,输入结构中的模块“转换成rpm”和“收集sps”可以合并。

第二,模块“确定加速/减速”可以放在模块“计算mph”下面,以减少耦合。

第三,模块“加速/减速显示”可以相应地放在模块“显示mph”的下面。

图5-17 精化后的数字仪表板系统的软件结构

4.事务分析

(1)适用性

在数据流具有明显的事务特点时,即有一个明显的事务中心时,采用事务分析方法为宜。

(2)设计

事务分析的设计步骤和变换分析的设计步骤大部分类似,主要差别仅在于由数据流图到软件结构的映射方法不同,如图5-18所示。

图5-18 事务分析的映射方法

①事务流映射成的软件结构包括一个接收分支和一个发送分支。发送分支的结构包含一个调度模块,它控制下层的所有活动模块。映射接收分支结构的方法是从事务中心边界开始,把沿接收流通路的处理映射成模块。数据流图中的每个活动流通路都应该映射成与它的流特征相对应的结构。

②一般说来,如果数据流不具有显著的事务特点,最好使用变换分析;反之,如果具有明显的事务中心,则应该采用事务分析技术。但是,机械地遵循变换分析或事务分析的映射规则,很可能会得到一些不必要的控制模块,如果它们确实用处不大,那么可以而且应该把它们合并。反之,如果一个控制模块功能过分复杂,则应该分解为两个或多个控制模块,或者增加中间层次的控制模块。

5.设计优化

(1)设计优化时应遵循的原则:

①应该开发能够满足所有功能和性能要求,而且按照设计原理和启发式设计规则衡量是值得接收的软件。

②应该在设计的早期阶段尽量对软件结构进行精化。

③结构简单通常既表示设计风格优雅,又表明效率高。

④对于时间是决定性因素的应用场合,可能需要在详细设计阶段或在编写程序的过程中进行优化。

(2)可以采用以下几种方法对时间起决定性作用的软件进行优化。

①在不考虑时间因素的前提下开发并精化软件结构。

②在详细设计阶段选出最耗费时问的那些模块,仔细地设计它们的处理过程(算法),以求提高效率。

③使用高级程序设计语言编写程序。

④在软件中孤立出那些大量占用处理机资源的模块。

⑤必要时重新设计或用依赖于机器的语言重写上述大量占用资源的模块的代码,以求提高效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2092511.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型种草书籍——BERT基础教程:Transformer大模型实战,看完头皮发麻!

《BERT基础教程:Transformer大模型实战》 是一本专注于介绍自然语言处理(NLP)领域的先进技术——BERT(Bidirectional Encoder Representations from Transformers)及其应用的教程书籍。 以下是这本书的简要介绍&#…

C++:string类(1)

1.标准库中的string类 1.1 string类(了解) string类的文档介绍在使用string类时,必须包含#include头文件以及using namespace std; 1.2 auto和范围for auto关键字 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型…

gdb 教程

文章目录 GDB启动 GDB 的方法GDB 命令工具参考 GDB GDB是Linux下的调试工具,可以调试C、C、Go、java等语言 GDB提供了以下四个功能: 程序启动时,可以按照自定义的要求运行程序,如设置参数和环境变量可以让被调试的程序在所指定…

Netflix Feign:微服务HTTP调用如何简化?

Netflix Feign:微服务HTTP调用如何简化? 1、什么是Netflix Feign?2、Feign的优点3、示例4、总结 💖The Begin💖点点关注,收藏不迷路💖 1、什么是Netflix Feign? Feign是一个声明式的…

MFC工控项目实例之十添加系统测试对话框

承接专栏《MFC工控项目实例之九选择下拉菜单主界面文本框显示菜单名》 参考前期我的博客文章《MFC3d立体按钮制作》 这里只给出相关代码 1、在SysTest.h文件中添加代码 #include "ShadeButtonST.h" #include "BtnST.h" class CSysTest : public CDialog {…

OpenAI“草莓”模型及全能型与专业型AI的思考

一、OpenAI“草莓”模型的全能性及其未来趋势 近日,OpenAI预计在秋季推出的代号为“草莓”的新AI模型,展现了其在自然语言处理(NLP)和深度学习领域的又一重大突破。该模型不仅增强了推理能力,还提供了更为人性化的互动…

穿越Java世界的继承奇旅:从基类到子类的华丽蜕变

1.为什么要继承 2.什么是继承以及继承的方式 3.继承的一些语法 4.父类成员的访问 5.关键字super 6.关键字protected 7.关键字final 8.继承与组合 一:为什么要继承 ①代码重用:继承允许我们重用、扩展或修改父类的属性和方法,而无需重…

<Rust>egui学习之小部件(四):如何在窗口中添加滚动条Scroll部件?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第四篇博…

【C++ Primer Plus习题】7.10

问题: 解答: #include <iostream> using namespace std;double add(double a, double b) {return a b; }double mul(double a, double b) {return a * b; }double sub(double a, double b) {return a - b; }double div(double a, double b) {return a / b; }double cal…

[LLM]:大模型(Transformer)参数量分析

1. 前言2. 模型参数量 文章内容主要摘自&#xff1a;https://zhuanlan.zhihu.com/p/624740065 1. 前言 最近&#xff0c;OpenAI推出的ChatGPT展现出了卓越的性能&#xff0c;引发了大语言模型(Large Language Model, LLM)的研究热潮。大规模语言模型的“大”体现在两个方面&am…

Python编码系列—Python代码重构:提升代码质量

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

Leetcode面试经典150题-151.反转字符串中的单词

class Solution {public String reverseWords(String s) {/**先trim一下去掉前后的空格*/String str s.trim();/**转成字符数组 */char[] sArr str.toCharArray();/**先整体倒置*/int l 0;int r sArr.length - 1;reverse(sArr, l, r);/**然后每个单词中逆序 */int left 0;…

SAM 提示框和 Unet的语义分割的融合:自动驾驶车道线分割

1、前言 最近SAM 模型复现的多了&#xff0c;看了不少官方的源码&#xff0c;尝试下SAM和Unet的结合 SAM的提示分割&#xff0c;其实就是在分割的时候&#xff0c;为数据增加一个提示信息&#xff0c;可以是框&#xff0c;点&#xff0c;或者文本等等。这样大模型网络就可以根…

【Python】简单的爬虫抓取

效果&#xff1a;抓取某个学校网站的教授名录&#xff0c;并获取研究方向。 由于网站使用的都是明文&#xff0c;所以抓起来没什么难度&#xff0c;且平时访问量小&#xff0c;很值得用来练习。 代码如下&#xff0c;解释请见注释 import timeimport requests from bs4 impor…

RN开发问题

1、滚动项定位错误 ERROR Invariant Violation: scrollToIndex should be used in conjunction with getItemLayout or onScrollToIndexFailed, otherwise there is no way to know the location of offscreen indices or handle failures. 原因&#xff1a;已修复&#xff0c…

求一个使用C语言将重力加速度gx,gy,gz积分获取到速度的代码

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

完整指南:CNStream流处理多路并发框架适配到NVIDIA Jetson Orin (一) 依赖库编译、第三方库编译安装

目录 1 jetson-ffmpeg的编译安装与配置--用来做视频编码、视频解码 2 CV-CUDA库的编译安装与配置--用来做图像缩放、裁剪、色域转换 3 cuda cudnn TensorRT相关库的拷贝与配置 3.1将cuda cudnn TensorRT相关的头文件拷贝到工程中 3.2 将cuda cudnn TensorRT相关的库拷贝到…

docker实战基础一

一、docker安装 # step 1: 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2 # Step 2: 添加软件源信息 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # Step 3: 更新并安装 Doc…

FlowUs:强大图表功能与多维表结合,开启便捷办公新时代

在当今数字化办公的浪潮中&#xff0c;我们一直在寻找一款能够高效整合数据、清晰呈现信息的工具。而 FlowUs 以其强大的图表功能结合多维表的能力&#xff0c;为我们带来了前所未有的便捷体验。 一、多维表&#xff1a;数据管理的强大基石 FlowUs 的多维表功能就像是一个数据魔…

016_Save_the_picture_in_Matlab中保存图片

图片文件 Matlab核心功能包括出图&#xff0c;印刷质量的图片输出是Matlab核心竞争力之一&#xff0c;matplotlib疯狂追赶&#xff0c;但还是差距明显。出图的含义就是&#xff1a;打印或者导出图形窗体的内容&#xff0c;可供后续使用。在Matlab中&#xff0c;这个行为被定义…