会员登录 | 会员注册 | 意见建议 | 网站地图

站长资源综合门户

当前位置:首页 > 站长学院 > 编程程序 > Openbiz 实现 PHP的元数据编程

Openbiz 实现 PHP的元数据编程

时间:2012-04-05 18:24:30   作者:   来源:   点击:
"Text"/>

       <BizFieldName="price" Column="price" Type="Number"/>

       <BizFieldName="timestamp" Column="timestamp" Type="DateTime"/>

    </BizFieldList>

</BizDataObj>

太棒了!这让我看到了两种未来的可能性,如果编程的主体工作是基于一种描述性的XML语言完成的,那么以后极有可能出现完全所见即所式的编程方式。

另一种极致可能是下文提到的对象工厂概念,自动化编程。

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

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

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

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

 

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

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

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

怎么办?

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

谁改?

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

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

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

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

PHP语言自身对对象的处理还存在这样一个缺陷,对象的生命期是不能跨视图的,当一个页面请求被执行完毕,与其相关所有资源就都被自动销毁回收了。特别是数据对象这种通常会带有数据库链接和游标状态的对象。

Openbiz的会话管理机制配合对像工厂的实现可持久的对象状态。

对象工厂会在交付对象前调用抽象类的MetaObject::setSessionData()接口来自动还原对象状态。

这样在编写程序的时候,我们在整个用户会话期内可以跨视图去调用用户曾经输入过的数据。例如将用户曾经输入过的信息作为默认值显示在当前这个视图上。

在php中的调用语法范例:

$defaultValue = 

BizSystem::getObject("package.do.DataObjName")

          ->getActiveRecord()

          ->fieldName;

 

在元数据中通过Openbiz的SimpleExpression的语法范例

<Element ... 

   DefaultValue="{@package.do.DataObjName[fieldName].Value}"

/>

不仅描述数据映射,基于Openbiz元数据描述业务逻辑

如果你已经对这种元数据编程方式有兴趣了,请继续往下看。

分享到:

网友评论

热门编程程序