<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元数据描述业务逻辑
如果你已经对这种元数据编程方式有兴趣了,请继续往下看。