受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术。本系列文章将会带您由浅入深的全面认识模板引擎的概念、设计、分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎。关于模板引擎的概念,我去年在百度百科上录入了自己的解释(请参考:模板引擎)。老陈曾经自己开发了一套网鸟Asp.Net模板引擎,虽然我自己并不乐意去推广它,但这已经无法阻挡群友的喜爱了!

与置换型模板引擎不同的是,解释型模板引擎包含了一个专用解释器,有了解释器的存在就可以支持一些更加复杂而严谨的语法。熟悉设计模式的朋友此时此刻应该能够回想起来“解释器模式”,它是将一些业务封装成一个或多个命令,然后通过一个复杂的解释器(Interpreter)来解析执行来满足生产需求的。实际上,解释型模版引擎就是一个较为复杂的解释器模式的实现而已。具体到模板引擎技术上来,解释器的工作任务实际上就小了很多。按照数据封装模式的不同,解释型模板引擎分为命令解释器和反射解释器两个大类。

命令解释器

还记得置换型模板引擎中,我们在最后曾经处理了一个较为负载的Label“{CreationTime:yyyy年MM月dd日 HH:mm:ss}”吗?实际上,这个就是命令解释器的一种实现。此Label中的format部分可以看作是CreationTime的一个命令。有了命令,我们可以让Label去做更多的事情,这是显而易见的。

命令也可以理解为指令。

为了更加能够说明这个问题,我们先将我们要处理的模板复杂化一点,如下:

1 <!--#include file="_Page_Header.shtml" -->2 <ul>3 <li>博主姓名:陈彦铭</li>4 <li>创建日期:{CreationTime:yyyy年MM月dd日 HH:mm:ss}</li>5 <li>粉丝数量:{FunsCount:D4}</li>6 </ul>7 <!--#include file="_Page_Footer.shtml" -->

除了我们已经熟悉的{xxx}标签之外,我们又增加了一个文件包含指令“<!--#include file="_Page_Header.shtml" -->”。这个指令是标准的SHTML语法,意思就是将其他文档中的模板合并到当前的指令位置,如此我们便可以实现代码重用。尤其对于HTML开发来说,使用SHTML包含语法,还可以在诸如Dreamweaver等IDE中实现“所见即可得”的效果。

关于如何实现包含指令,我们将在后续章节中具体介绍。

反射解释器

接触了指令之后,其实我们还是不够满足,因为到目前为止,我们的模板只能做简单的标签置换,这个相当不给力。比如有些内容我们想让它根据情况输出,那么就需要条件语句的效果,再如我们经常会遇到列表等情况,此时要是能有个迭代语句岂不是很给力?难道我们要编写一堆的Label1、Label2、Label3?

有需求,是好事情!咱们是做技术的,为需求而生,为满足需求而战,没有需求,技术就都只是浮云!

为什么条件语句和迭代语句要使用反射来实现,因为在编写这篇文章之前,老陈已经决定了用反射来实现这些机制,无论您是否喜欢!Hah..

我们再次将模板语法复杂化如下:

 1 <!--#include file="_Page_Header.shtml" --> 2 <ul> 3 <li>博主姓名:陈彦铭</li> 4 <li>创建日期:{CreationTime:yyyy年MM月dd日 HH:mm:ss}</li> 5 <li>粉丝数量:{FunsCount:D4}</li> 6 </ul> 7 <hr /> 8 <m:if test="{articles.Count > 0}"> 9 <ul>10 <m:foreach item="article" collection="articles">11 <li><a href="{article.Url}">[{article.Category}] {article.Title}</a></li>12 </m:foreach>13 </ul>14 </m:if>15 <!--#include file="_Page_Footer.shtml" -->

现在有木有感觉到某种给力呢?虽然这不是最给力的……

概念

虽然,我们只增加了两种语法,而且不多,看起来也貌似并不复杂,但这背后将会牵扯到方方面面的问题,代码解析的难度进一步增加。我们有必要了解一下后面可能使用到的一些概念。

  • 元素:即Element。它是组成模板的最基本的元素,派生出标签、表达式、Tag等。
  • 标签:即Label。形如{item},或{item.getTitle()}等,标签不能嵌套使用,但标签内的语法可以较为复杂;
  • 表达式:即Expression。比如标签大括号之间的内容,我们从本节课开始将其称之为表达式,表达式是可以运行、计算的,例如我们可以输入较为复杂的标签:{item.x * item.y};
  • 运算符:有了表达式,那么我们就需要一些运算符支持,例如上述{item.x * item.y}中的 * 运算符;
  • Tag:我们将Tag定义为形如<m:if></m:if>或<m:else/>这样的表示形式,它的主要作用是提供流程控制支持;
  • 特性:既然有Tag了,那么我们就需要特性,即Attribute,概念与xml/html中的Attribute一致,它通常为Tag提供可选参数;
  • 指令:即Command,其格式类似于Tag,只不过开始和结束标记被我们替换为xml/html的注释格式,形如:<!--#include file="_Page_Footer.shtml" -->;

这里我列出的概念可能还不够完整,随着课程的演进,我们再一一认识他们!

再次提醒:如果之前的课程您没有掌握,请一定多多研究、体会,如果有问题可以随时通过评论提问,我会尽力解答!希望大家都能够真正的看懂、学会!

优点

解释型模板引擎可以支持更加复杂的语法、指令,能够满足更多的需求。同时由于它不像编译型模板引擎那样会受到运行时环境的限制,解释型模版引擎用途非常广泛。

缺点

但是它有一个很大的缺陷就是其内部使用了反射机制,虽然我们也试图对反射进行优化(请参考:浅谈.NET反射机制的性能优化),但这并不能完全解决反射带来的一系列问题,这就意味着在某些场合它无法获得令人满意。

小结

本课仅作为解释型模板引擎的一个引子,也是我写博过程中的一个缓冲。

在解析本课提出的两个模板代码的时候,您需要认真的体会我们之前的课程并学会它们,否则越往后面您就会越发的感觉到吃力!

为了自己,不要偷懒!学习是自己的,不学就一定不是自己的!


解释型模板引擎在我归纳的三大类模板引擎当中是难度最高的,我会细心的完成每一节课程,进度会比较慢,大家一定要耐着性子!我们的目标是看懂、学会、掌握,而不是直接应用它们!话说,楼主这一番苦心,大家是否表示赞同呢?

转载于:https://www.cnblogs.com/ymind/archive/2012/04/09/progressively-develop-templateEngine-yourself-Interpreted-type-1.html

由浅入深:自己动手开发模板引擎——解释型模板引擎(一)相关推荐

  1. 由浅入深:自己动手开发模板引擎——解释型模板引擎

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  2. 由浅入深:自己动手开发模板引擎——解释型模板引擎(二)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  3. 由浅入深:自己动手开发模板引擎——置换型模板引擎(四)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  4. 由浅入深:自己动手开发模板引擎——置换型模板引擎(三)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  5. 由浅入深:自己动手开发模板引擎——置换型模板引擎(二)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  6. 由浅入深:自己动手开发模板引擎——置换型模板引擎(一)

    受到群里兄弟们的竭力邀请,老陈终于决定来分享一下.NET下的模板引擎开发技术.本系列文章将会带您由浅入深的全面认识模板引擎的概念.设计.分析和实战应用,一步一步的带您开发出完全属于自己的模板引擎.关于 ...

  7. python中动态语言静态语言的定义_作为程序开发,你所需要知道的编译型与解释型、动态语言与静态语言、强类型语言与弱类型语言的概念以及区别...

    作为程序开发,你所需要知道的编译型与解释型.动态语言与静态语言.强类型语言与弱类型语言的概念以及区别! 在各式各样的开发过程当中,我相信各位开发小伙伴在开发过程中并没有太关注什么是解释性语言和编译性语 ...

  8. freemarker ftl模板_Web开发人员必会的模板引擎技术之Freemarker

    曾几何时,Web开发是个多么高大上的名字,程序猿们都以能搞定Web技术为荣,此时还没有前后端之说.然而随着互联网的发展,社会分工进一步细化,职业岗位也更加细分,慢慢开始有了前端攻城狮和后端攻城狮,技术 ...

  9. mysql模板引擎_MYSQL存储引擎解释

    存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念, ​ MySQL支持多种存储引擎,每种引擎有着一些自己独特的功能,用户在使用的时候,可以根 ...

  10. 用Python开发一个自制的编程语言(虚拟机解释型)[2] 词法分析器(2)

    在上一篇文章中,我们搭好了一个编程语言解释器基本的框架,完成了一部分的词法分析器,下面让我们继续努力.用Python开发一个自制的编程语言(虚拟机解释型)[1] 词法分析器(1)_嘉定世外的JinJi ...

最新文章

  1. tensorflowgpu利用率为0_奥普特冲科:曾侵犯竞争对手商业机密,产能利用率或虚高...
  2. PageLayoutControl的基本操作
  3. 用implicit和explicit打通两种类型
  4. strictmath_Java StrictMath ulp()方法与示例
  5. IOS中的事件响应链,事件冒泡机制基本了解
  6. 跨域请求的常用方式及解释
  7. Aop 是面向切面编程,
  8. 如何进行软件需求分析
  9. 计算机故障语言 英语怎么说,故障英语怎么说
  10. F检验 matlab
  11. response.sendRedirect 加域名或者不加域名的重定向加locahost或者不加localhost
  12. 基于flink的电商用户行为数据分析【1】| 项目整体介绍
  13. Python爬网易云音乐的那些事
  14. 基于android的智慧停车app
  15. 新零售mysql设计 订单表 订单详情表
  16. Caffe源码解析(一) —— caffe.proto
  17. Spring集成JMS入门
  18. latex \nomenclature表达set的时候会有不希望出现的缩进,原因是没有打%符号,问题比较冷门,自己一个个试出来的
  19. 闲谈【Stable-Diffusion WEBUI】的插件:美不美?交给AI打分
  20. 前端介绍(前端的发展史)

热门文章

  1. Android新手入门 FAQ
  2. WordPress网站数据库报错 Error establishing a database connection
  3. unbuntu 中部署jenkins
  4. C++ get()和put()读写文件详解
  5. 转:马明哲:拥有执行力才能让你强大
  6. RTKLIB-RTKPOST设置介绍
  7. 《生活中的魔法数学》读后感
  8. cpu flags 一致性检查
  9. 【愚公系列】2021年12月 攻防世界-简单题-MOBILE-008(Ph0en1x-100)
  10. 点滴:日内交易规则参考