自訂 Astah Professional 的 Templates Scripting Language
圖片取自:https://jstermask.github.io/anycode/index.html
前言
之前曾試用 Astah Community 就被其強大的功能所吸引,而且期繪製 UML 圖形的(方式/Style) 比較符合 UML OMG 官方組織的規範,即便在我已經慣用 EA 的情況下,我仍然有時候,有些圖形我會使用 Astah 來畫。
問題描述
因為 Astah 是由 Java 所開發,即便 (UML/Professional) 版本支援【Export C#】的 MDA (Model Driven Architecture) 功能,但匯出的 C# 檔案總是與 C# 3.0 之後的語言版本格格不入,因為熟悉 C# 的開發人員都知道,C# 的 get and set accessor 到了 C# 3.0 時代已經加入了 Auto-Properties 的功能,也就是說,我可以將原先比較囉嗦的寫法:
縮短改成如下,這叫做 Auto-Properties
但是,當我們使用 Astah Professional 所提供的 Export C# 功能時,如下 Class Diagram 中的 Account
在我們使用 Export C# 功能匯出 C# 程式碼時(如下視窗可讓我們自由選擇Class)
但美中不足的是,即便你有勾選『Export properties as C# 3.0 automatic properties』但是透過 Astah Professional 所產生的 C# Class 檔案中每一個 Properties 卻還是如下:
由此可見,Astah 對於 C# 的支援並不是那麼友善,又或者說,Astah 所支援的 C# 根本還停留在 C# 1.0 的年代,而且不光是 Astah 有這個問題,還有許多 UML Case Tool 對於 C# 語言的支援都不是那麼友善,包括 EA 也是,這我就不一一點名了。
對 C# 支援最完整的還是 Visual Studio 提供的塑模化 Modeling 的功能了,可惜的是官方到了 Visual Studio 2017 時就拿掉了 Modeling 的功能,理由是塑模化的功能很少人用,但這不能當作理由吧?XDDD 因為企業內部真正重要的事情往往在目前的商業議題不重要也無法立即賺到錢,但是往往這是比較重要的。
所幸,在 Astah 裡,不是沒有解決辦法,因為 Astah 所支援的擴充 Plug-In 功能非常強大,官網也提供不少可用的 Plug-In,這也是我從眾多 UML Case Tool 挑選 Astah 的主要原因之一。
因為現有的 Export C# 並無法滿足我們的需求,於是爬文後發現,其實 Astah 有一個 Plug-In名稱為 Any-Code-Generate
他由 jstermask 所開發,正確的來說並不是官方所開發的,AnyCode 的 Github 在這裡:https://github.com/jstermask/anycode ,這個 Plug-In 真正強大的地方在於它還支援一種 Template Scripting Language,它是一種很像 .NET 的 T4 Language 或 ASP 的腳本語言,透過 Scripting Language 你幾乎可以想要 Generate 什麼程式語言就可以產生什麼語言,可謂相當強大。
官方網站已經提供 Java/PHP.. 等語言的 Scripting Language 範本,但是就是沒有 C# 的….. 看樣子有在使用 UML 的還是以 Java 的開發者居多,從 20 年前就是如此,現在似乎也還是如此,這幾乎可以解釋為什麼大部分撰寫 Java 的程式員的系統分析設計的功力都比較好,這是真的是不爭的事實,但這與 Astah 支援 C# 不友善應該也沒有直接關係,這也是我一直以來注重 OOA/OOD 的原因之一,不過.. 當然這是老調重彈了。。。(順便工商服務一下:決戰 OOAD 系列課程-使用UML 線上版現正錄製中… XD)
原歸正傳,參照官方文件,建立【MyTemplate-name.mda】與【MyTemplate-content.mda】這兩個檔案後,
並設定好 Any-Code 的 Template directory 與 Target directory 後,如下圖:
接著,我們可以得到如下的 Java 程式碼:
我們看到,透過 Any-Code 所產生的 Java 程式碼非常的漂亮,這與內建的 Export Java 功能幾乎沒什麼不同,先撇開 Java 的 setter & getter 不說,我們希望有一個 C# 的 Scripting Language 樣板可以套用阿阿阿…. 結果我翻片了 Google 後,居然都沒有人有撰寫 for C# 的 Scripting Language 樣板,心想,不會吧?難道說,都沒有撰寫 C# 的開發人員再用 Astah?啥密?有沒有那麼誇張!?難道都沒有 MDA 的需求嗎?
事到如今,我們只好自己撰寫了,所幸 Scripting Language 也是使用 Java 的語法,本身並不太難,撰寫起來跟 JSP 有點像,於是,我將官網的 MyTemplate-name.mda 的內容副檔名改為 .cs,接著將【MyTemplate-content.mda】修改成如下:
因為大致看了一下語法後,認為不難理解,從程式碼當中,可以看的出來,沒有 <% %> 包起來的部分都是當成字串原封不動的輸出,第一行的 package TempPo.Web 就是 java 當中的 package 概念,而 getFullyQualifiedName() 這個方法應該就是將 Astah 中我們在 (Package/資料夾) 中的階層完整輸出而已,其實早期 UML 真的是 Support Java的,所以在 OMG 的規範下畫圖也都是以 Package 方式來切割 (這不是重點 XD)。所以,這邊對應到 .NET 是 using 的概念,所以我直接改程式。
再來,[<% def atts = c.attributes %>]這段明顯是在取出 Entity 所有的 Attributes,然後跑一段 foreach 將所有 Properties 秀出來,而 C# 的 Auto-Properties 就是在原有 PropertyName 後面接上 { get; set; } ,所以看起來也不難改對吧?
最後,我們來直接看結果好了,一樣執行 Any-Code 的 Generate 的結果我們成功的得到一個 C# 的 Class 如下:
結語:
在 Astah Professional 哩,透過 any<code/> Plug-in 幾乎可以滿足我們所有各種程式語言 MDA 的需求,不愧一套強大的 UML Case Tool。
參考資料:
http://astah.net/features/plugins
https://jstermask.github.io/anycode/index.html
http://astah.net/features/anycode-plugin
https://jstermask.github.io/anycode/documentation/templating-guide.html
https://astahblog.com/2013/02/07/astah_script_plugin/
留言
張貼留言