第3章A-7E案例分析:各种构架结构的运用

 
 
面向对象程序的运行时结构与其代码结构之间经常存在较大的差异.在对程 序进行编译时,代码结构就巳固定下来了.,面向对象的代码结构由若干类构成,各类之间是固定的继承关系。
 
程序的运行时结构则由若干相互联系,相互通信的对象构成,而且这些对象 及其之间的关系是处于快速变化的。实际上,代码结构与运行时结构在 很大程度上是相互独立的.要想根据其中的一个来理解另一个,无异于企图 借助生物的静态分类来理解其动态特征.
 
-E. Gamma. R. Helms. R. Johnson和J. Vlissides[Ganuna 95]
 
软件构架描述了系统的各个元素及其相互联系.这已在第2章进行了阐述。我们还强 调r每个系统都由多个不同类型.的元素构成.要想完整描述某个系统的构架,研究构架层 次上的各种不同结构是有益的,甚至是必要的。每个结构都是构架某一方面的集中反映。
 
本章将讲述一个构架案例分析。构建该构架时,设计并确定了构架层次上的3个具体 结构,即模块分解结构、使用结构和进程结构。我们将会阐明这3个结构足如何相互补充、 共同描绘系统运行的完整蓝图的。另-方面,我们也将看到,系统的某些质量属性分别受 到了这3种结构的制约。表3.1对本章将要讲述的这3种结构做f简耍说明
3.1与构架商业周期的关系
 
图3.1给出了本章所要讲述的A-7E航空电子系统的构架商业周期„该系统是为驾驶 A-7E飞机的海军飞行员设计的,其开发始于丨977年,项经费由关氓海军支付。承担该 项目开发任务的是美国海军研究实验室的软件工程小组。开发人员想通过该软件的开发实 际验证一下软件工程原理(在该案例中指信息隐馘和协同顺序进程)适用于高性能嵌入式 实时系统开发的想法。
该系统的构架设计小组由多人组成.其中--位是本书作者之•,还有一位是软件工程 理论的权威,但该设计小组的各位成员对航空电子领域都不熟悉,尽管他们研究了当时其 他-些航空电了系统,并请教了航空电子领域的专家。当时没有针对目标平台的可用的编 译器。
 
下面先介绍一下该应用系统,包括系统的功能、需要实现哪些重耍的质量厲性以及软 件在该系统中的作用。
 
3.2需求与质量
 
图3.2展示了 A-7E海盗II型飞机。这是-种单座、舰载攻击机,在20世纪60年代、
 
从广义上说,A-7E软件的功能就是读取各传感器的数据,更新座舱屮显示设备的显 示内容。辅助飞行员正确投弹。与现代的很多航空电子系统不同的是.A-7E软件并不真 正控制机的飞行《
 
^该软件主要读取和管理來自如下传感器的数据:
 
•用于测谀气压和风速的飞行探针。
 
•可按方位角和仰角调整的前视雷达。该雷达能够向计算机返回所瞄准的地面目标 的直线距离。
 
•报告对地速度和偏航角的多普勒雷达。偏航角即机头所指方向与对地飞行方向 之差.
 
•惯性测盪设备(丨MS)。该设备能够报告沿3个直角坐标的加速度。该软件必须能 够及时读取这3个加速度的值、计箅在一段时间内的速度,并根据在.段时间内 速度的值推导出飞机当前的实际方位。该软件还必须管理定位设备,修圯3个坐 标轴的漂移偏差,使3个坐标轴分别准确对应北、东和垂直方向,以保证各测麗 数据准确地以飞机的参照系为基准。
 
•与航空母舰的惯性测量系统的接U。通过此接口,可使飞机停放在航空母舰上时 仍能计烊出当前所处的方位。
 
•能够报告机翼下6个炸弹托架载弹情况的传感器。这种传感器能够报告哪些托架上载有炸弹,并能区分出它是该机可能载有的100多种炸弹中的哪种。
该软件中有一个记录有各种炸弹参数的数据库,能够使它计算出某种炸弹投下后将在空 中沿什么样的自由落体弹道飞行。
 
•    能够测量距离地面高度的雷达高度计
 
由该软件所控制的飞机座舱内的显示设备主要包括仅有显示功能的设备和用于实现 行员与该软件交互的设备。具体地说.这些设备包括:
 
•    地图显示设备。该设备中使用的是胶片地图,胶片后有照明灯。随着飞机的飞行, 此胶片地图将自动移动,从而保证了总是显示飞机当前所在的位贸。飞行员可以 对地图进行设定,使其上端指向前方或真正的北方
 
•    正面显示器。该设备把数字和图像信息投射到界于飞行员和挡风玻璃之间的那个窗口上。可以认为在飞行过程中飞行员的头部位置足固定的、已知的,所以可使 用这样的正面显示器覆盖现实世界的信息.如目标的位置或表示飞机飞行方向的 线条。
 
•    小键盘和3个小型的字母数字显示窗口。使用小键盐.飞行员可以从计算机中调 出大约100多种数字信息。在计算机的控制面板h有一组开关,飞行员可使用它 选择想用的导航或投弹模式。
 
•    各种指示灯、仪表盘和声音信号,
 
飞行员可以用多种方式将地面目标(或航标)的方位告诉该软件。这些方式包括:
 
•    用键盘输入目标的经度和纬度。
 
•    用校制杆转动地图,直至目标处于坐标系的中心点上。这时飞行员可以按下控制 杆上的某个按钮,以指定该方位。
 
•    将前视雷达指向目标并确定其方位。
 
•    转动正面显示器上的某个特殊标志,直至该标志刚好覆盖地面上目标的位置,这 时即可确定此位置。
 
之后该软件就应在正面显示器上显示导航信息(如方向、距离和剩余时间等)和操作指导,指引飞机飞向确定的方位。
 
有20多种导航模式可供飞行员选择,这主要根据在一定飞行状态下哪些传感器的数据最可靠来确定。该软件至少使用5种不同的直接或间接方法来计算飞机的飞行高度,其 包括利用直线距离和前视雷达仰角的几何学方法(参见图3.3)。总共有20多种投弹方式 ,且都耍求进行实时计算(每秒重复25次),以保证飞机投弹的精确性。
 
A-7E飞机己于20世纪80年代末从美国海军中退役。但现代战斗机的设计都受这种 机的影响,辨遍采用了前视监视器和多种投弹及导航模式。
本章所给出的构架并不是软件最皁版本的构架,而是由使用A-7E软件验证自己设计 思想的海甲软件工程师们IT新设计之后的软件构架(参见引文“关于A-7项目”)。该软件 系统所耍满足的质S指标包括实时性能和针对期望变更的可修改性•具体地讲,以A-7E 软件系统每秒钟敁示内容的更新次数和武器投放的计算来衡最其性能。町修改性需求涉及 对武器、平台、显示屏上符号的变更,以及通过键盘输入的新内容。
 
为什么多年以后我们还对A-7E软件系统如此感兴趣呢?这是因为该项目的研制使我 们获得了两条经验.其一是信息隐藏是软件开发中可行的和明智的设计准则。这一经验已 经在当今的软件开发中得到了广泛的应用,其二是从实现系统质量指标的角度看,认真设 计构架层次上的各种结构可以达到事半功倍的效果.在实际开发中,这一经验至今尚未引 起足够的重视,所以我们在本书中反复强调它,以期该经验能够通过多次重复深入人心.
 
3.3 A-7E航空电子系统的构架
A-7E航空电子系统的构架以第2章所讨论的3个构架层次上的结构为中心:
 
•分解模块的结构 
•使用模块的结构 
•进程组件和连接器的结构
 
我们将分别对其进行讨论。
 
3J.1分解结构
 
只要一个程序不是小得只需一个程序员就可以完成,就必须考虑如何将工作划分为可 以独立实现的单元以及这些模块如何进行交互。当然,分解结构的单元就是模块。可以把 模块哲作是定义了一组过程,一些公有的和一些私有的:以及一组私有的数据结构。分解 结构中模块之间的关系是“是一个子模块”或“与之共享秘密”。
 
在丨977年前,性能足嵌入式系统(以及大多数其他系统)敁I:耍的目标。A-7E设计 人员的H标就是平衡性能与可修改性,并证明可以在不损害性能的情况下实现可修改性。
 
信息隐藏。A-7E模块分解基于信息隐藏。信息隐藏的基本思想就足把很可能会被更 改的系统细节封装在各个模块中,第5章将会重新讨论这一构架战术。模块的接口仅包括 认为不会更改的系统细节,模块内部封装的系统细节对外是不可见的。
 
例如,像飞机高度传感器这样的设备在航空电子系统的生命期内很可能会被更换,按 照信息隐藏原理就应该把与该设备交互的细节封装到某个模块中。与该模块的接口中有的 只是一个抽象的传感器,该抽象传感器可能仅由一个返回实际传感器最新数椐的程序组 成,因为很可能所有新式传感器都具有这样的功能。如果真的换成了新式传感器.需要修 改的就只有该模块的某些内部细节.软件的其他部分不受影响。
 
信息隐藏原则耍求各个模块仅通过某个确定的公共参数集合(即各个模块接口)进行 通信。每个模块都提供了一组可以由该系统中其他模块调用的访问过程.这些访问过程是 封装之后各模块之间通信的唯一手段,通过它们与模块中封装的信息交瓦。
 
这当然是面向对象设计的基本思想,但有一个重要不同:在面向对象的设计中.对象 是根据应用程序所涉及的实际对象构建出来的,或者是根据对系统的直观想象而推想出 来的:而这里所说的信息隐藏模块则是根据对系统生命期内可能发生的变化的分类而构建 出来的。
 
一个模块可能就是一个不可再分的整体,也可能包括若干个子模块。如果某个模块由 多个子模块绀成,则也应编写子模块划分的文档。子模块的分解及其设计可以按此方式继 续下去,直至每个模块己足够小,能够做到在负责该子任务开发的人员离开后.其他人也 可以轻松地抛弃他未完成的工作而重新开始。
 
模块划分的具体目标如下:
 
•    每个模块的结构应足够简单、能够被充分理解。
 
•     应该能够在无需了解其他模块的具体实现,并且不影响其他模块的行为的情况下 修改某个模块的实现。
 
•    对设计进行修改的容易程度应该与该修改可能发生的程度有合理的对应关系。应该能够在无需改变任何模块接口的情况下完成最可能发生的改动,允许较少的修 改涉及对某些接口的改动,但仅限于使用不多的小模块。只允许最不可能发生的 改动涉及对频繁使用的模块接口的改动。
 
•    应该能够把耍对软件系统做的比较大的改动分解成对各个模块的一组独立的修 改(即除了接口改动外,负责对模块进行改动的程序员不需耍相互交流)。如果 模块的接口不做改动,就应该能够运行和测试各模块新、老版本的任意组合。
 
分解结构的文档有时被称为模块指南。它通过陈述将由该模块封装的设计决策.定义
了每个模块的责任。编制模块划分指南是为了避免工作的重复,保证各开发7任务的衔接, 实现所关心问题的分离,而且,最重要的是,帮助维护人员确定所要解决的某个问题或要 做的某个改动涉及到哪些模块。
 
该指南说明了将某个特定责任分配给某个模块的准则,并对各模块的组织做出了合理 安排.使得耍杳找与某一目的有关信息时.小必翻阅与之无关的部分。A-7E系统的模块 划分指南的内祚编排采用了树状结构,先将整个系统划分成几个大模块,然后再将每个大 模块划分成茬干个小模块,依次划分下去,直至最后得到的所有模块都足够小为止。在这 一结构中的每一个非叶子节点都是由若干个下级模块组成的。该指南并没有描述模块间的 任何运行时关系:它并没佴讲述在系统执行时模块之间如何交互:相反,它只是描述了实 现单元之间的设计时关系,这些实现单元构成了项目的设计阶段。
 
信息隐藏原则的运用并不总是简单易行的。在开发过程中,总是要试图预测未来可能 的修改,以降低软件的成本。这种估计必然是建立在经验、对相关应用领域及软硬件技术 的了解的基础上.设计人员可能并不具备所有相关经验,因此.耍通过正式的评审过程以 借助于他人的经验。表3.2列出了 A-7E系统的模块结构。
A-7E横块分解结构,为了把A-7E的模块分解结构讲淸楚,同时也为了给出一个模块 结构文档编制的实例,我们从A-7E系统的软件模块划分指南中节选.部分内荇,并从 最高层的3个模块幵始讲述该系统模块树的内容。这些模块的构建站于如下的认识:对于 A-7E这样的系统,系统的改动可能是由3方面的原因造成的,软件必须与之交互的硬件 发生了变化:所要求的系统外部可见行为发生了变化;完全由该项西的软件设计人员做出 的某个决定发生了变化。
 
1.硬件隐藏模块
 
硬件隐藏模块包括当硬件的任何一部分被具有不同的软/硬件接口但具有相同能力的 单元代替时需要修改的过程。该模块实现了虚拟硬件,或者由该软件系统其他部分使用的 一组抽象设备。这个模块的关键是要实现软/硬件接口的隐藏,另外也要隐藏用于实现此虚 拟硬件的数据结构和算法。硬件隐藏模块的一个子模块是扩展的计箅机模块,该模块隐藏了处理器的细节。
 
2.行为隐藏模块
 
行为隐藏模块包括当影响系统行为的需求发生变化时潘要修改的过程。此模块应主要 实现系统需求的隐藏-这些过程决定了应发送给由硬件隐藏模块提供的虚拟输出设备的 数据。
 
3.软件决策横块
 
软件决策模块将基于数学定理、物埋事实、编程思想(例如怎样保证箅法的高效率和 准确性)的软件设计决策隐藏了起来。该模块所隐藏的信息在系统需求描述文档中是没有 记载的。这种模块所隐藏的信息及模块的对外接口都是由软件设计人员决定的.所以这种 模块明显区别于其他模块。对这些模块的修改很可能是由于外部因素的变化而希望提高该 模块的性能或精度。
 
模坱划分指南还要说明对来自各方面的、相互冲突的需求(例如所耍求的某个算法是否是模块行为或软件决策的一部分)是如何通过完整、公证的需求描述进行仲裁,然后提 供二级分解的。下面分析一下软件决策模块是如何分解的。
 
(1)应用数据类型模块„应用数据类型模块是对硬件隐藏模块中的计算机扩展子模 块的补充。应用数据类型模块提供了适用于航空电子系统应用但又不要求独立于计算机的 实现的数据类型。例如距离(用于计算高度)、时间长度、角度(用于计锌纬度和经度) 等都厲于这种数据类型。这呰数据类型是利用扩展的计算机模块所提供的基本数值类型实 现的,可以像使用扩展的计算机模块直接提供的数据类型一样使用这种类型的变最。
 
应用数椐类型模块所隐藏的是变跫及用于实现对这些变fi的操作的过程中的数据表 示。数据的单位(如英尺、秒或弧度)是数据表示的内容,隐藏在该模块中。如果滞要的 话,该模块还要提供进行数据单位转换的手段,以便输出或接收以某个单位计燉的数据值。
 
(2)数据银行家模块。大多数数据都是由某个模块产生而由其他模块使用的„在大 多数情况下,使用数据的模块都要求所接收的数据值是最新的。应在何时取新计算某个数 据项的值是由数据使用者的厲性(例如对精度的要求)和数据生产者的属性(例如计算的 成本、数据值更新的频率)决定的。数据银行家模块起着“中间人"的作用,决定着何时 进行求新值的运箅
 
数据银行家模块从生产者过程获得数据值,而使用者过程则从数据银行家模块的访问 过程获得数椐。编写某个数据项的生产者和使用者时,不必考虑相关存储数据的更新问题。 在大多数情况下.数裾更新策略的改变并不要求对数据生产者或使用者进行修改。
 
数据银行家模块提供关于模块内部状态或飞机工作状态的所有数据。数据银行家模块 也向可修改它所提供的数据的事件发送信号。只要数据生产者和使用者厲于两个不同的模 块,就使用数据银行家模块,即使当数据生产者和使用者厲于同一模块的两个不同子模块时也足如此。如果数据使用者要求使用的是数据生产者所计算的数据当中的某几个,或所 得到的数据值是数掘产生过程的输入参数值的函数,如sin(x),就不使用数据银行家模块。 数据银行家模块是使用黑板构架模式的一个例子(参见第5帘,实现顼量属性)。
 
应根据数据使用者的精度要求、对数据更新频率的要求、使用者所能等待的最长时间、 数据的变化速度、求得数据新值的运算成本决定数据更新策略。这些信息是提供给负责实 现数掘银行家模块的开发人员的一部分。
 
(3)过滤器行为横块。过滤器行为模块中包含实际过滤器的数字化模型。它们可以 被其他过程使用.来对可能的噪声数据进行过滤。该模块主要隐藏的是在对基于采样数据 值的数据进行估计和对错误进行估计时所采用的模型。其次也要隐藏实现这些模型所采用 的算法和数据结构。
 
(4)物理模型模块  该软件系统要求对不能直接测量但可根据观测值使用数学模型计算出来的量进行估计-从投弹到炸弹命中目标的时间就是一个例子。物理模型模块主要 实现对模型的隐藏,其次实现对这些模型的计算机实现的隐藏。
 
(5)软件实用程序模块..软件实用程序模块包含原本要由多个程序员编写的实用例 程这些例程包括数学函数、资源监视程序和所存模块都已完成加电初始化时发出信号的 过程。软件实用程序模块要隐藏用于实现这些过程的数据结构和算法。
 
(6)系统生成模块。系统生成模块主要隐藏的是直到系统生成时才做出的决策。这 些决策包括系统生成参数值的确定和对某一模块不同实现方案的选择。系统生成模块还需要隐藏用以生成机器可执行代码的方法和对所推迟决策的表述。该模块的过程并不在机载 计算机上运行.而是在为此机载系统生成代码的计箅机上运行。
 
模块指南还对第3级(甚至第4级)分解做了明确描述。本书略掉了此部分内容。图 3.4列出了 A-7E构架分解到第3层的结构。注意.很多设备接口模块和功能驱动模块具有 相同的名称.其差别在于,设备接口模块在编程实现时知道软件如何与硬件设备进行交互, 而功能驱动模块在编程实现时则知道需要计算哪些值并将它们发送给硬件设备。这向我们 展示了另外一种构架上的关系.即这些模块中的软件是如何相互协作来实现系统功能的, 我们将对其进行简单讨论。
 
然而,图3.4给出的模块分解视图并不完整。在第2章给出的对构架的定义中,构架 还包括对每个元素的行为描述。精心设计独立于编程语言的模块接口对于保证可移植性和 实现互操作性具有東耍意义。这里.每个模块都必须给出对其接口的描述。第9章对软件构架编档进行r描述。
 
上一章曾提到过,构架对项目开发和软件开发都起着蓝阁的作用。在A-7E系统的构 架中:二级模块分解结构对于设计文档的编写、联机配置控制文件的编制、测试计划的制 定、编程小组的组织、评审过程的安排、项目进度的确定及每一步重要进展都产生了重要 影响,成为赖以参考的单位。
 
 
 
 
posted @ 2019-12-04 21:56  mongotea  阅读(497)  评论(0编辑  收藏  举报