Posted on 2006-03-25 11:36
canonical 阅读(944)
评论(0) 编辑 收藏 所属分类:
设计理论
1. 对象的一个特性是局域化。每一个对象函数(非静态函数)都是在对象的上下文中调用的,因而隐含假设了一定的环境信息,这些信息以封装的形式被使用。
一个具体的体现是函数的命名,如果没有对象,我们必须给函数进行全局命名,例如 find_friends, find_users, find_departments, 而在对象的环境下,我们可以抽象出一个采用局域化命名的接口 IQueriable.find(),实现系统的深度分解。
在对象成员函数的内部,我们通过统一预定的名字(this指针)来访问对象环境中的变量。而在 jsplet web框架中的action和前台jsp中,我们通过thisObj变量来访问后台逻辑对象的上下文,而不需要知道对象的具体名称 (objectName)。
2. 对象的另一个特性是静态化。我们从面向过程走向面向对象时,我们思维中的图像出现了一个重大的变化:在面向过程的程序中,我们想象中存在的是一个个动态的处理过程,它们在时间轴上按照一定的顺序依次执行。而在面向对象的图景中,我们考虑的主要是一个静态化的世界,系统分解为对象,而对象是同时存在于我们的思维中的。这里一个重要的技术手段就是成员函数。例如我们编写一个成员函数getChildren(), 这个函数的语义是返回一个数据变量,概念上它是静态的,但其内部实现其实可能是很复杂的,非常的动态化:可能需要查询数据库,可能需要校验权限等等。
理想的情况下,我们可以利用成员函数封装可以实现对象图的遍历。例如 x.getParent().getChilldren(), 在微软的COM模型或者Sun的JavaBean标准下,我们可以写成
x.parent.children。
特别注意这里的属性语法原则上是与时间无关的,即在同一个时刻我们认为这些属性同时存在着,是一个静态的关系。而以下的调用出现了明确的步骤,因而明确引入了时间因素
ITree parent = node.getParent();
if(parent == null)
return null;
List children = node.getChildren();
return children;
在witrix平台的tpl模板引擎中使用的EL(Expressin Language)表达式语法会自动处理函数返回值为null的情况,因而维护了对象图的语义,不需要中断调用过程来进行异常处理,是简化界面编程的一个重要方面。
这里顺便提一句:人的思维是倾向于静态化的,但现实世界却是在不断的变动中的。正所谓不变的只有变化。Von Neumann体系结构强迫我们在最细节处引入变化过程,很多时候是过分的负担。我们需要的是识别出各种可以静态描述的部分,集中精力于那些真正需要随需应变的应用。