Posted on 2007-04-01 21:30
canonical 阅读(1451)
评论(3) 编辑 收藏 所属分类:
设计理论
命名(Naming)无疑是人们认识世界最基本的手段之一。从软件技术的发展中我们也可以观察到命名技术的不断深化。
1. 助记的名:汇编之中我们有了move/push/pop这样的指令,所面对的不再是010101这样的同质的数字世界。变量也逐渐可以拥有自己的名字,甚至多个名字。在C语言中指针的概念被进一步抽象化,使得我们可以为任意内存地址起一个可读的名字。我们甚至渐渐忘怀了pStruct是指针的名字,而直接把它等同于指针所指的内容本身。
2. 局部的名:函数(例程)概念的出现把局部名称引入系统,从此精细结构的发展才成为可能。
3. 多义的名:面向对象的出现可以看作是命名技术的一种重大进展,它可以把一组相关的数据和函数放在一起起个名字。继承概念为名引入了多义性。通过虚拟函数表所实现的lazy-binding部分松动了对象的名和实之间的指称关系。现在一些所谓dynamic dispatch技术,依然是顽强的希望在同一名下,纳入更多实的变化。
4. 特指的名:面向对象技术创造一个特殊的名---this指针。它是一种约定了的固化了的局部名称。使用this指针使得我们区分了领域(domain)的内外。在domain外对象可以有各种称谓,而domain内我们直接通过this直接触及到对象的实体。在javascript这样的动态语言中,函数和this指针是动态绑定的。在某种意义上,这意味着一个操作所依赖的domain知识可以是动态变化的。
5. 相对的名:面向对象技术所创造的知识相对化概念的一个直接体现是命名的相对化。一个函数它的具体含义不再是绝对的,而是相对于this指针的。因此我们不再采用user_load, book_load这样的全称的函数名, 而只定义load这样的具有依赖性的函数。在面向对象的理想操作图景下,首先应该是通过一个整体的参数直接区分出多个大的情景,然后在每个特定的情景下分别调用相对函数进行操作。在模板(template)技术或者动态语言中,这种相对性可以得到更加充分的发挥。因为在泛型或者弱类型语言中,我们需要的只是对象提供特定名称的函数或属性而已。
6. 持久的名:在早期的语言中,名只在编译时刻存在。在编译出的二进制代码中,名所提供的丰富的描述空间不复存在,我们所有的只是同质性的二机制地址而已。而在现代语言中,反射已经成为了不可或缺的技术,它使得我们在运行时刻仍然可以拥有复杂的描述结构。
7. 分离的名:在一般的程序中,我们早已习惯了变量名直接指代实际可操作的对象本身,名的问题显得太平庸以至于大家似乎忽略了它的存在。但是在web体系架构下, 因为存在着浏览器和服务器这样两分的状态空间, 名成为两个系统交互的直接手段,名的重要性也重新凸显出来。只有在一个封闭的container中,才能通过名字解耦. 因此web架构设计的一个核心问题是构建出各种各样的全局的container. 浏览器前端技术的一个本质性困难即在于多个浏览器窗口之间没有共享的全局对象空间,因而很难在前台独立建立container结构。
在witrix平台的jsplet框架中,在前台我们通过如下url来访问后台
/view.jsp?objectName=MyObj&$bizId=test&objectEvent=ViewDetail&id=1
MyObj这一参数标定了BeanContainer中的一个Java对象, $bizId参数指定应用某个Aspect到此对象上,objectEvent参数映射到WebAction上的一个java方法,而EntityManager最后负责把id映射到具体的实体对象。当我们在后台需要编制代码的时候,entity对象已在手边。
8. 名的结构:当名越来越多的时候,我们需要对它们进行有序的组织。名字空间(namespace)所采用的树形结构可以说是最直接的一种组织方式。这一结构不仅仅可以用于描述,同时可以用于控制。