寫(xiě)程序,做產(chǎn)品,過(guò)日子

          成功其實(shí)很簡(jiǎn)單,就是強(qiáng)迫自己堅(jiān)持下去

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            69 Posts :: 1 Stories :: 92 Comments :: 0 Trackbacks

          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ì)丟失。

          posted on 2007-05-04 15:57 Welkin Hu 閱讀(1335) 評(píng)論(1)  編輯  收藏 所屬分類: 軟件開(kāi)發(fā)

          Feedback

          # re: 定制Powerdesigner Profile,實(shí)現(xiàn)個(gè)性化的雙向MDA[未登錄](méi) 2011-08-31 09:23 zhou
          太感謝了,這篇文章非常有用,剛剛接觸Powerdesigner 一直不知道在哪里改模板  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 平凉市| 彰化县| 无极县| 伊宁县| 曲松县| 蓬安县| 北票市| 大庆市| 台南县| 兰西县| 新沂市| 西昌市| 泽库县| 武强县| 西丰县| 孟连| 治多县| 东城区| 蒙自县| 许昌县| 南京市| 昌黎县| 綦江县| 南丰县| 武清区| 永胜县| 彰武县| 华亭县| 岳西县| 武山县| 怀远县| 苏尼特右旗| 青田县| 宜川县| 铜山县| 吉安市| 陆河县| 六盘水市| 大庆市| 怀化市| 永寿县|