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

本文介绍了DJ语言中channel与contract的概念及其使用方法。通过具体的代码示例,展示了如何利用check和test来进行方法级别的验证,以及如何定义合约来实现操作多态。
四、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部分我都以省略号代替了,实在是找不到校验他们的理由smile_wink.gif但是我希望通过这个例子,向大家显示,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定义,以减少自己的工作量。引用的方法,也是“冒号”。
 
(未完待续)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值