接口设计: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) 收藏 举报