atitit.元编程总结 o99.doc

1. 元编程(Metaprogramming) 1

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

3. 元类型and元数据 1

4. 元编程实现方式 2

4.1. 代码生成 2

4.2. lex和yacc分析器 2

4.3. 泛型编程 2

4.4. 注解 2

4.5. 解释型框架 2

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

4.7. Aop 3

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

5. 应用场景 4

6. 参考 4

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相关推荐

  1. OpenERP与Python 元编程

    Python元编程被称为"黑魔法".Python界的传奇人物Tim Peters有云: 引用 Python的元编程这种黑魔法99%的人都无需了解,如果你拿不准是否应该用到它时,你不 ...

  2. Python中的元编程:一个关于修饰器和元类的简单教程

    作者 | Saurabh Kukade 译者 | 刘畅 出品 | AI科技大本营(ID:rgznai100) 最近,作者遇到一个非常有趣的概念,它就是用 Python 进行元编程.我想在本文中分享我对 ...

  3. Python中的元编程(Meta-Programming)

    元编程:是编写出可以操作的代码的行为,即用代码来操作另一个代码. Python中的元编程:一种构建函数和类的行为,这些函数和类可以通过修改.包装现有代码或生成代码来进行操纵. Python中元学习的实 ...

  4. JavaScript—ES6 元编程(5)

    几年前 ES6 刚出来的时候接触过 元编程(Metaprogramming)的概念,不过当时还没有深究.在应用和学习中不断接触到这概念,比如 mobx 5 中就用到了 Proxy 重写了 Observ ...

  5. IronRuby:元编程特性【method_missing】的使用

    在OpenExpressApp中写的自动化测试用例片段如下,之所以能这么易读,是因为可以使用Ruby的method_missing来进行方法调用: 打开模块 "部门管理" # 1 ...

  6. 周末话题-元编程(metaprogramming)

    在计算机行业永远不缺乏的是什么? 概念和新名词 我们已经见了太多太多的名词,现在都有点名词麻痹症了.就在这些名词中间有一个单词忽隐忽现的闪烁着自己的光芒----meta. 在牛津大辞典里对meta这样 ...

  7. Atitit.异步编程 java .net php python js 对照

    Atitit.异步编程 java .net php python js 的比較 1. 1.异步任务,异步模式,  APM模式,,  EAP模式, TAP 1 1.1.       APM模式: Beg ...

  8. 【Groovy】编译时元编程 ( 编译时方法注入 | 使用 buildFromSpec、buildFromString、buildFromCode 进行方法注入 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法注入 1.使用 new AstBuilder().buildFromSpec 进行方法注入 2.使用 new Ast ...

  9. 【Groovy】编译时元编程 ( 编译时方法拦截 | 在 MyASTTransformation#visit 方法中进行方法拦截 )

    文章目录 一.在 MyASTTransformation#visit 方法中进行方法拦截 二.完整代码示例及进行编译时处理的编译过程 1.Groovy 脚本 Groovy.groovy 2.ASTTr ...

  10. 【Groovy】编译时元编程 ( 方法拦截时用到的 AST 语法树节点 MethodNode 节点 | MethodNode 节点分析 | MethodNode 节点中的BlockStatement)

    文章目录 一.方法拦截时用到的 AST 语法树节点 MethodNode 节点 二.MethodNode 节点分析 三.MethodNode 节点中的 BlockStatement 集合 一.方法拦截 ...

最新文章

  1. mysql 2进制 安装_mysql二进制安装
  2. [Linux C]递归遍历指定目录,以目录树形式展示
  3. 小米 android 8,小米华为们谁最良心?10大手机厂商安卓8.0升级情况盘点
  4. SQL Server 不同数据库导入指定数据解决方案
  5. linux把root用户删了,linux root用户没法删除文件
  6. springcloud项目的启动顺序_Spring Cloud微服务项目完整示例,含注册中心,网关,断路器等等...
  7. 彻底解决 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  8. Python——用assert语句来确保参数符合当前程序的要求
  9. [INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突。
  10. MITRE 发布防御知识库 Shield
  11. android 文件上传参数,Android OkHttp Post上传文件并且携带参数实例详解
  12. excel批量插入图片url显示方法
  13. 如何使用Apple Watch控制Apple TV
  14. 白盒测试常用工具介绍
  15. 行业分类代码 2017 最新版 创建sql语句
  16. 图普科技李麟|当新零售遇上人工智能
  17. 山东大学计算机考研909真题,2012年山东大学909数据结构考研试题(回忆版)
  18. Notes Domino V12Beta划重点
  19. 力扣209. 长度最小的子数组
  20. kube-proxy ipvs模式详解

热门文章

  1. Google Calendar Sync_ 把 Microsoft Outlook 同步到 G...
  2. OpenGL学习笔记(3) 纹理
  3. CherryPy 入门
  4. 每天一道算法题:无重复字符的最长子串
  5. c++中的243、251、250错误原因
  6. IE9 BUG overflow :auto 底部空白解决方案
  7. Windows Workflow Foundation is coming...
  8. robotframework 新建UI自动化测试用例实例一(2)
  9. BZOJ3122 [Sdoi2013]随机数生成器 【BSGS】
  10. 《全局光照技术》在摩点网发起众筹活动