中國有句古語叫作「工欲善其事,必先利其器」,用通俗的話來講就是「磨刀不誤砍柴功」,古人的這些話告訴咱們:要把事情作好,事先應該準備合適的工具。工具不只僅包括器具,還包括思想、理論、經驗、道德、法律等一切能解決問題的有形和無形的東西。數據庫
工具備好和壞、適用和不適用之分。好比當你只是須要看一看文本文件的內容時,那麼 Notepad 就是一個很好的工具。可是有些人不辨好歹,盲目地「以不變應萬變」,「只用 NotePad 徹底手寫代碼」而且以此爲榮,「實乃兵家之大忌」。編程
閒話少說,言歸正傳。網絡
在你須要一些重複或者類似的代碼時,就應該準備好一款名叫「代碼生成器」的利器。說到代碼生成器,不少人誤覺得它只能生成程序代碼。其實一款靈活的代碼生成器還可以生成報表、幫助等一切文本或基於文本的文件(好比 CHM);好的代碼生成器的數據來源不只僅是數據庫架構,也能夠是數據庫數據,還能夠是 XML 等其它數據。架構
代碼生成器根據生成邏輯的存儲方式能夠分爲兩種:程序固化的和基於模板的。編程語言
程序固化的方式將生成代碼的邏輯存儲在生成器中,通常是經過編寫一些字符串的串連代碼,這些代碼在運行時生成用戶的代碼。編輯器
基於模板的方式將生成代碼的邏輯存儲在生成器以外的模板文件中,用戶能夠根據實際須要修改相應的模板,或者自行開發合適的模板。ide
基於模板的代碼生成方式又能夠分爲:基於標記的和基於編程的。工具
基於標記的方式定義一套標記規則,在模板中按需插入特定的標記,當這些模板被生成器調用時,標記就被替換爲相應的內容,相似於宏替換。學習
基於編程的方式很像 ASP/JSP/PHP,它採用一種編程語言(或在多種中選擇一種),將程序代碼和文本代碼混合在一塊兒,並經過必定的標記(好比<%%>)來區分。這類模板其實就是一個應用程序,它運行的結果就是用戶須要的代碼。開發工具
下面咱們來看看這幾種生成方式的比較,首先從開發商的角度來看:
項目\類型 |
程序固化 |
基於模板 |
|
基於標記 |
基於編程 |
||
生成邏輯 |
在生成工具中 |
在模板文件中 |
在模板文件中 |
開發難度 |
低 |
適中 |
高 |
可維護性 |
差 |
好 |
好 |
維護成本 |
高 |
低 |
低 |
再從用戶的角度進行對比:
項目\類型 |
程序固化 |
基於模板 |
|
基於標記 |
基於編程 |
||
方便性 |
好 |
好 |
好 |
擴展性 |
差,用戶沒法本身定製 |
好,用戶能夠按需定製 |
好,用戶能夠按需定製 |
適應性 |
差 |
好,但沒法適應複雜狀況 |
很好 |
定製成本 |
沒法定製 |
須要學習一套標記規則 |
須要學習模板編程規則 |
目前網絡上比較有影響的代碼生成工具都採用基於編程的模板技術。
網絡上還有一些號稱也是「基於模板」的代碼生成器,也將代碼生成邏輯存儲在「模板文件」中,在「模板文件」中經過編寫一系列的程序代碼將字符串串連起來,既不是採用標記的方式,也不是採用類 ASP/JSP/PHP 的方式,其本質上和程序固化的方式並沒有區別,所以不在本文討論之列。
下面我將列舉三種具備表明性的代碼生成器進行對比,對比的內容均來自官方網站或其文檔,供你們選擇時參考。
MyGeneration :在 download.com 上保持下載量第一的 .NET 開發工具。
CodeSmith :得到 aspnetpro.com 用戶評選的最佳工具獎。
CodeAuto :最具發展潛力的代碼生成工具。
項目\軟件 |
MyGeneration |
CodeSmith Pro |
CodeAuto |
性質 |
|||
免費 |
√ |
× |
√ |
源代碼 |
× |
× |
√ |
模板 |
|||
類ASP語法 |
√ |
√ |
√ |
模板語言 |
C#,JScript, VB.NET,VBScript |
C#,VB.NET, JScript |
Nuva |
IDE |
√ |
√ |
CodeAuto Studio |
支持命令行 |
√ |
√ |
√ |
Visual Studio 集成 |
× |
√ |
× |
已有模板數量 |
不少 |
多 |
11 |
架構 |
|||
支持數據庫種類 |
12 |
1+ |
5+ |
鏈接串編輯器 |
√ |
× |
√ |
篩選表、字段、關係 |
× |
× |
√ |
表、字段、關係別名 |
√ |
× |
√ |
合併數據架構 |
× |
× |
√ |
定義模板參數 |
√ |
√ |
√ |
定義模板界面 |
√ |
× |
√ |
架構(表、字段、關係等)篩選的重要性:通常的應用都會劃分爲幾個不一樣的部分,每部分通常對應到不一樣的表(通常會有所重疊),按照應用的不一樣將數據庫架構劃分爲相應的子架構,更有利於開發、管理和維護。
設置別名的重要性:有時表名、字段名等因爲種種緣由(好比國內的一些系統常常用拼音縮寫,從一個拼音縮寫反推原來的名稱真是比翻譯天書還難)不符合實際時,別名能使之更易讀,更準確