2015年计算机三级信息管理考试要点
在明确了用户的需求以后,下一步的任务就是对未来的软件系统进行设计。软件设计通常可分为概要设计和详细设计。概要设计的任务是确定软件系统的结构,进行模块划分,确定每个模块的功能、接口以及模块间的调用关系。详细设计的任务是为每个模块设计实现的细节。此外,在概要设计阶段还应对全局数据结构进行设计,详细设计阶段还应对局部数据结构进行设计。有的设计方法不区分概要设计和详细设计,统称为软件设计。
人们在开发过程中,总结出许多软件设计的概念和原则,这些概念和原则对提高软件的设计质量有很大的帮助。
1.抽象
抽象是指忽视一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象是认识复杂问题的过程中人类使用的最有力的思维工具,它抽取出事物的本质特性而暂时不考虑它的细节。
软件工程中从软件定义到软件开发要经历多个阶段,在这个过程中每前进一步都可看作是对软件的抽象层次的一次细化。抽象的最低层次就是实现该软件的源程序代码。在进行模块化设计时可以有多个抽象层次,最高抽象层次的模块用概括的方式叙述问题的解法,较低抽象层次的模块是对较高的抽象层次模块对问题解决描述的细化。过程抽象和数据抽象是常用的两种主要抽象手段。
过程抽象是指任何一个完成明确功能的操作都可被使用者当作单个的实体看待,尽管这个操作实际上可能由一系列更低级的操作来完成。过程抽象常常也称为功能/子功能抽象。例如函数、子程序。
数据抽象定义了数据类型和施加于该类型的操作,并限定了对象值的范围,只能通过使用这些操作修改和观察这些数据,例如抽象数据类型。
2.模块化
模块化是指将一个待开发的软件分解成若干个小的简单的部分———模块,每个模块可独立地开发、测试,最后组装成完整的程序。这是一种复杂问题的“分而治之”的原则,模块化的目的是使程序的结构清晰,容易阅读,容易理解,容易测试,容易修改。
模块是指执行某一特定任务(也可以是实现某一特定的抽象数据类型)的数据结构和程序代码。一个模块有它的外部特征和内部特征。外部特征包括模块的接口(即它的输入/输出参数,引用的全局变量和它需调用的其他模块)和模块的功能,内部特征包括模块的局部数据和实现该模块的程序代码。调用一个模块只需知道它的外部特征,而不必了解其内部特征。
3.信息隐蔽
信息隐蔽是开发整体程序结构时使用的法则,即将每个程序的成分隐蔽或封装在一个单一的设计模块中,定义每一个模块时尽可能少地显露其内部的处理。
在设计时首先列出一些可能发生变化的因素,在划分模块时将一个可能发生变化的因素隐蔽在某个模块的内部,使其他模块与这个因素无关。在这个因素发生变化时,我们只需修改含有这个因素的模块,而与其他模块无关。
隐蔽的对象可以有:什么样的决策、可能修改的决策、数据结构的内部连接以及对它所做的操作细节、内部特征码、与计算机硬件有关的细节等。
信息隐蔽原则对提高软件的可修改性、可测试性和可移植性都有重要的作用。
4.模块独立
模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块之间的联系简单。衡量模块独立程序的度量标准有两个:耦合和内聚。耦合是指模块之间联系的紧密程度。耦合度越高则模块的独立性越差。内聚是指模块内部各元素之间联系的紧密程度。例如一个完成多个功能的模块的内聚度就比完成单一功能的模块的内聚度低。内聚度越低模块的独立性越差。因此,模块独立就是希望每个模块都是高内聚低耦合的。
(1)耦合
两个模块之间的耦合方式通常有如下7种,下面按它们的耦合度从低到高的次序依次作介绍。①非直接耦合:非直接耦合是指两个模块没有直接的联系,它们中的任一个都能不依赖于对方而独立地工作。
②数据耦合:数据耦合是指两个模块借助于参数表传递简单数据。
③标记耦合(stamp coupling):当一个数据结构的一部分(如记录的一部分)借助于模块接口被传递时就发生标记耦合。
④控制耦合:控制耦合指两个模块间传递的信息中包含用于控制模块内部逻辑的控制信息。⑤外部耦合:当模块与软件以外的环境有关时就发生外部耦合。例如,输入/输出把一个模块与特定的设备、格式、通信协议耦合在一起。
⑥公共耦合:多个模块引用一全局数据区的模式称为公共耦合。例如FORTRAN语言中的COMMON语句、C语言中的external数据类型、一个磁盘文件等都是全局数据区。⑦内容耦合:内容耦合指两上模块之间出现了下列情况之一:
·一个模块访问另一个模块的内部数据;
·一个模块不通过正常入口转到另一模块的内部;·两个模块有一部分程序代码重叠;
·一个模块有多个入口。
(2)内聚
模块的内聚种类通常可分成7种,下面按内聚度从低到高的次序依次作介绍。
①偶然内聚:如果一个模块完成一组任务,这组任务彼此间即使有关系,其关系也是很松散的,这个模块属于偶然内聚。
②逻辑内聚:如果一个模块完成逻辑上相关的一组任务,这个模块是逻辑内聚的。例如,产生与类型无关的全部输出的模块。
③瞬时内聚(temporal cohesion):如果一个模块所包含的任务必须在同一时间间隔内执行,这个模块属于瞬时内聚。例如初始化模块。
④过程内聚:如果一个模块的处理元素是相关的,而且必须按特定的次序执行,这个模块属于过程内聚。
⑤通信内聚:如果一个模块的所有处理元素集中在一个数据结构的区域上,该模块属于通信内聚。例如,一个模块中的所有处理元素使用同一输入数据。
⑥顺序内聚:如果一个模块的处理元素是相关的,而且必须顺序执行,这个模块属于顺序内聚。⑦功能内聚:如果一个模块完成一个单一的功能,模块中的各部分在此目标下协同工作,而且都是为完成这一功能而不可缺少的,那么这个模块是功能内聚的。
5.模块分解时应遵循的准则
(1)满足信息隐蔽原则。
(2)尽量使得模块的内聚度高,模块间的耦合度低。
(3)模块的大小适中(通常一个模块以50~100个语句行为适宜)。
(4)模块的调用深度不宜过大。一个模块A可以调用另一模块B,模块B还可调用模块C,称模块A直接调用模块B,模块A间接调用模块C,被间接调用的模块还可调其他模块,这样可形成一棵调用树,我们把以某个模块为根结点的调用树的深度称为该模块的调用深度。
(5)模块的扇入应尽量大,扇出不宜过大。一个模块的扇入是指直接调用该模块的上级模块个数。一个模块的扇出是指该模块直接调用的下级模块的个数。扇入大表示模块的复用程度高,扇出大表示模块的复杂度高。
(6)设计单入口和单出口的模块。
(7)模块的作用域应在控制域之内。模块的作用域是指受该模块内一个判定影响的所在模块的集合。模块的控制域是指该模块本身以及被该模块直接或间接调用的所有模块的集合。在设计时,作用域应是控制域的子集,作用域最好是做出判定的模块本身以及它的直属下级模块(直接调用的模块)。
(8)模块的功能应是可以预测的,功能可预测是指对相同的输入数据能产生相同的输出。