atitit.元编程总结 o99 1. 元编程(Meta programming) 2. 元编程的历史and发展 3. 元类型and元数据 4. 元编程实现方式 5. 应用场景 6. 参考

atitit.元编程总结 o99
1. 元编程(Meta programming)
2. 元编程的历史and发展
3. 元类型and元数据
4. 元编程实现方式
5. 应用场景
6. 参考

atitit.元编程总结 o99.doc

1. 元编程(Metaprogramming 1

2. 元编程的历史and发展 1

3. 元类型and元数据 1

4. 元编程实现方式 2

4.1. 代码生成 2

4.2. lexyacc分析器 2

4.3. 泛型编程 2

4.4. 注解 2

4.5. 解释型框架 2

4.6. 对象工厂概念,一个会写程序的程序! 3

4.7. Aop 3

4.8. 数据对象触发器和 可配置的插入式服务 3

5. 应用场景 4

6. 参考 4

元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。很多情况下比手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射

就是将业务逻辑与实现代码进行分离,仅用XML这类的描述性语言描述业务之间的映射关系,不需要写实现代码即完成编程。

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.****.net/attilax

2. 元编程的历史and发展

 在1994年初露端倪,由一个叫 Erwin Unruh 的人首先发现。在1994年,C++标准委员会在圣迭戈(SanDiego)举行的一次会议期间, Erwin Unruh展示了一段特别的代码。这段代码的特别之处在于程序的功能在编译期实现而非运行期,编译器错误信息的方式产生从2到某个给定值之间的所有质数。同年夏天, Todd Veldhuizen 受Erwin 的例子启发,发现可以使用C++模板进行元编程,并发表了一份技术报告

3. 元类型and元数据

类型的类型(泛型???) ,数据的数据为元数据 (anno/attr)

4. 元编程实现方式

4.1. 代码生成

“元编程”实际上是“代码生成”的一种别称

可以给它一小段代码,让它返回一段可执行的程序,或是一个可以识别或重写的解析树

最常用的元编程工具是编译器,把高级语言转换为汇编语言或机器语言。更灵活的方法是在程序中嵌入解释器直接处理程序数据。有一些实现例如为Object Pascal编写的RemObject's Pascal Script。

4.2. lex和yacc分析器

另一个很常用的元编程例子是lex和yacc,用来生成词法分析器语法分析器。Yacc通常用作编译器的编译器,生成一个把高级语言转换为机器语言的工具。

所以,所谓模板元编程,你可以理解为:它把编译器当成了更高层次的解释器和运行时而已. 模板编程是产生式编程(比如泛型编程)

4.3. 泛型编程

4.4. 注解

注解在其中扮演了核心角色。其思想是通过注解够告诉工具如何生成新代码、转换代码或者决定运行期的行为。以Java Persistence API(JPA)为例,这也是Java 1.5引入的功能。它允许开发者以声明的方式如@Entity,指定Java对象与数据库实体之间的关系。然后Hibernate这类工具就可以使用这些 注解,在运行期生成映射文件和SQL查询。

4.5. 解释型框架

Openbiz框架特别之处在于这是一个解释型框架,相当于"编译器"的角色。 当其它开发环境和框架致力于让开发人员少写代码的时候,Rocky兄提出,别让他们写代码了直接用简单XML语言来描述映射关系即完成编程。

4.6. 对象工厂概念,一个会写程序的程序!

每次提到这个概念都让我激动不已,仿佛我们距离智能化编程只有咫尺之遥。这个理念据我所知最先提出的是.Net的自省(这个汉语翻译很诡异)这一概念,即由主程序动态创建出另一个独立的子程序,动态编译,然后按需装载及销毁(跟变形金刚似的),当时看的我也十分激动,此后这个概念基本上就再也没人提了。

直到后来我阅读分析过了Openbiz的底层源代码惊人地发现了基于PHP实现的对象工厂这一理念。剖析一下思路,以数据对象为例:

基于XML的元数据文件被视为发给"工厂"的装配单,上面描述了应具体如何"组装"这个对象,以及这个对象与地层数据库的映射关系,与同层级的其它对象的映射关系(例如一对多的 ORM)

对象工厂接到创建这样对象的生产指令后,按描述创建并组装所需对象,并以串行化的方式将对象体和状态缓存在系统内,为再次触发调用,而优化性能。直到元数据配置文件改变之前,对象只需要动态生产一次,即无限次使用。

4.7. Aop

4.8. 数据对象触发器和 可配置的插入式服务

这个邮件和短信的触发肯定不应该在UI层实现,因为我们要考虑不管订单从何处被生成,都应触发发送邮件这个逻辑。所以这个业务逻辑应该被耦合在数据对象上,即只要有订单被生成就应当触发该逻辑。

而发邮件和发短信些种常见的可重用性逻辑,可以被定义为pluginService, 例如在发邮件的Service中,收件人,标题,内容应当是API的参数,而发邮件的帐户,SMTP服务器信息相对于业务整个系统来说通常变化不大,应作 为元数据接口,而如何与服务器链接来发送邮件则是具体被重用的对象逻辑了。这种设计的精妙之处我们将在下一篇文章中具体给大家分析

5. 应用场景

基于这种编程逻辑,我们解决一个常见的修改和扩展问题。

例如:客户经常会再项目验收时提出底地层数据字段的修改,"您看联系人管理这个模块,能不能再增加个 生日 和 喜好 字段,要不然这尾款恐怕..."。 

怎么办?

改吧。增删读写(CRUD),列取(List),搜索(Search)一个不能少全都要改。

谁改?

肯定你改啊,因为是你写程序。

Openbiz元数据就不一样了,现在我只修改一个数据描述文件,然后是对象工厂会检测到元数据配置文件发生改变,然后他来自动重新编写对象和所有与其相关的映射调用(ORM)。 

当你面对的是一个业务偶合性特别复杂的系统时,你会发现这些上层对象"你中有我,我中有你"堆叠式调用复杂至极(恶心至极)。比如在文档修改记录的视图中也调用了联系人的这几个字段等,你确定能一个不差的修改遍与这个数据结构的每一个角落么? 

此非人力所能为也!但对象工厂可以,因为是按需生产创建。

6. 参考

元编程_百度百科.htm

元编程_互动百科.htm

Java 8的类型注解:工具和机会 _Linux伊甸园开源社区-24小时滚动更新开源资讯,全年无休!.htm

源于java编程思想的Openbiz框架实现PHP的元数据编程_PHP_it动力.htm

atitit.元编程总结 o99
1. 元编程(Meta programming)
2. 元编程的历史and发展
3. 元类型and元数据
4. 元编程实现方式
5. 应用场景
6. 参考