Powerdesigner是我最喜歡的建模軟件,其功能最全,易用性最好,使用感受最舒服。可擴展性也非常好。
Powerdesigner對MDA的支持很靈活。其實,MDA工具所要做的事情,就是UML模型與代碼間的雙向轉換:從模型可以生成代碼;從代碼可以生成模型。這里面有兩個關鍵點:
1、模型生成的代碼不能是垃圾代碼,要正確,還要符合我們所指定的編碼規范——尤其是注釋。
2、從代碼到模型再到代碼時,原始代碼中的所有內容應當充分保留。不應發生注釋或方法體丟失。
我根據特定的編碼規范,通過二次定制powerdeisgner的java 5語言成功實現了上述MDA特性。
在powerdesigner中,編程語言完全是一個定制項。其全部特征信息都記在一個后綴名為xol的xml文件中。比如java5的定制文件是Powerdesigner 12\Resource Files\Object Languages\java5-j2ee14.xol
專家級牛人可以通過修改這類文件達到任何目錄。對于我來說,xol文件太長,有太多的cdata,不好搞,還是通過powerdesigner中的“edit current langauge"來修改比較好。
在powerdesigner中點擊language->edit current language,就會出現語言特性編輯界面。要編輯它比較容易,下面就幾個關鍵特性舉例說明。
1、每個java文件最頭部的聲明性注釋。位于文件最頂部,在package和import語句的前面。
2、類注釋,也就是javadoc注釋,位于類聲明之前,import語句之后。Powerdesigner直接支持它。
我們的@version內容不是一行代號,而是一個revision history。所以有必要調整輸入框:在上圖中將Data Type由String改為Text。這樣就可以在一個彈出的多行文本編輯框中編輯缺省值。如下圖所示。
如果定制模板,可以引用變量,如%@author%, %Model.Author%, %CurrentDate%等,但上面缺省值編輯中不能引用變量。此外,Powerdesigner對于日期的格式化只是簡單的輸入缺省格式。
這樣在類和接口的屬性窗口中,java doc version就不再是一個單行文本編輯框了。
3、最后輸入的javadoc注釋格式有點不符規范。可修改如下。
這樣,最后輸出的結果就很漂亮了。
上面的@pdOid是可以刪掉的,因害怕影響逆向工程的同步,我沒有動它。
4、上面收尾的"*/"沒有換行,可以在BaseObject.javaDocComment中修改。
5、Javadoc要求每個包有個package.html。
6、我們不用EJB了,把多余的EJB原型(Stereotype)全部刪掉。類和接口下也有,都可以刪掉。
Powerdesigner生成java代碼的定制雖然強大,但也有不足。比如在模型中給類添加了一些屬性,然后讓其自動生成setter方法。這些setter方法中的參數是以"new"會前綴的,想把"new"改成"p"基本上做不到。究其原因,是這個方法的聲明來自自動生成腳本,我們無從定制。
Powerdesigner的逆向工程功能也很棒!不過要注意兩個設置。一是保留@pdOid注釋。二是確認是否刪除代碼中不存在的類、方法和屬性。如下圖所示。
上面的Deletion缺省是不選中的。就是說不刪除模型中存在,但代碼中不存在的類,屬性和方法及方法中的參數。對于類來說刪不刪各有所好。對于屬性和方法來說有點不合理。對于方法中的參數來說就是個災難性的錯誤。
比如,模型中的有個方法someMethod(String parameter),在源代碼中、參數的類型由String改成int: someMethod(int parameter),保持名稱不變。如果不選Deletion,最終結果會是:SomeMethod(String parameter, int parameter2)。
@pdOid是專為逆向工程服務的。有了它,Powerdesigner就以它為唯一標識來識別類,屬性和方法。即使在類、屬性或方法的名稱發生變化的情況下,它仍能正確逆向的更新模型。
在沒有@pdOid時,如果發生類名的變化,Powerdesigner會新增一個類,并刪去舊類(當選中Deletion時)。引用這個類的時序圖或類圖將發生類丟失的現象。
除了定制生成代碼的模板外,Powerdesigner也支持自定義逆向工程——從java 代碼到OOM模型。如下圖所示。
但是,我們并不能擴展Powerdesigner內內置的逆向工程,只能自己做一個全新的。這樣做的工作量就太大了。
Powerdesigner已有的逆向工程在注釋的轉換上存在較大的問題:只支持有限的注釋聲明。比如Java5中的泛型參數的注釋@param <V>就不支持,Powerdesigner會認為不存在這個參數,而忽略這個注釋。
這個功能的缺失直接破壞了正向->逆向->再正向的循環——當你再正向時,原來辛辛苦苦寫的注釋有一部分丟失了。

Powerdesigner是個讓人想愛又想恨的軟件。它的缺點和優點一樣突出:首先就是價格超貴,不是一般的公司能承受的,更別提個人了:( 其次它總是會在重要功能上出現幾個麻煩的bug。比如12.1版本,序列圖中居然無法從調用方法列表中選取方法。這個bug在12.5中已經解決。我使用的是試用版。
最后還有一個問題就是對java5的新特性的支持還不到位。泛型的注釋在轉換過程中會丟失。