一种基于State模式的惯导系统软件设计方法

2017-05-12 02:02何长久
导航定位与授时 2017年3期
关键词:设计模式惯导分支

许 静,邹 瑛,解 芳,何长久,李 伟,2

(1.北京自动化控制设备研究所,北京 100074;2.惯性技术国防科技重点实验室,北京 100074)

一种基于State模式的惯导系统软件设计方法

许 静1,邹 瑛1,解 芳1,何长久1,李 伟1,2

(1.北京自动化控制设备研究所,北京 100074;2.惯性技术国防科技重点实验室,北京 100074)

State模式是一种面向对象的设计方法。针对惯导系统软件设计中的问题,提出了一种基于State模式的惯导系统软件设计方法,并将其应用于惯导系统软件分支流程的设计过程中。与传统设计方法相比,该方法将逻辑判断和处理封装在状态对象中,为不同系统状态子类声明了一个公共接口,用子类实现特定状态下的行为操作,避免了多种状态转换时逻辑判断的复杂度,降低了惯导系统软件的耦合程度,增强了代码的可靠性、健壮性和可移植性,从而提高了软件质量。

State模式;惯导系统软件;设计方法

0 引言

设计模式是利用面向对象语言的类和方法来实现某个编程目标的方法,用以解决在特定情况下出现的重复设计问题。

按照应用范围分类,设计模式可以分为类模式和对象模式。类模式处理的是类和子类之间的关系,这些关系是通过继承建立的,是静态的。对象模式处理的是对象间的关系,这些关系在运行时刻是可以变化的,是动态的。

设计模式按照目的分类有三种类型:创建型(Creational)、行为型(Behavioral)和结构型(Structural)。其中,行为型模式描述的是对象或类的模式以及他们之间的通信模式,涉及算法和对象间职责的分配,它将设计者的注意力从控制流转移到对象间的联系方式上来。在运行时难以跟踪的复杂的控制流都可以通过行为型模式来进行刻画。

行为型类模式使用继承机制在类之间分派行为。行为型对象模式使用的不是继承而是对象的复合。通常单个对象无法单独完成某些任务,行为型对象模式可以通过一组对等的对象间协作来完成其中任一对象都无法单独完成的任务。常见的行为型对象模式有状态模式(State)、策略模式(Strategy)、迭代模式(Iterator)、命令模式(Command)等。

本文以捷联式惯性导航系统为例,研究State这种行为型对象模式在惯导系统复杂流程控制中的应用。捷联式惯性导航系统的典型工作剖面如图1所示。惯导系统软件根据运行条件主要工作在以下10个状态:初始化、自检、待机、初始装订、静基座粗对准、静基座精对准、动基座粗对准、动基座精对准、导航和系统异常。

图1 惯导系统软件工作剖面图Fig.1 The working section of inertial navigation software

惯导系统软件根据外部指令或确定的流程顺序进入某种状态,在某状态下实现某一种或某一序列操作。其工作状态多样,导致操作中含有庞大的多分支条件语句,或其多条分支间有时间顺序、条件约束等的要求。此时,软件设计除实现其功能外,应更偏重于效率的优化和维护的便利。否则,当在现有流程上增加或删除一个操作时,对复杂条件判断分支的增减很容易引起其他分支不可预期的后果,给维护和测试工作增加了工作量,同时系统的可移植性和可靠性不高。基于此,提出了基于State模式的软件流程设计方法,将这种模式用于惯导系统软件,可将不同状态的行为分割开来,降低各个模块间的耦合程度,便于需求发生变更时的更改和维护。同时,可提高软件设计的效率、可移植性、可靠性和健壮性。

1 State模式说明

State模式定义一系列的操作,将逻辑判断和处理都封装在状态对象中,为表示不同操作状态的子类声明一个公共接口,用其子类实现与特定状态相关的行为。该模式将每一个条件分支放入一个独立的类中,使用户可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。模式结构如图2所示。

图2 State模式说明Fig.2 Description of State pattern

图2中,Context将与状态相关的请求委托给当前的ConcreteState对象处理。它可将自身作为一个参数传递给处理该请求的状态对象。客户可用状态对象来配置一个Context,一旦一个Context配置完毕,它的客户不再需要直接与状态对象打交道。同时,Context或ConcreteSate子类都可以决定哪个状态是另外一个的后续者,以及是在何种条件下进行状态转换。

State模式具有以下优点:

1)State模式将与特定状态相关的行为局部化,并且将不同状态的行为分割开来。通过定义新的子类可以很容易地增加新的状态和转换。决定状态转移的逻辑不在单块的if或switch语句中,而是分布在State子类之间。将每一个状态转换和动作封装到一个类中,这将使代码结构化并使其意图更清晰;

2)State模式使得状态转换显式化。当一个对象仅以内部数据值来定义当前状态时,其状态仅表现为一些变量的赋值,这种表示方式不够明确。State模式可以为不同的状态引入独立的对象,从而使得转换变得更明确。另外,State对象可保证Context不会发生内部状态不一致的情况。

2 基于State模式的惯导系统软件设计

假设某项目存在如图1所示的10个工作状态。惯导系统所处的工作状态根据外部指令或某种设定条件而有所不同。设计实现时,定义的对象必须能够在运行时刻根据状态改变它的行为,或者说,必须存在一个含有庞大的多分支条件语句的操作,且这些分支依赖于该对象的状态。

下面分别介绍采用传统方法和采用State模式实现惯导软件状态转换的流程设计。

2.1 传统分支设计实现

传统的分支设计,主要采用if或switch分支设计。当状态繁多时,就需要大量的分支来支撑。而过多的分支会引起逻辑的混乱。

简要选取自检、初始装定、粗对准、精对准、导航几个主要工作状态,以此为例,说明采用传统的分支设计的具体实现,流程示意如图3所示。

图3 传统的分支设计Fig.3 The traditional branch design

2.2 State设计模式下的惯导软件设计实现

惯导系统的每种工作状态均可抽象成“进入该状态”、“运行该状态”、“结束该状态”、“改变该状态”四种行为。利用State模式设计状态转换如图4所示。

图4 State模式应用示例Fig.4 Applicarion example of State pattern

仍以此项目为例,定义抽象类State来表示惯导系统的工作状态,定义虚函数ComeIn( )表示进入该状态的行为,Run( )表示保持该状态的行为,GoOut( )表示结束该状态的行为,ChangeState( )规定状态转换的准则。为了更灵活地实现状态间切换,运用State子类自身指定它们的后续状态以及何时进行转换。通常状态转换的动作为前一个状态的结束,后一个状态的进入。

Working将所有与状态相关的请求委托给它的State实例。State的子类实现与状态有关的各种行为,例如StandByState为State的子类,实现系统待机状态下的行为;SelfTestState为State的子类,实现系统自检状态下的行为。在每个子类中明确定义其进入、运行、结束。在完成当前状态相关工作后,调用ChangState函数来改变Working的状态。Working本身并不需要了解系统状态转换的规则,只需由State子类来定义其每一个状态转换和动作。

图5给出了以系统自检为例的代码。应用Working实例对象的_state->Run()函数,来实现系统状态运行及状态切换。当自检时间满足时,运行_state->ChangeState()函数,调用_stateSelfTest->GoOut()和_stateCoarseAlign->ComeIn()函数来实现状态切换功能。

图5 系统自检状态设计示意图Fig.5 The design schematic diagram of system self-test state

2.3 两种实现方法的比较

从2.1节和2.2节的实现可以看出,采用传统的软件设计方法,以条件判断分支设计状态转换,将不同状态的行为混合在一起,耦合性强,形成的代码不够清晰,可读性较差。增加或删除一个状态,势必要更改前后状态的出入口条件以及流程走向。又因为同在一个模块中实现,这种状态的改变可能会对其他分支带来影响。无论更改多少,也要求设计足够的测试用例来保证此次更改的正确,付出代价较高。因此,给维护带来困难的同时,软件的可靠度不高。采用传统分支设计的流程示意图如图6所示。

图6 以条件分支设计的状态转换示意图Fig.6 The schematic diagram of state transition according to the condition branch

而采用State设计模式的设计方法,任务流被看成是由一组状态和转换构成的,在某个状态被执行后,它的输出将被相应地转换以跳转到另一特定状态继续执行。这种可根据周围条件的变化,动态调整任务流执行的过程,使得在状态修改时,无需改变函数执行的主体模块而只考虑子类具体行为即可。

另外,由于State模式提供了更好的与特定状态相关的组织方法,决定状态转移的逻辑不在单块的if或switch语句中,而是分布在state子类中。它将每一个状态转换和动作封装到一个类中,这使得代码结构化并使其更清晰,也更易维护。增加或删除一个系统状态,只需重新定义或删除一个state子类,并更改它的转换条件即可,因此大幅提高了软件的可移植性。虽然State模式设计在代码量上大于条件判断分支,但以当前系统CPU的资源现状来看,这些开销都是微不足道的。State设计模式的流程示意如图7所示。由此可见,用State模式设计实现状态转换,尤其是多种状态的转换是占有优势的。

图7 设计模式的状态转换示意图Fig.7 The schematic diagram of state transition according to the design pattern

3 结论

本文给出了一种基于State模式的惯导系统软件设计方法。该方法在添加新的系统状态时只需要增加新的状态子类定义即可,而不用修改程序流程框架。与传统分支设计方法相比,该方法降低了软件各分支的耦合度,提高了软件的可重用性。利用其结构清晰、可扩展性强、易测试并且实现可靠的特点,建立起了一种松散而有效的新程序,大大增强了代码的可移植性,并减小了维护的代价,提高了软件开发效率和软件质量。

[1] Gamma E,Helm R,Johnson R,等.设计模式:可复用面向对象软件的基础[M].李英军,马晓星,蔡敏,等译.北京:机械工业出版社,2007.

[2] 林舒萍,罗键.设计模式的应用研究[J].计算机工程与设计,2005,26(11):2980-2982.

[3] 姚蓓窈,向东游,张华栋.高速串口的软件设计模式研究[J].计算机测量与控制,2014,22(7):2318-2320.

[4] 绍维忠,麻志毅.UML用户指南[M].北京:机械工业出版社,2001.

[5] Larman C.UML和模式应用[M].李洋,郑龚,等译.北京:机械工业出版社,2006.

[6] 李潇.设计模式及其在软件设计中的应用研究[J].无线互联科技,2014(1):230-231.

[7] 郭荣.浅谈软件设计模式中的设计原则[J].信息安全与技术,2014(11);93-94.

[8] Shalloway A, Trott J.Design patterns explained[M].Pearson Education India,2002.

[9] 刘东生.设计模式及其在软件设计中的应用研究[J].数字技术与应用,2015(7):153.

[10] 周树语.设计模式在面向对象框架中的应用[J].计算机光盘软件与应用,2013(6):189-190.

[11] Johnson R E.Frameworks=(Components + Patterns): How frameworks compare to other object-oriented reuse techniques[J].Communications of the ACM, 1997,40(10): 39-42.

[12] Schmidt D C.Using design patterns to develop reusable object-oriented communication software[J].Communications of the ACM, 2015, 38(10):65-74.

A Method of Inertial Navigation System Software Design Based on the State Pattern

XU Jing1, ZOU Ying1, XIE Fang1, HE Chang-jiu1, LI Wei1,2

(1.Beijing Institute of Automatic Control Equipment, Beijing 100074, China;2.Key Laboratory of Science and Technology for National Defence on Inertial Technology, Beijing 100074, China)

A State Pattern method is an object oriented design method.It is proposed according the existing problems in the software design of inertial navigation system.Different with traditional designed method, state pattern method encapsulates the logical judgement and handle process in one object, and one common interface is defined for various system statement.The detailed process method is implemented in subclass.With this method, the complexity of system state translation is reduced as well as the coupling of system software.As the results, the robustness of system software is improved and the quality of software is enhanced.

State pattern; Software of Inertial Navigation System; Method of design

10.19306/j.cnki.2095-8110.2017.03.004

2016-05-22;

2016-06-28

国家自然科学基金(41527803)

许静(1982-),女,工程师,主要从事导航与定位领域软件设计与软件工程技术研究。E-mail:250460323@qq.com

TP311.5

A

2095-8110(2017)03-0022-05

猜你喜欢
设计模式惯导分支
设计模式识别的特征信息分类研究
UUV惯导系统多线谱振动抑制研究
“1+1”作业设计模式的实践探索
一类离散时间反馈控制系统Hopf分支研究
软件多分支开发代码漏合问题及解决途径①
智慧图书馆环境下的融贯式服务设计模式研究
光纤惯导国内外发展现状及其关键技术分析
三维协同设计模式下的航天项目管理实践与展望
巧分支与枝
无人机室内视觉/惯导组合导航方法