双向工程
双向工程(Round-trip engineering)简称RTE,是同步二个或多个相关软件工件(例如程式码、模型、组态档案及文件)的软件开发工具机能[1]。要进行双向工程的原因是因为相同的资料会出现在多份工件上,若只更新了其中一份工件的资料,另外工件中的对应资料没有更新,就会有各工件不一致的问题。
双向工程和传统的软件工程作法有紧密的关系,例如顺向工程(从已有的规格产生程式码及软件)、逆向工程(从已有的软件产生程式码及规格)及代码重构(了解程式码并且修改)。常有人将双向工程错误的定义为同时支援顺向工程及逆向工程而已。双向工程的主要特点可以是在一个已有软件工件有变更时,同时的同步其他对应的工件,其作法是逐步的在其他工件中加入对应原工作修改的内容。顺向工程可以视为是一种已有规格的特殊双向工程,逆向工程则是可以视为是已有软件的特殊双向工程。许多reengineering的工作也可以视为是双向工程,用之前逆向工程得到的规格,其中进行修改,再修改软件,和规格同步。
双向工程的另一个特点是自动侦测工件中的不一致,自动更新工件。若以这个定义来看,双向工程就和顺向工程及逆向工程不同了,顺向工程及逆向工程可能是人工进行的,也可能是自动的(例如分析规格,自动产生程式码)。自动更新的过程可以是即时的,也可以是在有需求时更新。若是即时的双向工程,在工件变更之后其他工作的对应部分也都会自动更新。若是在有需求时更新的双向工程,工件的作者们可能是同时变更这些工件,其中某个时间比较工件,识别不一致之处,选择要保留的内容,并且避免可能出现的冲突。
双向工程支援迭代式的开发流程。在模型和工件同步后,可以选择继续修改程式,或是修改模型。可以进行任意次数、任意方向的同步。
双向工程的例子
最常见的双向工程例子可能是在UML(统一建模语言)模型以及其对应程式码之间的同步。许多商用软件以及研究用的原型工具支援这类的双向工程,例如Rational Rose、Micro Focus Together、ESS-Model、BlueJ及Fujaba等,Fujaba软件的文件中有提到软件可以识别设计模式[2]。一般而言,针对UML的类别图,可以支援一定程度的双向工程,不过像是关联(association)及组合(containment)等UML概念,在许多编程语言中没有直接对应的表示方式,因此限制了直接建立对应程式码的能力,也影响程式码分析的准确度(例如,不容易识别出程式中的组合概念)。2005年在Microsoft Visual Studio上的一本书中,有指出RTE工具的常见问题,其中一个是所留下的模型会和原有的模型不同,只有透过在工具中的许多标示后,才能让两者同步[3]。UML有关行为的部分对双向工程的挑战更大。
另一种比较可以追踪的双向工程是在框架应用程序接口(API)下的双向工程,有模型描述应用程序应用API的方式,会和应用程序的程式码同步。此应用下,API规定了所有应用程序应用此框架的方式,可以准确及完整的侦测API的使用情式,并且合成实现此用法的程式。此领域的双向工程软件中,有二个主要的软件,是框架定义建模语言及Spring Roo。
在对象管理组织(OMG)的模型驱动架构(MDA)中,要在不同模型之间维持一致,并且在模型和程式码中维持一致,双向工程是其中的关键。对象管理组织提出了QVT(查询/浏览/转换)标准来处理MDA中要求的模型转换。到目前为止,只实现了标准中的部分内容。
软件工程中的例子
以统一建模语言(UML)为基础的双向工程需要三个基本的软件开发元素[来源请求]
- 程式码编辑器
- 针对属性及方法的UML编辑器
- UML结构的视觉化表示
以下是一个以网站为基础的开源简易双向工程工具[来源请求]:
参考资料
- ^ Gentle, Anne. Conversation and Community: The Social Web for Documentation 2nd. XML Press. 2012. ISBN 978-1937434106.
- ^ Stephan Diehl. Software Visualization: Visualizing the Structure, Behaviour, and Evolution of Software. Springer Science & Business Media. 2007: 63. ISBN 978-3-540-46505-8.
- ^ 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.
- ^ JavaScript Class Creator (页面存档备份,存于互联网档案馆), GitHub.
- ^ JointJS (页面存档备份,存于互联网档案馆), GitHub.
- ^ ACE (页面存档备份,存于互联网档案馆).