跳转到内容

双向工程

维基百科,自由的百科全书

双向工程(Round-trip engineering)简称RTE,是同步二个或多个相关软体工件(例如程式码、模型、组态档案及文件)的软件开发工具机能[1]。要进行双向工程的原因是因为相同的资料会出现在多份工件上,若只更新了其中一份工件的资料,另外工件中的对应资料没有更新,就会有各工件不一致的问题。

双向工程和传统的软件工程作法有紧密的关系,例如顺向工程(从已有的规格产生程式码及软体)、逆向工程(从已有的软体产生程式码及规格)及代码重构(了解程式码并且修改)。常有人将双向工程错误的定义为同时支援顺向工程及逆向工程而已。双向工程的主要特点可以是在一个已有软体工件有变更时,同时的同步其他对应的工件,其作法是逐步的在其他工件中加入对应原工作修改的内容。顺向工程可以视为是一种已有规格的特殊双向工程,逆向工程则是可以视为是已有软体的特殊双向工程。许多reengineering的工作也可以视为是双向工程,用之前逆向工程得到的规格,其中进行修改,再修改软体,和规格同步。

双向工程的另一个特点是自动侦测工件中的不一致,自动更新工件。若以这个定义来看,双向工程就和顺向工程及逆向工程不同了,顺向工程及逆向工程可能是人工进行的,也可能是自动的(例如分析规格,自动产生程式码)。自动更新的过程可以是即时的,也可以是在有需求时更新。若是即时的双向工程,在工件变更之后其他工作的对应部份也都会自动更新。若是在有需求时更新的双向工程,工件的作者们可能是同时变更这些工件,其中某个时间比较工件,识别不一致之处,选择要保留的内容,并且避免可能出现的冲突。

双向工程支援迭代式的开发流程。在模型和工件同步后,可以选择继续修改程式,或是修改模型。可以进行任意次数、任意方向的同步。

双向工程的例子

[编辑]

最常见的双向工程例子可能是在UML(统一建模语言)模型以及其对应程式码之间的同步。许多商用软体以及研究用的原型工具支援这类的双向工程,例如Rational Rose英语Rational RoseMicro Focus Together英语Micro Focus TogetherESS-ModelBlueJ英语BlueJFujaba等,Fujaba软体的文件中有提到软体可以识别设计模式[2]。一般而言,针对UML的类别图,可以支援一定程度的双向工程,不过像是关联(association)及组合(containment)等UML概念,在许多程式语言中没有直接对应的表示方式,因此限制了直接建立对应程式码的能力,也影响程式码分析的准确度(例如,不容易识别出程式中的组合概念)。2005年在Microsoft Visual Studio上的一本书中,有指出RTE工具的常见问题,其中一个是所留下的模型会和原有的模型不同,只有透过在工具中的许多标示后,才能让两者同步[3]。UML有关行为的部份对双向工程的挑战更大。

另一种比较可以追踪的双向工程是在框架应用程序接口(API)下的双向工程,有模型描述应用程式应用API的方式,会和应用程式的程式码同步。此应用下,API规定了所有应用程式应用此框架的方式,可以准确及完整的侦测API的使用情式,并且合成实现此用法的程式。此领域的双向工程软体中,有二个主要的软体,是框架定义建模语言英语framework-specific modeling languageSpring Roo英语Spring Roo

对象管理组织(OMG)的模型驱动架构(MDA)中,要在不同模型之间维持一致,并且在模型和程式码中维持一致,双向工程是其中的关键。对象管理组织提出了QVT英语QVT(查询/浏览/转换)标准来处理MDA中要求的模型转换。到目前为止,只实现了标准中的部份内容。

软体工程中的例子

[编辑]

统一建模语言(UML)为基础的双向工程需要三个基本的软体开发元素[来源请求]

  • 程式码编辑器
  • 针对属性及方法的UML编辑器
  • UML结构的视觉化表示

以下是一个以网站为基础的开源简易双向工程工具[来源请求]

  • JavaScript Class Creator[4]:可以整合JavaScript物件的双向工程。可以用图形函式库JointJS产生统一建模语言的图[5]。而Javascript原始码的编辑可以用ACE编辑器达成[6]

参考资料

[编辑]
  1. ^ Gentle, Anne. Conversation and Community: The Social Web for Documentation 2nd. XML Press. 2012. ISBN 978-1937434106. 
  2. ^ Stephan Diehl. Software Visualization: Visualizing the Structure, Behaviour, and Evolution of Software. Springer Science & Business Media. 2007: 63. ISBN 978-3-540-46505-8. 
  3. ^ Andrew Filev; Tony Loton; Kevin McNeish; Ben Schoellmann; John Slater; Chaur G. Wu. Professional UML Using Visual Studio .Net. John Wiley & Sons. 2005: 181. ISBN 978-0-7645-5875-7. 
  4. ^ JavaScript Class Creator页面存档备份,存于互联网档案馆), GitHub.
  5. ^ JointJS页面存档备份,存于互联网档案馆), GitHub.
  6. ^ ACE页面存档备份,存于互联网档案馆).