翻譯|使用教程|編輯:吳園園|2020-03-31 14:52:11.740|閱讀 508 次
概述:如何輕松為Enterprise Architect創建項目特定的代碼生成器。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
Enterprise Architect是一個對于軟件系統開發有著極好支持的CASE軟件(Computer Aided Software Engineering)。EA不同于普通的UML畫圖工具(如VISIO),它將支撐系統開發的全過程。在需求分析階段,系統分析與設計階段,系統開發 及部署等方面有著強大的支持,同時加上對10種編程語言的正反向工程,項目管理,文檔生成,數據建模等方面。可以讓系統開發中各個角色都獲得最好的開發效率。
您是否曾經想過從Enterprise Architect UML或SysML模型生成代碼?您是否嘗試過自定義Enterprise Architect的代碼模板框架?不要放棄特定于項目的代碼生成器的夢想,而要閱讀它們實現起來的難易程度。
需要代碼生成器
與實現相比,好的軟件或系統架構具有更高的抽象級別。它應該是一個一致的模型,用于記錄決策并忽略不必要的(通常是技術上的)細節。考慮一下圖1中的類圖。它顯示了一個域模型,該模型定義了商店允許客戶訂購商品所需的數據結構。每個類的屬性都進行了詳細建模,但是省略了其他不必要的方面,例如訪問屬性的操作。
圖1:示例UML模型
如果在開始實施之前先對軟件體系結構/設計進行了準備,那么代碼生成可以避免很多繁瑣且容易出錯的工作。商業開箱即用的代碼生成器通常不會更改抽象程度。這就是為什么它們通常不符合項目需求的原因。
可以根據項目特定需求定制Enterprise Architect的代碼模板框架。但這需要一些初步培訓。通常,如基于Eclipse的Enterprise Architect Models的代碼生成中所述,很難達到預期的結果。
一個簡單的項目專用代碼生成器
我更喜歡使用Java或Xtend之類的通用編程語言來實現代碼生成器。由于Xtend具有模板表達,因此特別適合于實現模板。它們允許將可執行代碼嵌入要生成的文本中。感覺就像在編程PHP,JSP或JSX。在代碼清單1只顯示了寫的Xtend代碼生成模板。它為圖1的類圖中聲明的類生成Java類。
package com.yakindu.ea.examples.orderingsoftware.template import com.yakindu.bridges.ea.examples.runtime.codegen.EACodegen import org.eclipse.uml2.uml.Class import org.eclipse.uml2.uml.NamedElement class ClassTemplate { @EACodegen("Java") def String generate(Class element) ''' package ?element.package.javaQualifiedName?; ?val superType = element.generals.findFirst[true]?.name? ?val extends = '''?IF !superType.isNullOrEmpty? extends ?superType??ENDIF?'''? public?IF element.isAbstract? abstract?ENDIF? class ?element.name??extends? { ?FOR attribute : element.ownedAttributes SEPARATOR System.lineSeparator? ?val type = attribute.type?.javaQualifiedName? ?IF 1 != attribute.upper? ?val defaultValue = '''new java.util.LinkedList<?type?>()'''? private final java.util.List<?type?> ?attribute.name? = ?defaultValue?; ?ELSE? private ?type? ?attribute.name?; ?ENDIF? ?ENDFOR? ?FOR attribute : element.ownedAttributes SEPARATOR System.lineSeparator? ?val type = attribute.type?.javaQualifiedName? ?IF 1 != attribute.upper? public List<?type?> get?attribute.name.toFirstUpper?() { return ?attribute.name?; } ?ELSE? public ?type? get?attribute.name.toFirstUpper?() { return ?attribute.name?; } ?ENDIF? ?IF 1 == attribute.upper? ?val params = '''?type? ?attribute.name?'''? public void set?attribute.name.toFirstUpper?(?params?) { this.?attribute.name? = ?attribute.name?; } ?ENDIF? ?ENDFOR? } ''' protected def String getJavaQualifiedName(NamedElement element) { element.qualifiedName.replace("::", ".") } }
清單1:用Xtend編寫的示例代碼生成模板
在顯示生成的Java代碼清單2, 3 和 4看起來并不像手寫的,因為合格的名稱來代替進口。稍后將在圖4中通過方法collectImports和進行改進printImports。
package com.example.orderingsoftware; public abstract class AbstractIDObject { private java.util.UUID id; public java.util.UUID getId() { return id; } public void setId(java.util.UUID id) { this.id = id; } }
清單2:清單1中的代碼生成模板生成的類AbstractIDObject的Java代碼
package com.example.orderingsoftware; public class OrderItem extends AbstractIDObject { private java.math.BigInteger amount; private com.example.orderingsoftware.Article article; public java.math.BigInteger getAmount() { return amount; } public void setAmount(java.math.BigInteger amount) { this.amount = amount; } public com.example.orderingsoftware.Article getArticle() { return article; } public void setArticle(com.example.orderingsoftware.Article article) { this.article = article; } }
package com.example.orderingsoftware; public class Order extends AbstractIDObject { private java.util.Date date; private com.example.orderingsoftware.Customer customer; private final java.util.List<OrderItem> items = new java.util.LinkedList<OrderItem>(); public java.util.Date getDate() { return date; } public void setDate(java.util.Date date) { this.date = date; } public com.example.orderingsoftware.Customer getCustomer() { return customer; } public void setCustomer(com.example.orderingsoftware.Customer customer) { this.customer = customer; } public java.util.List<com.example.orderingsoftware.OrderItem> getItems() { return items; } }
清單4:由清單1中的代碼生成模板生成的Order類的Java代碼
如果仔細查看清單1中的模板,您將意識到它對Enterprise Architect一無所知。取而代之的是,它處理UML元模型的實例,這要歸功于Eclipse UML 2項目,它在Eclipse中可用。YAKINDU EA-Bridge是Enterprise Architect和UML之間缺少的連接。它是一個API,可提供對Enterprise Architect UML和SysML模型的符合UML的讀寫權限。Enterprise Architect項目背后的數據庫會自動轉換為UML元模型的實例。作為開發人員,這具有三大優勢:
YAKINDU EA-Bridge帶有可選的Eclipse IDE集成,該集成允許一個人實現特定于項目的代碼生成器。這些代碼生成器通常是原型開發的,并且僅在特定上下文中執行。因此,至關重要的是,與手動編碼相比,減少開發工作量。要實現特定于項目的代碼生成器,您要做的就是將EAP文件放置在Eclipse項目中,并使用注釋代碼生成模板中的方法@EACodegen。帶注釋的方法應接受應為其生成代碼的UML元素作為唯一參數,并返回生成的文本。如果您的Enterprise Architect模型由遠程數據庫(例如Microsoft SQL Server)托管,則可以使用快捷方式文件 而不是EAP文件。
例如,通過主菜單項“ Project,Clean ...”自動或手動構建項目時,將為所有EAP文件中聲明的所有UML類啟動模板。當然,僅考慮模板項目中存儲的EAP文件。生成的代碼保存在類的限定名稱指定的文件中。文件擴展名由@EACodegen注釋的參數指定。Eclipse項目的結構如圖2所示。
圖2:Eclipse中的示例項目結構
請注意,YAKINDU EA-Bridge是一個API。它允許您以任何方式處理Enterprise Architect模型。實際上,最初的用例是全面的代碼生成器,例如基于UML架構的Autosar RTE生成器。
=====================================================
想要了解或購買Enterprise Architect正版版權,請
關注下方微信公眾號,及時獲取產品最新消息和最新資訊
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: