`
庄表伟
  • 浏览: 1152317 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

敲响OO时代的丧钟——一种新的语言(6)

阅读更多
四、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定义,以减少自己的工作量。引用的方法,也是“冒号”。
 
(未完待续)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics