Sung in Blog

                     一些技術文章 & 一些生活雜碎
          Ruby on Rails已經受到越來越多的重視,更多文章開始關注,Rolling with Ruby on Rails一文比較詳細,也有國人做了翻譯,按這里。這里我們不過多討論ROR(Ruby on Rails),而是探討如何以一個正確的方式快速開發J2EE。

          現在的問題

            現在我們J2EE開發碰到了什么問題呢? 讓我們想象一下使用Spring和Hibernate開發一個J2EE WEB應用是什么樣的:我們需要增加一個新的域對象類型為Person,下面主要的開發步驟:

          1. 創建Person類.
          2. 創建PersonDAO類.
          3. 創建Person數據表.
          4. 定義PersonDAO在Spring的application context XML文件.
          5. 創建Person page頁面和action類.
          6. 增加Person頁面到web框架(如struts)XML配置文件中.
          7. 創建personList頁面來顯示Person實例.
          8. 創建personEdit頁面來編輯Person實例.

            你會確實感慨:真是需要很多步驟啊。

          如何解決?

            關鍵問題是我們開發時不能重復一些步驟,因此必須盡量減少步驟,如果只減少步驟到:

          1. 創建Person類?

            是否只需要第一個步驟就可以?在第一步時,我們花費更多時間精力進行域建模,確定域模型的屬性行為等。其他步驟我們會發現下面的規律:

          • 對于每個實體,我們需要完成應用的基本功能,如 create, retrieve, update, and delete (CRUD).
          • 我們需要每個實體持久化到數據庫.
          • 我們需要數據庫為每個實體創建數據表。
          • 我們需要安排實體之間的關系。

            當然,在復雜應用中,不會只是這些功能,但是如果我們將這些功能通過框架實現,將大大提高我們的開發效率。

          域驅動開發

            域驅動開發(domain driven development framework ),簡稱DDD是一種最新的OO設計概念,它是由ROR和Naked Object組織提出的。

            所謂naked Object是指一個復雜的域對象,這個Object是一個POJO,但是不是一個傻傻的完全是屬性的POJO,而是封裝了業務邏輯的POJO,注意這里是最大的區別,一般業務邏輯我們是通過另外的Service類來實現,然后在Service中封裝的transaction script(Martin Fowler卻稱為貧血模型) , naked Object則是合并起來的(有的類似回歸傳統了,符合Martin Fowler審美觀了),但是,這種純OO是和SOA()思想矛盾的(Service-Oriented vs. Object-Oriented ),可見Adventures in SOA(puts the business logic in service-like methods instead of on the object, service method -> business method --> persistence method) )

            個人感覺整個軟件好像一直在玩0或1的游戲,不過也許最復雜的體系就是來自最簡單的抉擇,如股票/匯市等投資領域也如此。

            naked Object提出現在J2EE開發和裸體對象DDD開發下的圖:

            通過這張圖我們可以看到,以前方式造成J2EE開發層次之間調用混亂,修改和拓展非常不方便,而在右邊的DDD開發方式下,界面(邊界)對象就是域對象就是持久化的實體BO,沒有多余的Contorller或Action了。原來Domain層被服務層Service layer遮擋,在右圖中,則Domain層直接暴露給前臺了,所以Domain沒有東西被遮蓋,裸露了,稱為Naked(裸露) Objects.

          現在怎么辦?

            ROR提倡的DDD方式引起了眾多J2EE開發者的興趣,在各大Java媒體正在引起廣泛的討論,但是ROR不是Java的,那么有無基于Java的DDD開發框架呢?

            目前有不少DDD開發框架正在誕生中,Jdon框架正是在ROR這種精神指引下的一款快速開源開發框架,Jdon框架1.2.2版本雖然不是一個完全意義上的Naked Object,基于Service-Oriented 架構,但是已經初步具備上圖右邊開發流程,具體可參考Jdon Sample的開發流程

            使用Jdon框架開發J2EE應用系統,最重要的一個前提是:設計好你的域對象,然后在將域對象復制到表現層,變成表現層的ActionForm/ModelForm;將域對象直接在持久層使用Hibernate/iBatis等持久化到數據庫;如果使用EJB的實體Bean持久化技術,將無需實現建立數據表;應用系統部署時,J2EE容器將直接根據實體建立數據表,也可節省前面步驟中兩個步驟。

            當然,目前Jdon框架是采取分離手法,遵循橋模式,將抽象和行為分離,每個域對象對應一個操作它的服務類或DAO類,服務類主要用來封裝業務邏輯層,然后將業務Service作為一個業務組件暴露給表現層的Controller/Action類,而Controller/Action則無需代碼,只要通過如下配置即可完成:

          <model key="username" class="com.jdon.framework.samples.jpetstore.domain.Account">
            <actionForm name=
          "accountForm"/> //指定邊界類
            <handler>
              <service ref=
          "accountService"> //指定某個業務接口
                <getMethod name=
          "getAccount"/>
                <createMethod name=
          "insertAccount"/> //業務接口的新增方法
                <updateMethod name=
          "updateAccount"/> //業務接口的修改方法
                <deleteMethod name=
          "deleteAccount"/>
              </service>
              </handler>
          </model>

            通過上述配置,凈化了上圖中應用控制層(Application or Controller layer)和Domain Layer之間對應關系,變得有條理而且明晰。

            隨著Naked Object 被越來越多人認識和應用成熟,Jdon框架也將轉向支持另外一個純OO流派Naked Object, 就象它同時支持POJO派和EJB派一樣。

            在Jdon框架以后版本中,會很方便支持Naked Object,只要將上面配置文件指向Service去除,CRUD方法由Model自己實現,如下:

          <model key="username" class="com.jdon.framework.samples.jpetstore.domain.Account">
            <actionForm name=
          "accountForm"/> //指定邊界類
            <handler>
             <!-- <service ref=
          "accountService"> //指定某個業務接口 無需業務層,去除-->
                <getMethod name=
          "getAccount"/>
                <createMethod name=
          "insertAccount"/> //業務接口的新增方法
                <updateMethod name=
          "updateAccount"/> //業務接口的修改方法
                <deleteMethod name=
          "deleteAccount"/>
             <!--  </service> -->
            </handler>
          </model>

          posted on 2005-10-24 11:15 Sung 閱讀(206) 評論(0)  編輯  收藏 所屬分類: Thinking in Design
          主站蜘蛛池模板: 桃源县| 沙坪坝区| 手机| 镇原县| 乐昌市| 清水河县| 海兴县| 体育| 石嘴山市| 密云县| 嘉黎县| 淅川县| 宁南县| 新绛县| 酉阳| 佛冈县| 利辛县| 邮箱| 江油市| 齐齐哈尔市| 正安县| 扎兰屯市| 枣阳市| 景东| 启东市| 广安市| 迭部县| 吉安县| 临颍县| 拉孜县| 观塘区| 太仆寺旗| 黔江区| 新田县| 子洲县| 汶川县| 射洪县| 云安县| 新建县| 绥棱县| 沽源县|