接口设计:Property是Experssion,不能单独构成语句

Property是C#语言的一个特性,本质上它和Java的getXXX()方法没有差别。在IL中,Property也是被编译成get_XXX()方法。但是从语法上Property和函数毕竟还是有区别的,其中一个值得注意的区别就是,Property是一个表达式,而一个函数调用是一个语句,Property不能单独构成一个语句。

有时候可以利用这个区别,在设计接口时,从语法上强迫user正确地使用接口。这是来自实际遇到的一个例子:

public class WebPageTestUtility
{
    public Element SelectElement()
    {
        // ....
    }
}

public class SomeTest
{
    public void f()
    {
        WebPageTestUtility webTest;
        // ...
        webTest.SelectElement().Click();
    }
}

WebPageTestUtility是一个帮助类,它的一个方法叫做SelectElement(),作用是取得一个Element,然后操作这个Element。SelectElement()包含一些逻辑在里面,有一定复杂性,因而理所当然地被写成一个函数。

在实际使用的时候,经常会忘掉写Click()函数,结果就变成这样:

public class B
{
    public void g()
    {
        WebPageTestUtility webTest;
        // ...
        webTest.SelectElement();
    }
}

如此的bug经常出现,比较浪费时间。

可以修改一下接口,使SelectElement编程一个Property,user用起来就会变成这样:

public class B
{
    public void g()
    {
        WebPageTestUtility webTest;
        // ...
        webTest.SelectElement.Click();
    }
}

如果忘记了调用Click(),就会报语法错——“表达式不能出现在这里”云云。因此user就不会再忘记调用Click()了。

严格地说,这样设计接口违反了一个原则,即Property里面不建议包含复杂逻辑。但是这样做毕竟减少了user的使用错误,许多场合下还是有其可取之处。

posted on 2012-06-18 14:21  practitioner  阅读(1502)  评论(4)    收藏  举报