自软件工程学科诞生以来,模块化一直是永恒的口号之一。这种结构化设计和功能分解方法将软件分解为具有明确接口的明确定义的功能单元或模块。这种方法的成熟价值是高质量的软件。但是,当您采用模块化时,软件测试必须检查模块组合在一起并交互的方式。这种测试被称为“数据和控制耦合”。
今天,让我们来了解一下如何使用软件系统中的控制和数据耦合来评估系统的模块化,并提供宝贵的好处,包括:
• 提高软件可测试性• 提高软件可维护性
• 减少变更
的影响• 简化软件重用
术语“内聚”描述了模块化软件组件的属性。具有明确定义的接口并独立于其他模块运行的模块被认为具有高水平的内聚力。例如,命令行 MD5 加密哈希生成器是演示高级别内聚的软件组件的示例。输入是任何描述的数据对象(例如文件),输出是base-64哈希表示。由于哈希生成器采用单个输入,提供单个输出并且没有外部依赖项,因此它被认为表现出高水平的内聚力。
光谱的另一端是飞行控制系统。这些高度依赖于飞机的当前状态(例如,飞机是否在地面上)和传入的飞行数据流(例如,空速、高度、姿态等),因此具有低水平的内聚力。
凝聚力会显著影响任何试图从一个系统中提取软件模块以便在另一个系统中重用的人,他们会很乐意告诉你关于阻碍的隐藏依赖关系的战争故事。问题就在这里:如果模块不是真正内聚的,那么怎么可能在它的所有依赖项的上下文中测试每个模块呢?为此,您必须了解软件模块之间存在的耦合。这种耦合提供了一种衡量软件内聚力的方法,还提供了可用于评估和提高软件质量的指标。
耦合的概念在1980年Meiler Page-Jones的《结构化系统设计实用指南》一书中定义为“一个模块对另一个模块的依赖程度;具体来说,衡量一个模块中的缺陷在另一个模块中显示为缺陷的可能性,或者一个模块中的更改需要更改另一个模块的可能性。
他确定了耦合的两种基本风格,并将它们定义为:
• 控制耦合 - 一种耦合类型,其中一个模块将信息传达给另一个模块,以明确影响后者
• 数据耦合 - 一种耦合形式,其中一个模块将信息传达给另一个模块
让我们看一个例子来阐明两者之间的差异。
飞机发动机控制系统消耗高度和空速等空气数据信息,但是当飞机在地面和空中时,使用不同的控制算法。选择使用哪种算法由起落架系统的“车轮重量”信号决定,该信号指示飞机是否在地面上。在此示例中,发动机控制系统对高度和空速数据流的依赖性表明与提供它们的系统存在很强的数据耦合。同样,“车轮上的重量”信号表示发动机控制系统和起落架系统之间的强控制耦合。
耦合指标可用于在整个软件设计和验证过程中提高软件质量。目的是表明软件模块仅以软件设计预期的方式相互影响,确保没有计划外、异常或错误的行为。在设计过程中记录数据和控制耦合提供了一组在软件集成过程中进行测试的要求。同样,确保在软件测试期间执行模块之间的数据和控制耦合,表明软件的集成和架构得到了充分验证。
许多准则,例如定义民用机载系统创建适航法规的DO-178C标准,要求对安全关键软件进行控制和数据耦合评估,以确保满足这些设计,集成和测试目标。同样,英国国防部标准 00-55“国防设备中安全相关软件的要求”要求使用控制和数据耦合等指标来评估软件模块化。
测量控制和数据耦合是通过控制和数据流分析的组合来实现的。控制流分析在调用层次结构的程序和单个过程上执行。
数据流分析通过源代码跟踪变量,并报告任何异常使用。此检查在过程级别和作为系统范围分析的一部分执行。这是一种非常强大的技术,不仅可以为数据耦合评估提供基础,还可以检测其他严重问题,例如在初始化之前使用的变量或在其边界之外访问的数组。
尽管从命名中很容易假设控制流分析提供了控制耦合和数据耦合的数据流分析的可见性,但事实并非如此。控制流和数据流分析对于评估控制和数据耦合都是必要的。
无论正在开发的软件是否对安全至关重要,通过控制和数据耦合来测量软件模块的内聚力都有助于提高软件可测试性和可维护性,同时减少变更的影响,简化软件重用。
审核编辑:郭婷
-
接口
+关注
关注
33文章
8497浏览量
150834 -
数据
+关注
关注
8文章
6892浏览量
88827
发布评论请先 登录
相关推荐
评论