Zero语言的一个代码实例,如何进行抽象。

0 views
Skip to first unread message

zhang3

unread,
Apr 19, 2009, 9:51:09 AM4/19/09
to Zero programming language
Zero语言的一个代码实例,如何进行抽象。
问题:对象ObjectA有一些属性:Prop1,Prop2,Prop3,它们都被定义为一个结构,包含一个Value值,其取值分别如下:
Prop1.Value:=1; //Value值为Integer类型
Prop2.Value:=2.345; //Value值为double类型
Prop3.Value:=’abc’; //Value值为 string类型
如何写一个成员函数返回各个属性的Value?

常规的写法是为每个Value值都写一个成员函数:
function GetPropertyValueofProp1(): Integer;
begin
Result:=Prop1.Value;
end.

function GetPropertyValueofProp2(): double;
begin
Result:=Prop2.Value;
end.

function GetPropertyValueofProp3(): string;
begin
Result:=Prop3.Value;
end.

我们可以看到,这些函数虽然有相同的形式,但是却无法把这种形式提取出来,参考我前面的文章“从泛型到泛X”,如果按照人的思维方式,进行统一表达的
话,这几个成员函数,都会表现为如下的形式 :

function GetPropertyValue(Ψprop): Ψtype;
begin
result:= Ψprop.Value;
end

在Zero语言中,恰恰就可以采用这样的形式,来进行抽象,但是问题来了,仅仅是写了这个泛得不得了的函数,还没有和
Prop1,Prop2,Prop3发生任何关系,怎么调用呢?这里要从Zero的内部机制说起。

Zero语言完全的利用了这个函数中所蕴含的丰富信息,通过对这个函数的语法分析,我们可以得知:
1 Ψprop是对象内某个属性,而且Ψprop包含了Value。
2 Ψtype是一个类型,其类型是Ψprop的Value所可能具备的类型之一。

Zero语言把这些丰富的信息称为约束,而把Ψprop和Ψtype的可能取值称为各自的结果集。

各种约束的组合称为约束空间。

用这样的术语来分析所得到的结果集各自为:
Ψprop的结果集为:[Prop1,Prop2,Prop3]
Ψtype的结果集为:[integer,double,string]

同时,当Ψprop取值为Prop1的时候,Ψtype的结果集为[integer],只剩下了一个元素,其余的同理,这被称为条件结果集。

约束空间中的GetPropertyValue函数具有三种可能形式。
GetPropertyValue ( Prop1 ):Integer
GetPropertyValue (Prop2):double
GetPropertyValue (Prop3):string

好了,内部的分析结束,接下来,我们看看Zero语言是如何用这个函数得到我们所需要的功能的。

var m1: Integer;
m1:=GetPropertyValue ( );
这里我们要做的就是填空,智能提示就出来了,我在博客的第一篇中,讲到不可能脱离IDE来展示语言的优越性,这便是一个例证。智能提示,是Zero语言
中不可缺少的一环。智能提示弹出的是什么呢?参考我们前面对条件结果集的描述:

“当Ψprop取值为Prop1的时候,Ψtype的结果集为[integer],只剩下了一个元素,其余的同理,这被称为条件结果集。”

智能提示只会弹出一条选择,那就是“Prop1”,当然,这恰恰是我们需要的,如果你没有定义错的话。

有时候为了灵活性,M1不写类型,(Zero语言虽然不是动态语言,但它允许这么做,也是泛X的一部分)那么:
var m1;
m1:= GetPropertyValue( );

这时候,智能提示所给的结果集就是[Prop1,Prop2,Prop3],具有三个选项,在三个选项中任选其一即可。我们刚刚说到,Zero语言虽然
不是动态语言,但它允许不定义类型,现在解释如下:

如果我们在()中输入的是Prop2,那么m1就被认为是double类型,按照Zero的内部分析机制,相当于为m1的类型增加了一个约束,结果集是
[double],也就是说,m1的类型在此刻被判定为double。

从这个简单的例子可以看出,Zero语言的写法,是可以极度抽象的,在任何不确定的,可以替换的地方,都可以用Ψ变量来表达,这正印证了我在“从泛型到
泛X”中的说法:

“程序的世界中还有大量需要泛的东西,我称之为泛X,一切以人为本,以人的思维特点为参照,在程序世界中找到与之相对应的各种结构或者叫模式。这样才能
提高软件的生产力,不再在一些繁琐的力不从心的细节上疲于奔命。”

虽然这里采用了高度的抽象,但代码的写法,却是极其通俗易懂,直接是人类思维模型的映射。同时,通过复杂的内部机制,为程序员提供了一个严格却友好的代
码交互环境。

Reply all
Reply to author
Forward
0 new messages