伟大的树形结构


以前看过一篇介绍Ant、Xml与Lisp相似,来讲述Lisp语言的特质,数据与指令;另外,那篇文章也谈到以xml可以作为语言间相互转换的中间语言,当时非常震惊于lisp语言的神奇,称其为与C语言并立的语言高峰。后来随着不断地回味这其中的门道,个人觉得这之间其实不用讲那么玄乎,其实最根本的地方就是树形特征在它们里面暗藏着,使得他们可以存在某种形式的映射关系。即不管是lisp还是c、java、xml其实是一种树形化表示方式,在这种表示方式下,我们采用了不同的解释就可以让它转化为不同的东西。而两种树形化语言间,由于存在某种程度上的映射关系,那么可以表示树形化的xml就,可以作为中间一级的介质存在。另外,由于树形数据在计算机编程中广泛性,我们有理由相信lisp类似列表的树形表示,它的生命力很顽强的。因为只要c语言能够表示的,lisp就可以通过一定的树形化映射表示过去。

  谈到对树形化结构的佩服,就谈一点在个人具体工作中,遇到的一个关于树形化的应用。也是现在比较火热的基于Web的B/S系统。在几年的工作经历中,由于特殊的软件产品,曾接触到ActiveX控件对Javascript暴露的方法接口和事件接口,以达到“胖”客户端的目的。在ActiveX的设计中有良有莠,其中有一些接口和事件采用了参数列表的做法,有些接口和事件采用了对象化的做法。在维护的过程发现,由于业务的新变化,经常可能需要扩展新的数据,如果接口使用参数列表的做法,每次为了保持兼容性,我们就不得不开辟新的接口;但是,对象化的接口每次加入新的东西,几乎是对Javascript是透明的,原来的javascript可以照原来的协议进行访问、访问老属性,新功能版本的Javascript工作在新的协议上、即访问新的属性。
    
      在经过几番教训和磨砺后,大家讨论觉得对象化ActiveX控件对脚本暴露的方法和事件是一个获得比较好扩展性、兼容性的做法。在以后的工作过程中,经常以这样的观点去靠、去分析已经实现ActiveX代码,发现在所有对象化接口和事件中,另外一个做的非常好的就是对象化其实是一个递归的过程,即对象化的属性也可以是对象化的.这样对象化自身看来就像一个背袋,可以不断地扩展,往背袋里面装载了东西,它可以是原来版本已经有,也可以是后来加入的。背袋提供了类似容器一样的扩展性,对于背袋的外层用户来说,如果是旧版本它可以按照老的工作协议从背袋中取数据,如果是新版本则可以按照新的工作协议。
           在这个对象化的最后,你也可以看到一颗树的产生,它由自动化接口IDispatch作为树的主干存在,原始类型以及自动化接口自身可以作为叶子存在,形式化可描述为IDispatch* = {IDispatch*|other variant Type}。后来也思考到由于Javascript之于对象化的Activex接口和事件有天生的兼容性和扩展性,那么强类型语言之于二进制的数据呢?我们是不是也可以做到,修改接口协议之后获得自动的兼容性呢?我们知道是数据结构决定了操作,或者操作上的某种特性的要求也会支持去创造出新的数据结构。对于二进制数据,如果在操作上是普通的移位,而不是象良性树形化数据,我们可以按照节点去操作,那么二进制的扩展性就不是很好。因为插入新数据后,简单地移位后会导致后面的发生变化。我们在二进制协议设计中也通常使用TLV代表一个存储域,其实它就可以看做是一种类似树形的节点,那么我们看看在TLV结构下的节点操作吧,我们可以做到每次我二进制的移动位置量是由TLV中的L决定,这样移动量是一个节点,相当于节点操作,而Value的取法仅决定于工作协议,没有严格与TLV中Length相绑定滚系。 在这种二进制TLV的组织中和“正确”编解码中,那么我们也可以获得类似树形化数据的扩展性,随便添加枝叶,但是对已有的接口程序不会存在不良影响。
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值