中國有句古語叫做“工欲善其事,必先利其器”,用通俗的話來說就是“磨刀不誤砍柴功”,古人的這些話告訴我們:要把事情做好,事先應該準備合適的工具。工具不僅僅包括器具,還包括思想、理論、經驗、道德、法律等一切能解決問題的有形和無形的東西。
工具有好和壞、適用和不適用之分。比如當你只是需要看一看文本文件的內容時,那麼 Notepad 就是一個很好的工具。但是有些人不辨好歹,盲目地“以不變應萬變”,“只用 NotePad 完全手寫代碼”並且以此爲榮,“實乃兵家之大忌”。
閒話少說,言歸正傳。
在你需要一些重複或者相似的代碼時,就應該準備好一款名叫“代碼生成器”的利器。說到代碼生成器,很多人誤以爲它只能生成程序代碼。其實一款靈活的代碼生成器還能夠生成報表、幫助等一切文本或基於文本的文件(比如 CHM);好的代碼生成器的數據來源不僅僅是數據庫架構,也可以是數據庫數據,還可以是 XML 等其它數據。
代碼生成器根據生成邏輯的存儲方式可以分爲兩種:程序固化的和基於模板的。
程序固化的方式將生成代碼的邏輯存儲在生成器中,一般是通過編寫一些字符串的串連代碼,這些代碼在運行時生成用戶的代碼。
基於模板的方式將生成代碼的邏輯存儲在生成器之外的模板文件中,用戶可以根據實際需要修改相應的模板,或者自行開發合適的模板。
基於模板的代碼生成方式又可以分爲:基於標記的和基於編程的。
基於標記的方式定義一套標記規則,在模板中按需插入特定的標記,當這些模板被生成器調用時,標記就被替換爲相應的內容,類似於宏替換。
基於編程的方式很像 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+ |
連接串編輯器 |
√ |
× |
√ |
篩選表、字段、關係 |
× |
× |
√ |
表、字段、關係別名 |
√ |
× |
√ |
合併數據架構 |
× |
× |
√ |
定義模板參數 |
√ |
√ |
√ |
定義模板界面 |
√ |
× |
√ |
架構(表、字段、關係等)篩選的重要性:一般的應用都會劃分爲幾個不同的部分,每部分一般對應到不同的表(一般會有所重疊),按照應用的不同將數據庫架構劃分爲相應的子架構,更有利於開發、管理和維護。
設置別名的重要性:有時表名、字段名等由於種種原因(比如國內的一些系統經常用拼音縮寫,從一個拼音縮寫反推原來的名稱真是比翻譯天書還難)不符合實際時,別名能使之更易讀,更準確