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