1、面向过程的软件设计方法,目录,软件设计的目标和任务 软件设计基础 模块独立性 结构化设计方法 数据设计 过程设计,数据设计侧重于数据结构的定义 系统结构设计定义软件系统各主要成份(构件)之间的关系 接口设计定义软件内部各成份之间、软件与其它协同系统之间及软件与用户之间的交互机制 过程设计,也叫构件设计,则是把结构成份转换成软件的过程性描述,软件设计的目标和任务,软件设计的目标和任务,分析模型设计模型 数据设计 架构设计 接口设计 过程设计,软件设计是软件开发过程中质量得以保证的关键步骤。使得软件的质量评价成为可能。 软件设计是后续开发步骤及软件维护工作的基础。如果没有设计,只能建立一个不稳定的系统结构,软件设计的目标和任务,软件设计任务,从工程管理的角度来看,软件设计分两步完成。 概要设计,将软件需求转化为数据结构和软件的系统结构,并建立接口 详细设计,即过程设计,通过对结构表示进行细化,得到软件的详细的数据结构和算法,软件设计任务,软件设计的目标,McGlanghlin给出了判断设计好坏的三条特征: 设计必须实现分析模型中描述的所有显式需求,必须满足用户希望的所有隐式需求 设计必须是
2、可读、可理解的,使得将来易于编程、易于测试、易于维护 设计应从实现角度出发,给出与数据、功能、行为相关的软件全貌,软件设计基础,抽象化 自顶向下,逐步细化 模块化 程序结构 信息隐蔽,抽象化,人类在认识复杂现象的过程中使用的最强有力的思维工具是抽象。 抽出事物的本质特性而暂时不考虑细节。 处理复杂系统的有效方法是用层次的方式构造和分析它。 软件系统进行模块设计时,有不同的抽象层次,抽象层次. 用问题所处环境的术语来描述这个软件: 该软件包括一个计算机绘图界面,向绘图员显示图形,以及一个数字化仪界面,用以代替绘图板和丁字尺。所有直线、折线、矩形、圆及曲线的描画、所有的几何计算、所有的剖面图和辅助视图都可以用这个CAD软件实现。,抽象化举例,抽象层次. 任务需求的描述。 CAD SOFTWARE TASKS user interaction task; 2-D drawing creation task; graphics display task; drawing file management task; end. 在这个抽象层次上,未给出“怎样做”的信息,不能直接实现。,抽象化举例,
3、抽象层次. 程序过程表示,以2-D (二维)绘图生成任务为例: PROCEDURE:2-D drawing creation REPEAT UNTIL (drawing creation task terminate) DO WHILE (digitizer interaction occurs) digitizer interface task; DETERMINE drawing request CASE; line: line drawing task; rectangle:rectangle drawing task; circle: circle drawing task; ,抽象化举例,自顶向下,逐步求精,逐步求精是人类解决复杂问题时采用的基本方法,也是许多软件工程技术的基础。 “为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。” 人类的认知过程遵守Miller法则:一个人在任何时候都只能把注意力集中在(72)个知识块上。 抽象与求精是一对互补的概念。 将软件的体系结构按自顶向下方式,对各个层次的过程细节和数据细节逐层细化,直到用程序设计语言的语句能够实现为止,从而最
4、后确立整个的软件设计。,模块化,软件系统的模块化是指整个软件被划分成若干单独命名和可编址的部分,称之为模块。 把问题子问题的分解与软件开发中的系统子系统或系统模块对应起来,就能够把一个大而复杂的软件系统划分成易于理解的比较单纯的模块结构 模块化方法的好处: 模块化设计降低了系统的复杂性,使得系统容易修改 推动了系统各个部分的并行开发,从而提高了软件的生产效率,C(x) 描述问题x复杂性,E(x) 定义解决问题x所需工作量。对于两个问题p1和p2: C(p1)C(p2) E(p1)E(p2) (13.1) C(p1p2) C(p1)C(p2) (13.2) E(p1p2) E(p1)E(p2) (13.3),模块化,程序结构,也叫控制层次,表明了程序各个部件(模块)的组织情况,是软件的过程表示 控制层次往往用程序的层次(树形或网状)结构来表示, 模块:模块用矩形框表示,并用模块的名字标记它。,结构图, 模块的调用关系和接口:模块之间用单向箭头联结,箭头从调用模块指向被调用模块,表示调用模块调用了被调用模块,结构图, 模块间的信息传递:当一个模块调用另一个模块时,调用模块把数据或控制信息传
5、送给被调用模块,以使被调用模块能够运行。而被调用模块在执行过程中又把它产生的数据或控制信息回送给调用模块,结构图, 在模块A的箭头尾部标以一个菱形符号,表示模块A有条件地调用另一个模块B。当一个在调用箭头尾部标以一个弧形符号,表示模块A反复调用模块C和模块D。,结构图,程序的系统结构图,程序结构,程序结构的深度:程序结构的层次数称为结构的深度。结构的深度在一定意义上反映了程序结构的规模和复杂程度。 程序结构的宽度:层次结构中同一层模块的最大模块个数称为结构的宽度。 模块的扇入和扇出:扇出表示一个模块直接调用(或控制)的其它模块数目。扇入则定义为调用(或控制)一个给定模块的模块个数。多扇出意味着需要控制和协调许多下属模块。而多扇入的模块通常是公用模块。,信息隐蔽,由 parnas 方法提倡的信息隐蔽是指,每个模块的实现细节对于其它模块来说是隐蔽的。也就是说,模块中所包含的信息(包括数据和过程)不允许其它不需要这些信息的模块使用。 更确切的说,应该为“细节隐蔽”,模块独立性, 是指软件系统中每个模块只涉及软件要求的具体的子功能, 而和其它模块的接口是简单的 例如, 若一个模块只具有单一的功
6、能且与其它模块没有太多的联系, 则称此模块具有模块独立性 一般采用两个准则度量模块独立性。即模块间耦合和模块内聚,模块的独立性,耦合是模块之间的互相连接的紧密程度的度量。 内聚是模块功能强度(一个模块内部各个元素彼此结合的紧密程度)的度量。 模块独立性比较强的模块应是高内聚、低耦合的模块。,模块的独立性,模块间的耦合,如果发生下列情形,两个模块之间就发生了内容耦合 (1) 一个模块直接访问另一个模块的内部数据; (2) 一个模块不通过正常入口转到另一模块内部; (3) 两个模块有一部分程序代码重迭; (4) 一个模块有多个入口。,内容耦合,若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。,公共耦合,一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。,外部耦合,如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。,控制耦合,如果一个模块访问另一个模块时,彼此之间是通过简单数据参数 (不是控制参数、公共
7、数据结构或外部变量) 来交换输入、输出信息的,则称这种耦合为数据耦合,数据耦合,如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。这种耦合的模块独立性最强。,非直接耦合,c,模块内聚,巧合内聚又称为偶然内聚。当模块内各部分之间没有联系,或者即使有联系,这种联系也很松散,则称这种模块为巧合内聚模块,它是内聚程度最低的模块。,巧合内聚,这种模块把几种相关的功能组合在一起,每次被调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能。,逻辑内聚,时间内聚又称为经典内聚。这种模块大多为多功能模块,但模块的各个功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行。例如初始化模块和终止模块。,时间内聚,如果一个模块执行一系列与产品要遵循的步骤顺序有关的操作,则该模块具有过程内聚。使用流程图做为工具设计程序时,把流程图中的某一部分划出组成模块,就得到过程内聚模块。,过程内聚,如果一个模块内各功能部分都使用了相同的输入数据,或者产生了相同的输出数据,则称之为通信内聚模块。 通常,通信内聚模块是通过数据流图来定义的。,通信内聚,一个模块中各个
8、部分都是完成某一具体功能必不可少的组成部分,或者说该模块中所有部分都是为了完成一项具体功能而协同工作,紧密联系,不可分割的。则称该模块为功能内聚模块。,功能内聚,这种模块完成多个功能,各个功能都在同一数据结构上操作,每一项功能有一个唯一的入口点。这个模块将根据不同的要求,确定该执行哪一个功能。,信息内聚,信息内聚模块可以看成是多个功能内聚模块的组合,并且达到信息的隐蔽。即把某个数据结构、资源或设备隐蔽在一个模块内,不为别的模块所知晓。,信息内聚,结构化设计方法,三类软件设计方法: 第一类是根据系统的数据流进行设计,称为面向操作的设计或者过程驱动的设计,结构化设计。 第二类是根据系统的数据结构进行设计,称为面向数据的设计或者数据驱动的设计,如Jackson系统开发方法和数据结构化系统开发(DSSD)方法 第三类设计方法即面向对象的设计,结构化设计方法,首先研究、分析和审查数据流图。 然后根据数据流图决定问题的类型。数据处理问题典型的类型有两种:变换型和事务型。针对两种不同的类型分别进行分析处理。 由数据流图推导出系统的初始程序结构图。 利用一些启发式原则来改进系统的初始结构图,直到得到符
9、合要求的结构图为止。,在系统结构图中的模块,传入模块 从下属模块取得数据,经过某些处理,再将其传送给上级模块。传送的数据流叫逻辑输入数据流。 传出模块 从上级模块获得数据,进行某些处理,再将其传送给下属模块。传送的数据流叫逻辑输出数据流。 变换模块 它从上级模块取得数据,进行特定的处理,转换成其它形式,再传送回上级模块。加工的数据流叫变换数据流。 协调模块 对所有下属模块进行协调和管理的模块。,变换型系统结构图,变换型数据处理问题的工作过程大致分为三步,即取得数据,变换数据和给出数据。 变换型系统结构图由输入、中心变换和输出等三部分组成。,事务型系统结构图,它接受一项请求,根据请求的特点和性质,选择分派一个适当的处理单元,然后给出结果。 在事务型系统结构图中,事务中心模块按所接受的事务的类型,通过调度模块选择某一事务处理模块执行。 各事务处理模块并列,每个事务处理模块可能要调用若干个操作模块,而操作模块又可能调用若干个细节模块。,变换分析,变换分析方法由以下四步组成: 重画数据流图; 区分有效(逻辑)输入、有效(逻辑)输出和中心变换部分; 进行一级分解,设计上层模块; 进行二级分解,设计输入、输出和中心变换部分的中、下层模块。,在选择模块设计的次序时,必须对一个模块的全部直接下属模块都设计完成之后,才能转向另一个模块的下层模块的设计。 在设计下层模块时,应考虑模块的耦合和内聚问题,以提高初始结构图的质量。 使用“黑箱”技术: 在设计当前模块时,先把这个模块的所有下层模块定义成“黑箱”,暂时不考虑其内部结构和实现。在这一步定义好的“黑箱”,在下一步就可以对它们进行设计和加工。这样,又会导致更多的“黑箱”。最后,全部“黑箱”的内容和结构应完全被确定。,变换分析,在模块划分时,一个模块的直接下属模块一般在5个左右。如果直接下属模块超过10个,可设立中间层次。 如果出现了以下情况,就停止模块的功能分解: 当模块不能再细分为明显的子任务时; 当分解成用户提供的模块或程序库的子程序时; 当模块的界面是输入输出设备传送的信息时; 当模块不宜再分解得过小时。
《sw04 面向过程的软件设计》由会员luoxia****01803分享,可在线阅读,更多相关《sw04 面向过程的软件设计》请在金锄头文库上搜索。