<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    差沙的密碼 -- SSHWSFC's code
    閱讀本Blog請自備塑料袋一只
    posts - 14,  comments - 59,  trackbacks - 0
    這兩天找點時間看了看jbpm,其設計思想相當不錯,功能強勁,而且幾乎實現了工作流模型的所有要求。可擴展的思想也是貫穿了整個jbpm的設計思路,這都是能看得出來的優勢。但是這也僅僅是限于表面的一兩眼,如果真的研究起其代碼來,你會驚訝的發現Jbpm的代碼漏洞百出,其設計思想完全沒有發揮出來,應該說,Jbpm的代碼真是“秀逗”了。下面來舉幾個例子吧。另外,我還沒有看svn上的最新代碼,所以可能有的問題jbpm自己已經修復,那就謝天謝地了。下面的代碼基于jbpm3.1

    秀逗1。無中生有

    看到最核心的JpdlXmlReader代碼真實欲哭無淚,如果好好精簡精簡,至少能踢掉1/3的代碼。而其中甚至有些無中生有的代碼:
    if?(?(actorId!=null)
    ???????????
    ||?(pooledActors!=null)?
    ?????????)?
    {
    ????????assignmentDelegation.setProcessDefinition(processDefinition);
    ????????assignmentDelegation.setClassName(
    "org.jbpm.taskmgmt.assignment.ActorAssignmentHandler");
    ????????String?configuration?
    =?"";
    我們看到,如果符合之前的條件,就用代理類來代理org.jbpm.taskmgmt.assignment.ActorAssignmentHandler這個類,但是找了好半天也沒有找到這個類。。。。 難道是讓用戶在自己的項目中用這個類么?還是為了兼容原來的程序,,就算是其中一種,但是,可但是,這個條件根本就不可能滿足,也就是說這是段廢話,而且還無中生有的出來個ActorAssignmentHandler。。

    秀逗2。畫蛇添足

    應該是我的基本功不都扎實,實在是高不明白下面的代碼在干什么。。。
    ??public?void?setActorId(String?actorId)?{
    ????DefaultAuthenticationService?authenticationService?
    =?(DefaultAuthenticationService)?services.getAuthenticationService();
    ????DefaultAuthenticationService?defaultAuthenticationService?
    =?(DefaultAuthenticationService)?authenticationService;
    ????defaultAuthenticationService.setActorId(actorId);
    ??}
    先強制轉換成DefaultAuthenticationService,然后再強制轉換成DefaultAuthenticationService。。。。
    而且這里這么設計基本上就把DefaultAuthenticationService實現的AuthenticationService接口晾在那里了,根本就是應該用AuthenticationService這個接口來說話才對。jbpm的service設計的擴展性很強,可自己配制。但如果這么用service的話,再怎么擴展也沒用。

    秀逗3。莫“名”其妙

    Jbpm中變量的名字真的莫名其妙,很多明明是Map的類型他叫xxList,而不是Map的類型,他卻叫xxMap。這個地方我相信應該是能體現出程序員編寫程序的嚴謹性的地方,而Jbpm作的還不夠好。

    秀逗4。固若金湯

    Jbpm的擴展性貫穿始終,但是在最重要的泳道的擴展上卻小家子氣起來。看看泳道類代理的擴展代碼。
    if?(expression!=null){
    ????????assignmentDelegation.setProcessDefinition(processDefinition);
    ????????assignmentDelegation.setClassName(
    "org.jbpm.identity.assignment.ExpressionAssignmentHandler");
    ????????assignmentDelegation.setConfiguration(
    "<expression>"+expression+"</expression>");
    ??????
    ????}
    寫的很明確,如果泳道使用表達式來表示的那么就用代理類來代理處理表達式。。我本想,太好了,寫我自己的表達式,然后代理交給Acegi來根據表達式分配ActorId,但是,可是,但可是。他的代理類居然是寫死的,寫得就是自己的java.identity包里面的東西,不是說java.identity設計的不好,但是一個綜合系統的用戶角色管理系統是不可能跟著你的jbpm走的。強行要加入的java.identity的設計有點保護自我的意思,真的固若金湯,讓我結合acegi的想法又是難上加難。(不過還是有辦法的。大家自己找找看)。

    秀逗5。口徑不一

    口徑不一就是指兩個程序部分的結合不一致。這種例子很多,我舉一個程序和xsd的沖突的例子。
    Instantiator是jbpm代理里面一個比較不錯的概念。代理功能之一是生成代理的類的實例,而Instantiator則是負責生成實例的機制,這個Instantiator設計的不錯,可以在配制文件中的config-type屬性來擴展。看程序。
    ??????//?find?the?instantiator
    ??????instantiator?=?(Instantiator)?instantiatorCache.get(configType);
    ??????
    if?(instantiator?==?null)?{
    ????????
    //?load?the?instantiator?class
    ????????Class?instantiatorClass?=?classLoader.loadClass(configType);
    ????????
    //?instantiate?the?instantiator?with?the?default?constructor
    ????????instantiator?=?(Instantiator)?instantiatorClass.newInstance();
    ????????instantiatorCache.put(configType,?instantiator);
    ??????}
    這里的設計很人性化,可以根據configType來用自己的構造器,但是xsd卻不這么想。
    ??????<xs:attribute?name="config-type"?default="field">
    ????????
    <xs:simpleType>
    ??????????
    <xs:restriction?base="xs:string">
    ????????????
    <xs:enumeration?value="field"/>
    ????????????
    <xs:enumeration?value="bean"/>
    ????????????
    <xs:enumeration?value="constructor"/>
    ????????????
    <xs:enumeration?value="configuration-property"/>
    ??????????
    </xs:restriction>
    ????????
    </xs:simpleType>
    ??????
    </xs:attribute>
    可以看到它限制了4種類型,別說使用自己的構造器了,就連他自己的XmlInstantiator都不再考慮范圍之內,真是大義滅親呀。。

    構造器來這里的作用很大,我寫了自己的spring構造器,構造的時候使用beanFactory來構造,這樣就算是存在數據庫里面的class也能當作spring的bean來處理。但是如果用xsd的話就會導致交驗錯誤,所以索性把xsd去掉了,還好一切正常,就是感覺別扭點。

    秀逗N。。。 能夠看得出來Jbpm需要提高的地方還很多。但是這些問題應該是一些開發人員的小疏忽,相信在以后的版本中可以改進。不管再怎么秀逗,Jbpm在工作流中仍然保有著強勁的地位,對BPM模型的實現也作的最為全面。而jbpm的par熱部署和IDE也是整個系統中的兩大亮點,這些優點都是不可不提的,所以我仍舊支持Jbpm,希望他能更加迅速的發展壯大起來。。。。

    PS:文中錯誤之處還望大家指出,我希望有些“秀逗”是我自己秀逗了。
    posted on 2006-08-24 11:07 差沙 閱讀(5744) 評論(7)  編輯  收藏 所屬分類: avaj

    FeedBack:
    # re: 秀逗的JBPM
    2006-09-12 10:09 | freizl
    看到jbpm里的這個H3.xml,不知道能不能算個秀逗得?
    <map>定義里的table屬性并不適用于one2many(Hibernate-Reference)

    <hibernate-mapping default-access="field">

    <subclass name="org.jbpm.file.def.FileDefinition"
    extends="org.jbpm.module.def.ModuleDefinition"
    discriminator-value="F"
    lazy="false">

    <map name="processFiles" table="JBPM_PROCESSFILES" cascade="all">
    <key column="FILEDEFINITION_" foreign-key="FK_BYTEARR_FILDEF" />
    <index column="NAME_" type="string" />
    <one-to-many class="org.jbpm.bytes.ByteArray" />
    </map>

    </subclass>

    </hibernate-mapping>  回復  更多評論
      
    # re: 秀逗的JBPM
    2006-09-19 14:00 | jackd
    about 秀逗1。無中生有
    you can checkout from cvs..
    it has ActorAssignmentHandler.  回復  更多評論
      
    # re: 秀逗的JBPM
    2006-09-20 14:12 | 家有小貓's Java Blog
    部分說法是正確的,例如第一個,我自己寫了個org.jbpm.taskmgmt.assignment.ActorAssignmentHandler,發現居然永遠用不到.

    你當然也可以自己寫個org.jbpm.identity.assignment.ExpressionAssignmentHandler,不使用jbpm的identity.相信將來jbpm會將這部分做成可配置的.

    至于構造器,我不明白你為什么非要使用Spring的構造器.  回復  更多評論
      
    # re: 秀逗的JBPM
    2006-10-08 15:16 | coolfish
    樓主現在有什么好辦法把jbpm和自己用戶系統結合起來么.
    還有Assignment expressions 有些不太明白  回復  更多評論
      
    # re: 秀逗的JBPM
    2007-04-24 16:08 | 差沙
    @家有小貓's Java Blog
    才發現這個回復,用spring的構造器,可以注入spring的bean。  回復  更多評論
      
    # re: 秀逗的JBPM
    2008-05-22 10:03 | 網友
    @freizl
    我想知道在那里可以找到這個表 table="JBPM_PROCESSFILES"
    我的jbpm數據庫里面沒有這張表, 所以調用的時候老拋空指針異常  回復  更多評論
      
    # re: 秀逗的JBPM
    2008-07-23 14:36 | gabriel
    @網友
    傻子。。那有這個表啊  回復  更多評論
      
    這家伙很懶,但起碼還是寫了一句話。

    <2006年8月>
    303112345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(8)

    隨筆分類

    隨筆檔案

    文章分類

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲高清中文字幕综合网| 亚洲日本中文字幕| 免费在线黄色电影| 亚洲成人一级电影| 亚洲А∨精品天堂在线| 久久久久免费精品国产小说| 自拍日韩亚洲一区在线| 亚洲婷婷国产精品电影人久久| 88av免费观看入口在线| 国产亚洲精品美女2020久久| 亚洲福利视频导航| 亚洲 无码 在线 专区| 91嫩草免费国产永久入口| 美女裸体无遮挡免费视频网站| 亚洲成人在线免费观看| 亚洲中文字幕在线无码一区二区| 中文字幕精品亚洲无线码一区| 毛片免费全部免费观看| 久久美女网站免费| 日本免费精品一区二区三区| 国产亚洲sss在线播放| 亚洲人成无码网站在线观看 | 羞羞视频网站免费入口| 特级毛片免费播放| CAOPORN国产精品免费视频| 亚洲av中文无码乱人伦在线观看 | 91精品免费久久久久久久久| 99在线精品免费视频九九视| 免费一级毛片无毒不卡| 亚洲黄色免费电影| 一级成人a毛片免费播放| 2022久久国产精品免费热麻豆| 免费A级毛片无码无遮挡内射| 亚洲欧洲免费视频| 久久国内免费视频| 又爽又黄无遮挡高清免费视频| 国产va精品免费观看| 亚洲免费网站在线观看| 在线A级毛片无码免费真人| 9久9久女女免费精品视频在线观看 | 国产亚洲精品看片在线观看|