《软件设计的任务.ppt》由会员分享,可在线阅读,更多相关《软件设计的任务.ppt(108页珍藏版)》请在三一文库上搜索。
1、软件设计的任务,把需求变换成软件表示的过程 数据结构 软件的系统结构,设计过程,制定规范 总体设计 处理设计 数据结构设计 可靠性设计 编写文档 评审,设计是后续开发步骤及软件维护工作的基础。如果没有设计,只能建立一个不稳定的系统结构,制定规范,确认用户要求能否实现 选择合适的设计方法 规定设计文档的编制标准 规定编码的信息形式,与硬件的接口规约,2. 软件系统结构的总体设计,基于功能层次结构建立系统。 将系统按功能划分成模块的层次结构 确定每个模块的功能 确定模块间的调用关系 确定模块间的接口 评估模块划分的质量,导出模块结构的规则,3. 处理设计,确定为实现系统的功能需求所必需的算法,评估
2、算法的性能 确定为满足系统的性能需求所必需的算法和模块间的控制方式 确定外部信号的接收发送形式,4. 数据结构设计,确定软件涉及的文件系统的结构以及数据库的模式、子模式,进行数据完整性和安全性的设计 确定输入,输出文件的详细的数据结构 结合算法设计,确定算法所必需的逻辑数据结构及其操作 确定对逻辑数据结构所必需的那些操作的程序模块(软件包),若需要与操作系统或调度程序接口所必须的控制表等数据时,确定其详细的数据结构和使用规则,5.可靠性设计,可靠性设计也叫做质量设计 在运行过程中,为了适应环境的变化和用户新的要求,需经常对软件进行改造和修正。在软件开发的一开始就要确定软件可靠性和其它质量指标,
3、考虑相应措施,以使得软件易于修改和易于维护。,6.编写系统设计阶段的文档,概要设计阶段完成时应编写以下文档: 系统设计说明书 数据库设计说明书 用户手册 制定初步的测试计划,7.概要设计评审,可追溯性:确认该设计是否复盖了所有已确定的软件需求,软件每一成份是否可追溯到某一项需求 接口:确认该软件的内部接口与外部接口是否已经明确定义。模块是否满足高内聚和低耦合的要求。模块作用范围是否在其控制范围之内 风险:确认该设计在现有技术条件下和预算范围内是否能按时实现,实用性:确认该设计对于需求的解决方案是否实用 技术清晰度:确认该设计是否以一种易于翻译成代码的形式表达 可维护性:确认该设计是否考虑了方便
4、未来的维护 质量:确认该设计是否表现出良好的质量特征,各种选择方案:看是否考虑过其它方案,比较各种选择方案的标准是什么 限制:评估对该软件的限制是否现实,是否与需求一致 其它具体问题:对于文档、可测试性、设计过程等进行评估,自顶向下,逐步细化,将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最后确立整个的体系结构。,软件设计的原则,软件结构,软件结构包括两部分。程序模块的层次结构和数据的结构 软件的体系结构通过一个划分过程来完成。该划分过程从需求分析确立的目标系统的模型出发,对整个问题进行分割,使其每个部分用一个或几个软件成份加
5、以解决,整个问题就解决了,(2) 举例:,程序结构,程序结构表明了程序各个部件(模块)的组织情况,是软件的过程表示。,结构图,结构图反映程序中模块之间的层次调用关系和联系:它以特定的符号表示模块、模块间的调用关系和模块间信息的传递, 模块:模块用矩形框表示,并用模块的名字标记它。, 模块的调用关系和接口:模块之间用单向箭头联结,箭头从调用模块指向被调用模块。, 模块间的信息传递:当一个模块调用另一个模块时,调用模块把数据或控制信息传送给被调用模块,以使被调用模块能够运行。而被调用模块在执行过程中又把它产生的数据或控制信息回送给调用模块, 在模块A的箭头尾部标以一个菱形符号,表示模块A有条件地调
6、用另一个模块B。当一个在调用箭头尾部标以一个弧形符号,表示模块A反复调用模块C和模块D。,程序的系统结构图,模块化,软件系统的模块化是指整个软件被划分成若干单独命名和可编址的部分,称之为模块。这些模块可以被组装起来以满足整个问题的需求。 把问题子问题的分解与软件开发中的系统子系统或系统模块对应起来,就能够把一个大而复杂的软件系统划分成易于理解的比较单纯的模块结构。,抽象化,软件系统进行模块设计时,可有不同的抽象层次。 在最高的抽象层次上,可以使用问题所处环境的语言概括地描述问题的解法。 在较低的抽象层次上,则采用过程化的方法。,(1) 过程的抽象 在软件工程中,从系统定义到实现,每进展一步都可
7、以看做是对软件解决方法的抽象化过程的一次细化。 在软件需求分析阶段,用“问题所处环境的为大家所熟悉的术语”来描述软件的解决方法。 在从概要设计到详细设计的过程中,抽象化的层次逐次降低。当产生源程序时到达最低抽象层次。,例: 开发一个CAD软件的三层抽象,抽象层次. 用问题所处环境的术语来描述这个软件: 该软件包括一个计算机绘图界面,向绘图员显示图形,以及一个数字化仪界面,用以代替绘图板和丁字尺。所有直线、折线、矩形、圆及曲线的描画、所有的几何计算、所有的剖面图和辅助视图都可以用这个CAD软件实现。,抽象层次. 任务需求的描述。 CAD SOFTWARE TASKS user interacti
8、on task; 2-D drawing creation task; graphics display task; drawing file management task; end. 在这个抽象层次上,未给出“怎样做”的信息,不能直接实现。,抽象层次. 程序过程表示。以2-D (二维)绘图生成任务为例: PROCEDURE:2-D drawing creation REPEAT UNTIL (drawing creation task terminates) DO WHILE (digitizer interaction occurs) digitizer interface task;
9、DETERMINE drawing request CASE; line: line drawing task; rectangle:rectangle drawing task; circle: circle drawing task; ,(2) 数据抽象 在不同层次上描述数据对象的细节,定义与该数据对象相关的操作。 例如,在CAD软件中,定义一个叫做drawing的数据对象。可将drawing规定为一个抽象数据类型,定义它的内部细节为:,TYPE drawing IS STRUCTURE DEFIND number IS STRING LENGTH(12); geometry DEFIND
10、 notes IS STRING LENGTH(256); BOM DEFIND END drawing TYPE;,数据抽象drawing本身由另外一些数据抽象,如geometry、BOM (bill of materials) 构成 定义drawing的抽象数据类型之后,可引用它来定义其它数据对象,而不必涉及drawing的内部细节 例如,定义: blue-print IS INSTANCE OF drawing; 或 schematic IS INSTANCE OF drawing;,信息隐蔽,由 parnas 方法提倡的信息隐蔽是指,每个模块的实现细节对于其它模块来说是隐蔽的。也就是说
11、,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。,模块的独立性,模块(Module) “模块”,又称“组件”。它一般具有如下三个基本属性: 功能:描述该模块实现什么功能 逻辑:描述模块内部怎么做 状态:该模块使用时的环境和条件,在描述一个模块时,还必须按模块的外部特性与内部特性分别描述 模块的外部特性 模块的模块名、参数表、其中的输入参数和输出参数,以及给程序以至整个系统造成的影响 模块的内部特性 完成其功能的程序代码和仅供该模块内部使用的数据,模块独立性 模块独立性, 是指软件系统中每个模块只涉及软件要求的具体的子功能, 而和软件系统中其它的模块的接口是简单的 例如
12、, 若一个模块只具有单一的功能且与其它模块没有太多的联系, 则称此模块具有模块独立性 一般采用两个准则度量模块独立性。即模块间耦合和模块内聚,耦合是模块之间的互相连接的紧密程度的度量。 内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。 模块独立性比较强的模块应是高内聚低耦合的模块。,模块间的耦合,c,模块内聚,软件体系结构,软件设计的一个目标是建立软件的体系结构表示。将这个表示当作一个框架,从事更详细的设计活动。,系统结构,体系结构设计的第一步是将系统分解为 一系列相互作用的子系统。 在最抽象层次,系统可视为一个块图。图中每个盒子表示一个子系统。 每个盒子内的盒子表明子系统
13、本身还可分解为子系统。 箭头表示一个子系统向另一子系统传送数据或控制。,组装机器人控制系统的块图,视觉系统,对象识 别系统,手臂控制器,机械抓控制器,组装选 择系统,组装系统,传送带控制器,结构化设计方法,首先研究、分析和审查数据流图。 从软件的需求规格说明中弄清数据流加工的过程,对于发现的问题及时解决。 然后根据数据流图决定问题的类型。数据处理问题典型的类型有两种:变换型和事务型。针对两种不同的类型分别进行分析处理。,由数据流图推导出系统的初始结构图。 利用一些启发式原则来改进系统的初始结构图,直到得到符合要求的结构图为止。 修改和补充数据词典。 制定测试计划。,在系统结构图中的模块,传入模
14、块 从下属模块取得数据,经过某些处理,再将其传送给上级模块。它传送的数据流叫做逻辑输入数据流。 传出模块 从上级模块获得数据,进行某些处理,再将其传送给下属模块。它传送的数据流叫做逻辑输出数据流。,变换模块 它从上级模块取得数据,进行特定的处理,转换成其它形式,再传送回上级模块。它加工的数据流叫做变换数据流。 协调模块 对所有下属模块进行协调和管理的模块。,变换型系统结构图,变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。 相应于取得数据、变换数据、给出数据,变换型系统结构图由输入、中心变换和输出等三部分组成。,变换分析,变换分析方法由以下四步组成: 重画数据流图;
15、区分有效(逻辑)输入、有效(逻辑)输出和中心变换部分; 进行一级分解,设计上层模块; 进行二级分解,设计输入、输出和中心变换部分的中、下层模块。, 在选择模块设计的次序时,必须对一个模块的全部直接下属模块都设计完成 之后,才 能转向另 一个模块 的下层模 块的设计。,设计原则, 在设计下层模块时,应考虑模块的耦合和内聚问题,以提高初始结构图的质量。 使用“黑箱”技术: 在设计当前模块时,先把这个模块的所有下层模块定义成“黑箱”,在设计中利用它们时,暂时不考虑其内部结构和实现。在这一步定义好的“黑箱”,在下一步就可以对它们进行设计和加工。这样,又会导致更多的“黑箱”。最后,全部“黑箱”的内容和结
16、构应完全被确定。, 在模块划分时,一个模块的直接下属模块一般在5个左右。如果直接下属模块超过10个,可设立中间层次。 如果出现了以下情况,就停止模块的功能分解: 当模块不能再细分为明显的子任务时; 当分解成用户提供的模块或程序库的子程序时; 当模块的界面是输入输出设备传送的信息时; 当模块不宜再分解得过小时。,事务流 基本系统模型意味着变换流,因此,原则上所有信息流都可以归结为这一类。但是,当数据流图具有和图类似的形状时,这种数据流是“以事务为中心的”,也就是说,数据沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行。这类数据流应该划为一类特殊的数据流,称为事
17、务流。图中的处理T称为事务中心,它完成下述任务: (1)接收输入数据(输入数据又称为事务) (2)分析每个事务以确定它的类型; (3)根据事务类型选取一条活动通路。,图 事务流,事务分析,在很多软件应用中,存在某种作业数据流,它可以引发一个或多个处理,这些处理能够完成该作业要求的功能。这种数据流就叫做事务。 与变换分析一样,事务分析也是从分析数据流图开始,自顶向下,逐步分解,建立系统到结构图。,事务型系统结构图,它接受一项事务,根据事务处理的特点和性质,选择分派一个适当的处理单元,然后给出结果。 在事务型系统结构图中,事务中心模块按所接受的事务的类型,选择某一事务处理模块执行。各事务处理模块并
18、列。每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。,事务分析过程, 识别事务源 利用数据流图和数据词典,从问题定义和需求分析的结果中,找出各种需要处理的事务。通常,事务来自物理输入装置。有时,设计人员还必须区别系统的输入、中心加工和输出中产生的事务。, 规定适当的事务型结构 在确定了该数据流图具有事务型特征之后,根据模块划分理论,建立适当的事务型结构。 识别各种事务和它们定义的操作。 从问题定义和需求分析中找出的事务及其操作所必需的全部信息,对于系统内部产生的事务,必须仔细地定义它们的操作。, 注意利用公用模块 在事务分析的过程中,如果不同事务的一些中间模块可由
19、具有类似的语法和语义的若干个低层模块组成,则可以把这些低层模块构造成公用模块。 对每一事务,或对联系密切的一组事务,建立一个事务处理模块; 如果发现在系统中有类似的事务,可以把它们组成一个事务处理模块。, 对事务处理模块规定它们全部的下层操作模块 对操作模块规定它们的全部细节模块 变换分析是软件系统结构设计的主要方法。一般,一个大型的软件系统是变换型结构和事务型结构的混合结构。所以,我们通常利用以变换分析为主,事务分析为辅的方式进行软件结构设计。,设计过程 图 说明了使用面向数据流方法逐步设计的过程。,图 面向数据流方法的设计过程,假设的仪表板将完成下述功能: 通过模-数转换实现传感器和微处理
20、机接口; 在发光二极管面板上显示数据; 指示每小时英里数(mileh),行驶的里程,每加仑油行驶的英里数(mileGal)等等; 指示加速或减速; 超速警告:如果车速超过55mileh,则发出超速警告铃声。 在软件需求分析阶段应该对上述每条要求以及系统的其他特点进行全面的分析评价,建立起必要的文档资料,特别是数据流图。,实例分析,设计步骤 第1步 复查基本系统模型。 复查的目的是确保系统的输入数据和输出数据符合实际。 第2步 复查并精化数据流图。,数字仪表板系统的数据流图,假设在需求分析阶段产生的数字仪表板系统的数据流图如图所示。,这个数据流图对于软件结构设计的“第一次分割”而言已经足够详细了
21、,因此不需要精化就可以进行下一个设计步骤。,第3步 分析确定数据流的类型。 一般地说,一个系统中的所有信息流都可以认为是变换流,但是,当遇到有明显事务特性的信息流时,建议采用事务分析方法进行设计。在这一步设计人员应该根据数据流图中占优势的属性,确定数据流的全局特性。此外还应该把具有和全局特性不同的特点的局部区域孤立出来,以后可以按照这些子数据流的特点精化根据全局特性得出的软件结构。 从图可以看出,数据沿着两条输入通路进入系统,然后沿着五条通路离开,没有明显的事务中心。因此可以认为这个信息流具有变换流的总特征。,第4步 确定输入流和输出流的边界,从而孤立出变换中心。,对于汽车数字仪表板的例子,设
22、计人员确定的流的边界如图所示,图 具有边界的数据流图,第5步 完成“第一级分解”。 软件结构代表对控制的自顶向下的分配,所谓分解就是分配控制的过程。 对于变换流的情况,数据流图被映射成一个特殊的软件结构,这个结构控制输入、变换和输出等信息处理过程。图说明了第一级分解的方法。位于软件结构最顶层的控制模块Cm协调下述从属的控制功能:,图 第一级分解的方法, 输入信息处理控制模块Ca,协调对所有输入数据的接收; 变换中心控制模块Ct,管理对内部形式的数据的所有操作; 输出信息处理控制模块Ce,协调输出信息的产生过程。,虽然图意味着一个三叉的控制结构,但是,对一个大型系统中的复杂数据流可以用两个或多个
23、模块完成上述一个模块的控制功能。应该在能够完成控制功能并且保持好的耦合和内聚特性的前提下,尽量使第一级控制中的模块数目取最小值。 对于数字仪表板的例子,第一级分解得出的结构如图所示。每个控制模块的名字表明了为它所控制的那些模块的功能。,图 数字仪表板系统的第一级分解,第6步 完成“第二级分解”。 所谓第二级分解就是把数据流图中的每个处理映射成软件结构中一个适当的模块。完成第二级分解的方法是,从变换中心的边界开始沿着输入通路向外移动,把输入通路中每个处理映射成软件结构中Ca控制下的一个低层模块;然后沿输出通路向外移动,把输出通路中每个处理映射成直接或间接受模块Ce控制的一个低层模块;最后把变换中
24、心内的每个处理映射成受Ct控制的一个模块。图3表示进行第二级分解的普遍途径。,图 第二级分解的方法,虽然图描绘了在数据流图中的处理和软件结构中的模块之间的一对一的映射关系,但是,不同的映射经常出现。应该根据实际情况以及“好”设计的标准,进行实际的第二级分解。,对于数字仪表板系统的例子,第二级分解的结果分别用图16,17和18描绘。,图16 未经精化的输入结构,图17 未经精化的变换结构,图18 未经精化的输出结构,这三张图表示对软件结构的初步设计结果。虽然图中每个模块的名字表明了它的基本功能,但是仍然应该为每个模块写一个简要说明,描述: 进出该模块的信息(接口描述); 模块内部的信息; 过程陈
25、述,包括主要判定点及任务等; 对约束和特殊特点的简短讨论。 这些描述是第一代的设计规格说明,在这个设计时期进一步的精化和补充是经常发生的。,第7步 使用设计度量和启发式规则对第一次分割得到的软件结构进一步精化。 对第一次分割得到的软件结构,总可以根据模块独立原理进行精化。为了产生合理的分解,得到尽可能高的内聚、尽可能松散的耦合,最重要的是,为了得到一个易于实现、易于测试和易于维护的软件结构,应该对初步分割得到的模块进行再分解或合并。,具体到数字仪表板的例子,对于从前面的设计步骤得到的软件结构,还可以做许多修改。下面是某些可能的修改: 输入结构中的模块“转换成rmin”和“收集Signals”可
26、以合并; 模块“确定加速减速”可以放在模块“计算mileh”下面,以减少耦合; 模块“加速减速显示”可以相应地放在模块“显示mileh”的下面。,图 精化后的数字仪表板系统的软件结构,经过上述修改后的软件结构如图所示。,上述七个设计步骤的目的是,开发出软件的整体表示。也就是说,一旦确定了软件结构就可以把它作为一个整体来复查,从而能够评价和精化软件结构。在这个时期进行修改只需要很少的附加工作,但是却能够对软件的质量特别是软件的可维护性产生深远的影响。 思考上述设计途径和“写程序”的差别。如果程序代码是对软件的惟一描述,那么软件开发人员将很难站在全局的高度来评价和精化软件,而且事实上也不能做到“既
27、见树木又见森林”。,面向对象的设计方法,面向对象=对象+类+继承+通信 面向对象的特性 模块化、信息隐蔽、数据抽象 继承性,面向对象软件设计模型,对象模型 功能模型 动态模型,对象模型,描述系统的静态结构 可以看作扩充的E-R图 包括系统的类、对象、以及其属性、类与对象之间的关系,动态模型,描述时序、改变的状态 着重于控制逻辑 包括状态图、事件追踪图,状态图,描述每一个类对象的动态行为,1. 书的状态图,2. 借阅凭证的状态图,事件,事件表示在某一特定的时间或空间出现的能够引发状态改变的一种运动变化。 事件是一个激励的出现,它定义一个触发以触发对象改变其状态,任何影响对象的事物都可以是事件。,
28、事件追踪图,完成系统某个功能的事件序列,模型-视图-控制器框架,许多交互和界面系统构成的基础 实现了数据层与表示层的分离 MFC基础类 作为一种开发模型用于分布式应用系统的设计与分析中。,模型部件,处理问题逻辑在独立于外在显示内容和形式情况下的内在抽象,封装了问题的核心数据、逻辑、功能的计算关系,独立于界面表示和I/O操作,视图部件,把模型数据、逻辑关系、状态信息、特定形式展示给用户,从模型获得信息,对相同的信息可以有多个不同的显示形式或视图,控制器部件,处理用户与软件的交互 确保界面与模型的对应关系 使模型、视图 协调工作,MVC的实现,类设计的方针,模块化 抽象 信息隐蔽 低耦合 高内聚
29、可重用 消息限制,实例计数器,实例计数器,面向对象设计的过程,(1)首先进行系统架构设计,使系统具有良好的稳定性、开放性和可扩充性 (2)如果系统复杂,应将系统划分为若干个子系统 (3)给系统分配处理机和任务 (4)根据数据结构、文件和数据库选择实现数据存储的基本策略 (5)标识全局资源和确定控制访问这些资源的机制 (6)选择实现软件控制方法 (7)考虑边界条件 (8)建立折衷的优先权,系统设计,逻辑体系架构设计 层次模式分析 (1)分层模式 表示层:图形用户界面、窗口等。 应用逻辑层:管理业务过程的任务和规则。 对象存储层:持久化存储机制,例如,文件系统、数据库等。,设计要求,层与层之间的耦合应尽可能地松散; 级别相同、职责类似的元素应该被组织到同一层中; 复杂的模块应被继续分解为粒度更细的层或子系统; 应尽量将可能发生变化的元素封装到一层中; 每一层应当只调用下一层提供的功能服务,而不能跨层调用; 一层绝不能使用上一层提供的功能服务,即不能在层与层之间造成双向依赖。,(3)避免循环依赖,子系统划分,设计准则: 子系统应具有良好的接口,通过接口和系统的其他部分通信; 除了少数的“通信类”外,子系统中的类应只和该子系统中的其他类协作; 子系统的数量不宜太多; 可以在子系统内部再次划分,以降低复杂度。,
链接地址:https://www.31doc.com/p-2923699.html