免费智能真题库 > 历年试卷 > 程序员 > 2009年下半年 程序员 上午试卷 综合知识
  第54题      
  知识点:   块独立性   模块独立   模块独立性   耦合   软件设计   数据结构
  关键词:   模块   耦合   软件设计   数据结构   数据        章/节:   系统分析和设计基础知识       

 
衡量软件设计块独立性的一个标准是耦合性,其中两个模块之间传递数据结构的情况属于(54)。
 
 
  A.  数据耦合
 
  B.  标记耦合
 
  C.  内容耦合
 
  D.  公共耦合
 
 
 

 
  第48题    2011年下半年  
   28%
在面向对象开发方法中,(48)是一种信息隐蔽技术,目的是使对象的使用者和生产者分离。
  第44题    2011年下半年  
   38%
在面向对象方法中,(44)是一种概念、抽象或具有状态、行为和标识的事物。
  第49题    2018年下半年  
   48%
一组无逻辑关系的语句在程序中多处出现,为了节省存储空间,把这些语句放在一个模块中,该模块的内聚是( )。
   知识点讲解    
   · 块独立性    · 模块独立    · 模块独立性    · 耦合    · 软件设计    · 数据结构
 
       块独立性
        块独立性要求每个模块要完成独立的子功能与其他模块的联系少而接口简单。衡量独立性的标准有耦合性和内聚性。
        耦合性也称为块间联系,按耦合性从低到高的顺序,模块的耦合性有:无直接耦合、数据耦合、标记耦合、控制耦合、公共耦合和内容耦合。内聚性指的是块内联系,按内聚性从低到高的顺序,模块的内聚性有:偶然内聚、逻辑内聚、时间内聚、通信内聚、顺序内聚和功能内聚。
 
       模块独立
        模块独立是指模块只完成系统要求的独立的子功能,并且与其他模块的接口简单,符合信息隐蔽和信息局部化原则,模块间关联和依赖程度尽可能小。衡量模块独立性的标准是耦合度和内聚度。内聚度是衡量同一个模块内部的各个元素彼此结合的紧密程度;耦合度是衡量不同模块彼此间相互依赖的紧密程度。
        (1)内聚。内聚是一个模块内部各个元素彼此结合的紧密程度的度量。一个内聚程度高的模块(在理想情况下)应当只做一件事。一般模块的内聚性分为7种类型,如下图所示。
        
        内聚的种类
        .偶然内聚(巧合内聚)。指一个模块内的各处理元素之间没有任何联系。
        .逻辑内聚。指模块内执行若干个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
        .时间内聚。把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。
        .过程内聚。指一个模块完成多个任务,这些任务必须按指定的过程执行。
        .通信内聚。指模块内所有处理元素都在同一个数据结构上操作,或者指各处理使用相同的输入数据或者产生相同的输出数据。
        .顺序内聚。指一个模块中各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能元素的输入。
        .功能内聚。这是最强的内聚,指模块内所有元素共同作用完成一个功能,缺一不可。
        (2)耦合。耦合是模块之间的相对独立性(互相连接的紧密程度)的度量。耦合取决于各个模块之间接口的复杂程度、调用模块的方式以及通过接口的信息类型等。一般模块之间可能的耦合方式有7种类型,如下图所示。
        
        耦合的种类
        .无直接耦合。指两个模块之间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。因此,模块间耦合性最弱,模块独立性最高。
        .数据耦合。指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递。
        .标记耦合。指两个模块之间传递的是数据结构。
        .控制耦合。指一个模块调用另一个模块时,传递的是控制变量,被调用模块通过该控制变量的值有选择地执行模块内某一功能。因此,被调用模块内应具有多个功能,哪个功能起作用受调用模块控制。
        .外部耦合。模块间通过软件之外的环境联结(如I/O将模块耦合到特定的设备、格式、通信协议上)时,称为外部耦合。
        .公共耦合。指通过一个公共数据环境相互作用的那些模块间的耦合。
        .内容耦合。当一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部,这种模块之间的耦合为内容耦合。
 
       模块独立性
        (1)模块化。
        模块化是将系统化分为若干模块的工作。模块化设计可以使整个系统设计简单,结构清晰,可维护性增强。模块化设计的目标是:每个模块完成一个相对独立的特定功能;模块之间的结构简单。简而言之就是要保证模块之间的独立性,提高每个模块的独立程度。
        (2)模块独立性的度量。
        功能独立而且和其他模块之间没有过多相互作用和信息传递的模块被称为独立的模块。模块的独立程度可有两个定性标准度量:聚合(cohesion)和耦合(coupling)。聚合衡量模块内部各元素结合的紧密程度。耦合度量不同模块间互相依赖的程度。
        .聚合,聚合度量模块内部各元素的关系,即其紧凑程度,表现在模块内部各元素为了执行处理功能而组合在一起的程度。模块的聚合有7种不同的类型,其中前三种聚合属于弱聚合。
        .偶然聚合,如果模块所要完成的动作之间没有任何关系,或者仅仅是一种非常松散的关系,我们就称之为偶然聚合。例如,设计模块A、B、C均具有相同的部分代码α,则把α抽出作为一个单独的公用模块,如下图所示,这种聚合便被称为偶然聚合。
        
        偶然聚合
        .逻辑聚合,如果一个模块内部的各个组成部分在逻辑上具有相似的处理动作,但是功能上、用途上却彼此无关,则被称为逻辑聚合。
        .时间聚合,时间聚合又称为经典内聚。如果一个模块内部的各个组成部分所包含的处理动作必须在同一时间内执行,则被称为时间聚合。
        .过程聚合,模块内部各个组成部分所要完成的动作虽然彼此间没什么关系,但是必须以特定的次序(控制流)执行,这种情况属于过程聚合。
        .通信聚合,如果一个模块的各个组成部分所完成的动作都使用了同一个输入数据或产生同一输出数据,则被称为通信聚合。
        .顺序聚合,对于一个模块内部的各个组成部分,如果前一部分处理动作的最后输出是后一部分处理动作的输入,则被称为顺序聚合。例如,模块A由两部分组成,一部分为编辑,另一部分为输出。编辑部分将其输出数据作为输出部分的输入,模块A即为顺序聚合模块。如下图所示。
        
        顺序聚合
        .功能聚合,如果一个模块内部各个组成部分全部属于一个整体,并执行同一功能,且各部分对实现该功能都必不可少,则称该模块为功能聚合模块。
        将以上各种类型的模块聚合方式从耦合程度、可修改性、可读性和通用性4个角度进行一下比较,可以得到下表。
        
        聚合特性比较
        在进行模块设计中,应当尽可能提高模块的聚合程度,使每个模块执行单一的功能,以降低模块间的联系,争取获得较高的模块独立性。尤其应该追求模块的功能聚合,如果可能,要将非功能性聚合的模块转化为功能聚合的模块。
        .耦合,耦合用于度量系统内不同模块之间的互联程度。耦合强弱取决于模块间连接形式及接口的复杂程度。模块之间的耦合程度直接影响系统的可读性、可维护性及可靠性。在系统设计中应改进可能追求松散耦合的系统,因为模块连接越简单,错误传播的可能性就会越大,而且在这样的系统中测试、维护任何一个模块并不需要对其他模块有很多了解。模块之间的连接形式有数据耦合、控制耦合、公共耦合和内容耦合4种类型。
        .数据耦合,如果两个模块彼此间通过数据参数(不是控制参数、共公数据结构或外部变量)交换信息,那么这种耦合就是数据耦合。例如,A模块向子模块A1、 A2传递的是数据信息,构成了数据耦合,如下图所示。
        
        数据耦合
        .控制耦合,如果两个模块彼此间传递的信息中有控制信息,那么,这种耦合被称为控制耦合。控制耦合与数据耦合很相似,只是传递参数中一个仅有数据,另一个还包含了控制信息。控制耦合可以通过适当的方式加以避免,如模块的再分解。例如,模块A与子模块A1、A2之间传递的既有数据信息又有控制信息则构成了控制耦合,如下图所示。
        
        控制耦合
        .公共耦合,若两个模块之间通过一个公共的数据区域传递信息,则被称为公共耦合或公共数据域耦合。公共数据域实际上就是多个模块公用数据的区域。公共耦合是一种不好的连接形式,尤其当一个公共数据区域被多个模块共同使用时,模块数越多,则其耦合的复杂度越大。这会给数据的保护、维护等带来很大的困难。例如,模块A、A2.1、Y1共用公共数据区内的元素,尽管A与Y1没有联系,但是它们之间存在着公共耦合,如下图所示。
        
        公共耦合
        .内容耦合,如果一个模块需要涉及另一个模块的内部信息时,则这种耦合成为内容耦合。例如,一个模块访问另一个模块的内部数据;一个模块调用另一个模块的部分程序代码等情况。
        对这4种类型的耦合的优劣对比可以总结在下表中。
        
        4种耦合的优劣对比
        总之,聚合和耦合是相辅相成的两个设计原则,是进行模块设计的有力工具,模块内的高聚合往往意味模块之间的松耦合。要想提高模块内部的聚合性,必须减少模块之间的联系。
 
       耦合
        耦合性是指模块之间联系的紧密程度。耦合性越高,则模块的独立性越差。模块间耦合的高低取决于模块间接口的复杂性、调用的方式及传递的信息。模块的耦合有以下几种类型:
        (1)无直接耦合:指两个模块间没有直接的关系,它们分别从属于不同模块的控制与调用,它们之间不传递任何信息。因此,模块间耦合性最弱,模块独立性最高。
        (2)数据耦合:指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递。这种耦合程度较低,模块的独立性较高。
        (3)标记耦合:指两个模块之间传递的是数据结构,如高级语言中的数据组名、记录名、文件名等这些名字即为标记,其实传递的是这个数据结构的地址。
        (4)控制耦合:指一个模块调用另一个模块时,传递的是控制变量,被调模块通过该控制变量的值有选择地执行块内的某一功能。
        (5)公共耦合:指通过一个公共数据环境相互作用的那些模块之间的耦合。
        (6)内容耦合:这是程度最高的耦合。当一个模块直接使用另一个模块的内部数据,或通过非正常入口而转入另一个模块内部,这种模块之间的耦合为内容耦合,这种情况往往出现在汇编程序设计中。
 
       软件设计
               软件设计的任务
               在给定系统的需求规格说明书后,需要对软件的结构进行设计,并对设计的过程进行管理。在嵌入式系统的软件设计过程中,需要完成以下一些任务。
                      准备工作计划
                      在软件设计之前,首先要制订详细的工作计划,其内容包括:
                      .过程管理方案:包括软件开发的进度管理、软件规模和所需人年的估算、开发人员的技能培训等;
                      .开发环境的准备方案:包括开发工具的准备、开发设备的准备、测试装备的准备、分布式开发环境下的开发准则等;
                      .软硬件联机调试的方案:联调的起始时间、地点、人员和具体的准备工作;
                      .质量保证方案:包括质量目标计划、质量控制计划等;
                      .配置控制方案:包括配置控制文档的编写、配置控制规则的制订等。
                      确定软件的结构
                      设计软件的各个组成部分,包括:
                      .任务结构的设计:使用操作系统提供的函数,设计出一个最佳的任务结构;
                      .线程的设计;
                      .公共数据结构的设计:在确保系统一致性的基础上,设计出所需的公共数据;
                      .操作系统资源的定义;
                      .类的设计;
                      .模块结构设计:在设计时要充分考虑模块的划分、标准化、可重用和灵活性等;
                      .内存的分配与布局。
                      设计评审
                      对于软件设计的结果,进行一次设计评审,并在必要时对设计进行修正。具体内容包括:
                      .确认每件工作的执行方法是否恰当,其内容是否完善;
                      .确认该设计完成了系统需求规格说明书所要求的功能和服务;
                      .评估任务结构设计、评估类的设计、评估模块结构设计;
                      .对软件设计的结果进行总结,编写出相应的文档。
                      维护工作计划
                      执行软件设计工作控制,在每日、每周和每月的时间粒度上对进度进行控制,确保软件设计能够如期完成。
                      与硬件部门密切合作、相互协调
                      根据工作计划中的安排,定期与硬件部门召开会议,协调各自的进展。如果软件规格说明书发生了变化,立即进行调整,重新进行软件设计。
                      控制工作的结果,把工作记录存档
                      掌握当前的工作进展情况,尽早地发现和分析问题,并采取相应的措施。对各种事件进行跟踪记录,包括:
                      .执行过程控制,跟踪进展情况并定期记录、存档。
                      .执行质量控制,保留质量记录。
                      .记录产品的配置、版本变化、bug的发现和处理等信息。
               软件架构设计
               软件架构也称为软件体系结构,需要考虑如何对系统进行分解,对分解后的组件及其之间的关系进行设计,满足系统的功能和非功能需求。软件架构形成过程如下图所示。
               
               架构的形成过程概要
               软件架构设计需要从用户业务需求、未来应用环境、需求分析、硬件基础、接口输入、数据处理、运算或控制规律、用户使用等方面进行综合、权衡和分析基础上产生。面向某种问题的架构一旦确定就很难改变,随后的架构设计需要通过一系列的迭代开发完善,使得软件架构日趋成熟、稳定。
               软件架构的重要作用也在于控制一个软件系统的使用、成本和风险。好的架构要求是和谐的软件架构,包括与上一级系统架构相互和谐、与系统中同一级的其他组件架构互相和谐,确保系统满足性能、可靠性、安全性、信息安全性和互操作性等方面的关键要求,也具有可扩展、可移植性,从而为一个软件带来长久的生命力。
               在大量开发实践中,有很多广泛使用并被普遍接受的软件架构设计原则,这些原则独立于具体的软件开发方法,主要包括抽象、信息隐藏、强内聚和松耦合、关注点分离等。
               (1)抽象:这是软件架构的核心原则,也是人们认识复杂客观世界的基本方法。抽象的实质是提取主要特征和属性,从具体的事务中通过封装来忽略细节,并且运用这些特征和属性,描述一个具有普遍意义的客观世界。软件架构设计中需要对流程、数据、行为等进行抽象。复杂系统含有多层抽象,从而有多个不同层次架构。
               (2)信息隐藏:包括局部化设计和封装设计。局部化设计就是将一个处理所涉及到的信息和操作尽可能地限制在局部的一个组件中,减少与其他组件的接口。而封装设计是将组件的外部访问形式尽可能简单、统一。
               (3)强内聚和松耦合:强内聚是指软件组件内的特性,即组件内所有处理都高度相关,所有处理组合在一起才能组成一个相对完整的功能。而松耦合是指软件组件之间的特性,软件组件之间应尽量做到没有或极少的直接关系,使其保持相对独立,这样使得未来的修改、复用简单,修改之后带来的影响最小。
               (4)关注点分离:所谓关注点是软件系统中可能会遇到的多变的部分。如为适应不同运行接口条件,需要进行适应性的参数调整和驱动配置。关注点分离设计是将这部分组件设计成为相对独立的部分,使未来的系统容易配置和修改。而核心的部分可以保持一个相对独立的稳定状态。如果功能分配使得单独的关注点组件足够简单,那么就更容易理解和实现。但“展示某些关注点得到满足时,可能会影响到其他方面的关注点,但架构师必须能够说明所有关注点都已得到满足”。
               以上的原则中,删除需求细节或对细节进行抽象是最重要的工作,为用户的需求创建抽象模型,通过抽象将特殊问题映射为更普遍的问题类别,并识别各种模式。
               软件架构设计使用纵向分解和横向分解两种方式。纵向分解就是分层,横向分解就是将每一个层面分成相对独立的部分。经过分解之后,可以将一个完整的问题分解成多个模块来解决。模块是其中可分解、可组装,功能独立、功能高度内聚、之间低耦合的一个组件。
               类似于建筑架构,软件架构也决定了软件产品的好用、易用、可靠、信息安全、可扩展、可重用等特性,好的软件架构也给人完整、明确、清晰等赏心悦目的感觉,具有较长的生命力。
               架构设计是围绕业务需求带来的问题空间到系统解决空间第一个顶层设计方案。按照抽象原则,在这个阶段进行的架构设计关注软件设计环节抽象出来的重要元素,而不是所有的设计元素。在架构设计时将软件这些要素看作是黑盒,架构设计需要满足黑盒的外部功能和非功能需求的目标。一个软件的架构设计首先为软件产品的后续开发过程提供基础,在此基础上可将一个大规模的软件分解为若干子问题和公共子问题。而一般意义的软件设计是软件的底层设计,开发人员需要关注各子问题或要素的进一步分解和实现,是根据架构设计所定义的每个要素的功能、接口,进一步实现要素组件内部的配置、处理和结构。在遵守组件外部属性前提下,考虑实现组件内部的细节及其实现方法。对于其中的公共子问题,形成公共类和工具类,从而可以达到重用的目的。
               一般的软件构架是根据需求自上而下方式来设计,即首先掌握和研究利益相关方的关键需求,基本思路是首先进行系统级的软件架构设计,需要将软件组件与其外部环境属性绑定在一起,关注软件系统与外部环境的交联设计;其次将一个大的系统划分成各组成部分,这些部分可以按照架构设计的不同方法,分为层次或成为模块;之后再开始研究所涉及到的要素,再实现这些要素以及定义这些要素之间的关系。
               在实际工作中,软件构架也可采用自底向上的方法,前提是已经建立了一个成熟稳定的软件架构,也可以称之为“模式”。模式是组织一级设计某一类具体问题的顶层思路,是为了解决共有问题解的方案模板,但并不是一个问题的设计或设计算法。
               模式常常整合在一起使用,提供解决更大、更复杂问题的解决方案,而组成一个解决问题的通用框架。框架往往提供统一平台和开发工具,而且已经高效地利用了已经经过验证的模式、技术和组件。在新软件系统的设计中指定沿用或重用这种架构框架,这时其他重要元素可以在这个架构基础上针对新的需求进行扩展,有时是针对性地进行参数化设计。所以在架构设计中可以借用模式的概念进行设计,采用成熟的先进的设计框架和工具提高开发的效率,保证设计正确性。
               下图所示是针对架构设计中非功能需求的多维度分析,从中可知任何一个因素的变化都会带来对其他因素的影响。实际上软件架构设计属于软件设计过程的一部分,但超越了系统内部的算法和数据结构的详细设计。
               
               架构的多维度分析
               在架构设计阶段,需要定义边界条件、描述系统组织结构、对系统的定量属性进行约束、帮助对模型进行描述并基本构造早期的原型、更准确地描述费用和时间的评估。
               软件设计方法
               在将系统分解为各个组件的过程中,需要采取不同的策略,而每个策略则关注不同的设计概念。根据分解过程中所采用的不同策略,设计方法有基于功能分解的设计方法、基于信息隐藏的设计方法和基于模型驱动开发的设计方法等分类。
               (1)基于功能分解的设计方法。实时结构化分析与设计采用了功能分解,系统被分解为多个函数,并且以数据流或控制流的形式定义函数之间的接口;基于并发任务结构化的设计(Design Approach for Real-Time Systems,DARTS)提供了任务结构化标准,辅助人员确定系统中的并发任务,并指导定义任务接口。
               (2)基于信息隐藏的设计方法。面向对象(Object Oriented,OO)设计方法将数据和数据上操作封装在对象实体中,对象外界不能够直接对对象内部进行访问和操作,只能通过消息间接访问对象,符合人类思维方式,提高软件的扩展性、维护性和重用性。
               (3)基于模型驱动开发的设计方法。通过借助有效的(Model Driven Development,MDD)工具,构建和维护复杂系统的设计模型,直接产生高质量的代码,将开发的重心从编码转移到设计。当前使用较为广泛的MDD工具有IBM公司的Rhapsody。
 
       数据结构
        根据数据元素之间关系的不同特性,通常有下列4类基本的逻辑结构,即集合结构、线性结构、树形结构、图形结构。
        1)线性结构
        线性表是最常用且最简单的一种数据结构。线性表中除第一个元素外,每个元素均只有一个直接前驱;除最后一个元素外,每个元素都只有一个直接后继。
        栈是限定仅在表尾进行插入或删除操作的线性表,是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。
        队列是一种先进先出(FIFO)的线性表,它只允许在表的一端进行插入,而在另一端删除元素。
        2)树
        树是nn≥0)个互不相交的有限集,当n=0时称为空树。在一棵非空树中,有且仅有一个节点称为根节点;当n>1时,其余的节点可分为若干个不相交的集合,其中每一个集合本身又是一棵树,这些集合称为根节点的子树。
        3)图
        图是由两个集合VE组成的二元组,记为G=(V, E),其中V是顶点的非空有限集合,E是图中边的有限集合。
   题号导航      2009年下半年 程序员 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第54题    在手机中做本题