原來一直使用代碼生成,包括CodeSmith和天平兄的CodeMatic。最近打算系統(tǒng)學習一下Nhibernate,經(jīng)過簡單的一點探索,發(fā)現(xiàn)ORM和代碼生成真是個有千秋。本文側(cè)重比較一下ORM和代碼生成二者的優(yōu)缺點,讓二者華山一比高下,目的為去偽存真,使二者能夠相輔相成。從而更好的提高開發(fā)效率。
本文從下面三個層面對ORM(以NHibernate為首發(fā)的O陣營) 和代碼生成(以CodeMatic為首發(fā)的C陣營)進行比較:
1)針對數(shù)據(jù)庫二者的架構(gòu)層次上的異同
2) 針對應用程序二者在使用和配置上的異同
3) 針對業(yè)務邏輯二者在對變化和復雜度上支持度的異同。
下面就具體針對這三個層面做一下具體分析,這些分析都來源于自己開發(fā)中的一些經(jīng)驗和心得,有些是正確的,有些也存在這樣那樣的問題。寫出來,希望的也只是能拋磚引玉,得到更多朋友,兄弟的幫助和支持。
1) 針對數(shù)據(jù)庫二者在架構(gòu)層次上異同
首先看一下下面這張圖:
ORM針對數(shù)據(jù)庫是由上而下的關系,也就是說ORM并不依賴于數(shù)據(jù)庫。他可以完全從關系數(shù)據(jù)庫中將程序員解放出來,需要程序員小心呵護的是傳遞給nhibernate的persistent object。這看起來更加OO,而代碼生成恰恰相反,代碼生成依賴于關系數(shù)據(jù)庫。它總結(jié)數(shù)據(jù)庫操作的一些共性,將本來需要程序員手寫的代碼自動生成出來。從OO的角度來說,代碼生成的過程并不體現(xiàn)OO思想,但根據(jù)模版或者軟件作者的一些邏輯。生成出來的代碼卻可能具有很好的OO思想。針對數(shù)據(jù)庫來說,ORM是自頂向下的,代碼生成則是自下而上。二者方向恰好相反。
2)針對應用程序二者在使用和配置上的異同
nhinernate的使用需要在原有系統(tǒng)上添加對nhibernate.dll和其他一些相關的dll的引用,而代碼生成則不然,代碼生成是在另外的一個軟件中,通過指定數(shù)據(jù)庫來生成用于操作數(shù)據(jù)庫的文件,將這些文件添加到項目中的時候才可以正常使用。nhibernate最讓人頭疼的就是配置和映射文件的編寫。而代碼生成,如果需要完成復雜的邏輯和自定義的業(yè)務,需要編寫CodeSmith等軟件的模版,這些模版的編寫也不是一件簡單的事情。從使用和配置上看,二者的異同在于
使用方法 | 引用方法 | 配置文件 | |
nhibernate | 系統(tǒng)內(nèi) | 需要添加相關引用 | 需要編寫大量的配置和映射文件。 |
codematic | 系統(tǒng)外 | 不需要添加引用 | 業(yè)務簡單時不需要配置,復雜時需要編寫自定義模版 |
假如原有一個User表,這個表已經(jīng)運行了一段時間。但目前需要在User表里面添加一個可為null的字段:BirthDay,二者對此需求的響應各自是應該是怎么樣的呢?
數(shù)據(jù)庫改動 | 配置改動 | 代碼更改 | |
nhibernate | 無需 | 需要映射文件中添加對BirthDay的映射 | 更改User類,添加屬性BirthDay |
codematic | 需要在User表里面添加一個BirthDay字段 | 不需要更改 | 最佳使用狀態(tài)下需要從數(shù)據(jù)層到業(yè)務邏輯層重新生成代碼,如果以前有改動,則需要手動添加BirthDay向伽相關代碼 |
在這樣一種應用環(huán)境下,分別討論二者如何應付
數(shù)據(jù)表 | 業(yè)務對象 | 配置文件 | 業(yè)務對象的使用 | |
nhibernate | 無需創(chuàng)建 | 手動編寫User,Salary業(yè)務對象。 | 需要編寫配置文件,標示業(yè)務對象的主從關系 | 在二者差生圍度和關聯(lián)時,內(nèi)置支持 |
codematic | 需要創(chuàng)建User和Salary表,并指定主從 | 不需 | 不需 | 產(chǎn)生關聯(lián)和圍度時,需要手工更改數(shù)據(jù)底層和上層業(yè)務代碼 |
更多文章、技術(shù)交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
