由淺入深:自己動手開發模板引擎——什么是模板引擎


受到群里兄弟們的竭力邀請,老陳終於決定來分享一下.NET下的模板引擎開發技術。本系列文章將會帶您由淺入深的全面認識模板引擎的概念、設計、分析和實戰應用,一步一步的帶您開發出完全屬於自己的模板引擎。關於模板引擎的概念,我去年在百度百科上錄入了自己的解釋(請參考:模板引擎)。老陳曾經自己開發了一套網鳥Asp.Net模板引擎,雖然我自己並不樂意去推廣它,但這已經無法阻擋群友的喜愛了!

最初的模板引擎是為了實現業務邏輯和代碼分離,后來發現這樣的模式給界面維護帶來了極大的便利,這也是一種MVC模式的實現。現在我們在很多地方都可以看到模板引擎的身影,比如各種CMS、論壇、代碼生成器,甚至是Mootools、JQuery等JavaScript庫都用到了模板引擎。那么模板引擎到底是個什么東東呢?模板引擎在實際生產環境中有着什么樣的意義?我們到底是否應該使用模板引擎技術?接下來我們會一一解答。

模板引擎是什么?

模板引擎是以業務邏輯層和表現層分離為目的的,將規定格式的模板代碼轉換為業務數據的算法實現。它可以是一個過程代碼、一個類,甚至是一個類庫。不同的模板引擎其功用也不盡相同,但其基本原理都差不多。

模板引擎的基本機理就是替換(轉換),將指定的標簽轉換為需要的業務數據;將指定的偽語句按照某種流程來變換輸出。最低限度的模板引擎就類似於如下代碼的實現:

1 const string message = "{Person}喜歡{Color}";
2
3 var msg = message.Replage("{Person}", person).Replage("{Color}", color);

實際上,我們在開發過程中已經在很多地方不自覺的在使用模板機制了。只不過對於如上的代碼,在C#里面有更好的String.Format()可以使用,它自身也是實現了一套模板引擎。

按照具體的實現方式,我將模板引擎分成了三個基本類型:

  1. 置換型模板引擎。置換就是將規定好的文本標記替換為目標內容。這種模板引擎實現簡單,除了標簽替換之外,很少支持諸如子模板引用、流程控制等。正如上面所說,我們幾乎天天都在使用這種模板引擎。置換型模板引擎通常用於業務邏輯不是很復雜的項目,比如生成短信、生成電子郵件,甚至有很多代碼生成器也在用它。可以說,置換型模板引擎的思想是整個模板引擎界的基礎。
  2. 解釋型模板引擎。解釋型模板引擎的原理還是標記置換。只不過有了解釋器的存在,可以支持更加復雜的標記和語法。后面我們將會介紹一種使用反射機制實現的非常好用的模板引擎。大家都知道,在編程語言中,解釋型語言和編譯型語言相比行嫩會差出很多,這主要得看解釋器如何優化了。
  3. 編譯型模板引擎。編譯型模板引擎是相對於解釋型模板引擎來說的,實際上定名為編譯型模板引擎也不太合適,但我也沒想到別的好名字,哈!我們將要介紹的編譯型模板引擎是Asp.Net網站開發專用的。它通過解析引擎和一系列的算法將我們定義的模板轉換為.aspx文件,然后直接訪問.aspx文件即可。

模板引擎的應用

在很多時候,模板引擎都是為了實現業務邏輯層和表現層的代碼分離,以便於協同開發的。然而也有很多應用不僅如此,比如代碼生成器,這里的代碼分離實際上是為了能夠獲得更好的可擴展性。

題外話:在早期,.NET推崇的Web開發模式就只有WebForm,這種模式是讓很多高手都望塵莫及且避夷所思的。我個人是從Asp/PHP轉移到.NET的,在Asp時代我就開發過自己的模板引擎,PHP環境就更不用說了,開源的帶有模板引擎的框架一大把。可以說,除了做.NET的,其他陣營的猴子們其實對於模板引擎一點兒也不陌生。后來,微軟推出了MVC框架,我也曾經看過它的實現,基本思想就是把當年的Asp編碼方式又給拿了回來而已,在很多地方還是不夠方便。我還是堅持了模板引擎的使用。

模板引擎可以實現代碼分離,讓開發人員各司其職,它也是幾乎所有代碼生成器的基礎組件之一,有了模板引擎,在表現層和最終業務數據上,我們可以擁有更好的可擴展性。

比較好的模板引擎實現,比如老陳的“網鳥Asp.Net模板引擎”,還可以內置模板代碼重用、多語言支持、動態頁面與靜態頁面自動均衡等功能。

小結

本文簡單的闡述了模板引擎的概念極其用途,從下一篇文章開始,我們將深入探討實現各種模板引擎所需要用到的開發技術和算法。

由於本系列文章在編寫之時並沒有系統的規划,因此可能會在適當的時候增刪章節。總而言之,模板引擎看似是一個小東西,但要真正從頭做起來,卻又會顯得相當復雜而龐大。各位朋友要做好心理准備!我也盡量從簡介紹。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM