atitit.元编程总结 o99
atitit.元编程总结 o99.doc
1. 元编程(Meta programming)
元编程(Metaprogramming)是指某类计算机程序的编写,这类计算机程序编写或者操纵其他程序(或者自身)作为它们的数据,或者在运行时完成部分本应在编译时完成的工作。很多情况下比手工编写全部代码相比工作效率更高。编写元程序的语言称之为元语言,被操作的语言称之为目标语言。一门语言同时也是自身的元语言的能力称之为反射。
就是将业务逻辑与实现代码进行分离,仅用XML这类的描述性语言描述业务之间的映射关系,不需要写实现代码即完成编程。
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://blog.csdn.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的更多相关文章
- Atitit 编程语言编程方法的进化演进 sp COP ,AOP ,SOP
Atitit 编程语言编程方法的进化演进 sp COP ,AOP ,SOP 1.1. Sp oop>>COP ,AOP ,SOP1 1.2. Sp oop 结构化方法SP(Stru ...
- Atitit.异步编程技术原理与实践attilax总结
Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...
- Atitit 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)的区别和联系
Atitit 面向对象编程(OOP).面向组件编程(COP).面向方面编程(AOP)和面向服务编程(SOP)的区别和联系 1. 面向组件编程(COP) 所以,组件比起对象来的进步就在于通用的规范的引入 ...
- C++模板元编程(C++ template metaprogramming)
实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...
- Atitit 函数式编程与命令式编程的区别attilax总结 qbf
Atitit 函数式编程与命令式编程的区别attilax总结 qbf 1.1. 函数式程序就是一个表达式.命令式程序就是一个冯诺依曼机的指令序列. 命令式编程是面向计算机硬件的抽象,有变量(对应着存 ...
- .Net元编程【Metaprogramming in NET】 序-翻译
最近在看这本书,比较实用.抽点时间把公开的部分内容简单的翻译了一下,下文是序部分. 书的具体地址为: http://www.amazon.cn/Metaprogramming-in-NET-Hazza ...
- Effective C++ -----条款48:认识template元编程
Template metaprogramming(TMP,模板元编程)可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率. TMP可被用来生成“基于政策选择组合”(based on ...
- C++模板元编程 - 函数重载决议选择工具(不知道起什么好名)完成
这个还是基于之前实现的那个MultiState,为了实现三种类型“大类”的函数重载决议:所有整数.所有浮点数.字符串,分别将这三种“大类”的数据分配到对应的Converter上. 为此实现了一些方便的 ...
- C++模板元编程 - 挖新坑的时候探索到了模板元编程的新玩法
C++真是一门自由的语言,虽然糖没有C#那么多,但是你想要怎么写,想要实现什么,想要用某种编程范式或者语言特性,它都会提供. 开大数运算类的新坑的时候(又是坑),无意中需要解决一个需求:大数类需要分别 ...
随机推荐
- DNS解析过程
参考: http://www.maixj.net/ict/dns-chaxun-9208 http://blog.it985.com/8389.html DNS(Domain Name System) ...
- openstackM版本常见问题汇总
汇总下常见的问题以及解释下一些比较容易让人萌的参数配置等等 问题汇总1.使用纯文本模式进行复制粘贴,打死不要用word!!!可以解决绝大多数问题,如果你依然执迷不悟,那么就好自为之吧 2.创建路由器时 ...
- ffffffuzzzzzzzzzzzzing
为了克服现有 Fuzzing 技术对目标程序缺乏理解.测试完全随机且盲目的缺点,提出了新方法:基于动态符号执行的智能测试技术. 先通过静态分析获得危险点,然后通过符号执行收集路径条件,最后利用约束求解 ...
- textarea 怎么固定大小,不让调整
1:彻底禁用拖动(推荐) resize: none; 2:只是固定大小,右下角的拖动图标仍在 width: 200px; height: 100px; max-width: 200px; max-he ...
- PHP 常用字符串函数整理
PHP语言中的字符串函数也是一个比较易懂的知识.今天我们就为大家总结了将近12种PHP字符串函数,希望对又需要的朋友有所帮助,增加读者朋友的PHP知识库. 1.查找字符位置函数 strpos($str ...
- 小甲鱼python视频弟十一讲(课后习题)
1.修改列表里的值 list1 = [,,[,,,[,,,,] list1[] = print(list1) list1[][][] = '?' print(list1) 2.列表的排序(sort) ...
- [转载] 散列表(Hash Table) 从理论到实用(下)
转载自: 白话算法(6) 散列表(Hash Table) 从理论到实用(下) [澈丹,我想要个钻戒.][小北,等等吧,等我再修行两年,你把我烧了,舍利子比钻戒值钱.] ——自扯自蛋 无论开发一个程序还 ...
- 20145225《Java程序设计》 第7周学习总结
20145225<Java程序设计> 第7周学习总结 教材学习内容总结 第十三章 时间与日期 13.1认识时间与日期 时间的度量:GMT.UT.TAI.UTC.Unix.epoch. 年历 ...
- Ubuntu 14.04中gedit打开文件出现中文乱码问题
http://blog.csdn.net/cywosp/article/details/32325449/ 在中文支持配置还不完整的Ubuntu 14.04中,使用gedit打开带有中文字符的文件有时 ...
- SpringMVC框架入门配置 IDEA下搭建Maven项目
初衷:本人初学SpringMVC的时候遇到各种稀奇古怪的问题,网上各种技术论坛上的帖子又参差不齐,难以一步到位达到配置好的效果,这里我将我配置的总结写到这里供大家初学SpringMVC的同僚们共同学习 ...