雙向工程
雙向工程(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 (頁面存檔備份,存於網際網路檔案館).