zoukankan      html  css  js  c++  java
  • atitit.元编程总结 o99

    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

    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

    我要啦免费统计
  • 相关阅读:
    Springboot + Caffeine 实现本地缓存
    springboot + mybatis-plus + sharding-jdbc 实现单库分表
    工厂模式+策略模式 使用
    JAVA 金额自动除以100,精确到分
    spring aop + 自定义注解实现本地缓存
    springboot 使用 retry重试机制
    Mybatis-plus 自动注入公共字段
    docker 安装kafka
    ES 实现聚合分页
    Authentication token manipulation error 及 mongodb WiredTigerLAS.wt 文件过大问题
  • 原文地址:https://www.cnblogs.com/attilax/p/5963874.html
Copyright © 2011-2022 走看看