四、channel与contract
如果我们要对UserChannel进行校验,可以在两个层面进行。
一个是每个方法,都可以写check:与test:。
另一个是在整个channel层面,还可以再写同时牵涉到多个方法的test:。
channel UserChannel<datatype User user>{public String getUserName(){return user.name;check:......test:........}public void setUserName(String name){user.name=name;check:......test:........}public int getAge(){return user.age;check:......test:........}public void setAge(int age){user.age=age;check:......test:........}test:........}
这个channel里的check和test部分我都以省略号代替了,实在是找不到校验他们的理由
但是我希望通过这个例子,向大家显示,DJ是一个极其重视check、test的语言,在每一级,都可以有直接的、语法支持的校验。

如果我们定一个完全空的channel,只有各个方法定义与check,test部分,这就意味着我们定义了一个“合约”。我们以关键字contract来表示对于合约的定义。也许有人会说:“你这不就是interface吗?为什么又要新搞出一个关键字呢?”,在我看来,在java中interface最大的用处,就在于他具有初步的DBC的效果,而interface的缺点,就在于无法在使用过程中,与某一个class所定义的类型所区分。因此,我另外定义一个“纯粹的,定义操作合约的语法元素——contract”。
contract UserPOJO<datatype User user>{public String getUserName(){check:......test:........}public void setUserName(String name){check:......test:........}public int getAge(){check:......test:........}public void setAge(int age){check:......test:........}test:........}
在以这样的方式定义了UserPOJO这个contract之后,我们再来写UserChannel,就可以少写很多东西了。
channel UserChannel<datatype User user>:UserPOJO{public String getUserName(){return user.name;}public void setUserName(String name){user.name=name;}public int getAge(){return user.age;}public void setAge(int age){user.age=age;}}
注意这红颜色的部分,这样的定义就意味着,UserChannel的行为,符合UserPOJO所限定的操作语义。channel UserChannel<datatype User user>:UserPOJO,ExtendUser。如果我们这样定义,就意味着UserChannel需要同时满足两种不同的“合约”。
在定义contract的时候,可以省略<datatype User user>部分,这就意味着,处理不同数据的channel,可以满足同样的“contract”定义,这样也为DJ需要的定义操作多态,打下了基础。
另外,contract的定义,也是可以“代码重用”的。一个contract,可以引用另一个contract定义,以减少自己的工作量。引用的方法,也是“冒号”。
(未完待续)