方法中参数和返回类型的指导原则

参数指导原则:   
封装公共方法的参数类型时,应尽量指定最弱的类型,最好的是接口而不是几类。例如:如果要写一个方法来处理一组数据项,最好是用接口(比如IEnumerable<T>)来声明方法的参数,而不是要写强数据类型(比如List<T>)或者更强的接口类型(比如ICollection<T>或者IList<T>):如下两个例子:

好的方法,该方法使用一个弱类型参数类型
public void ShowItem(IEnumerable<T> collection){} 

不好的方法:该方法使用一个强类型参数类型
public void ShowItem(List<T> collection){} 

当然原因是调用第一个方法时,可传递数组对象、List<T>对象、String对象或者对象实现了IEnumerable<T>接口。而第二个方法只允许传递List<T> 对象,不接受数组或者String 对象。显然,第一个方法更加灵活适用于更泛的情形。
   如果方法需要的是一个列表(而非仅仅是可枚举的对象),就应该将参数类型声明为IList<T>,但是最好避免将参数声明为List<T>,而声明为IList<T>,调用者可向方法传递数组和实现了IList<T> 的其它类型的对象。
 需要注意的是这里的例子是对集合的讨论,它是一个接口体系结构来设计的。如果要讨论使用基类体系结构设计的类,概念同样适用。例如:假定要实现一个对流中的字节进行处理的方法,可定义如下方法:
 
好的方法:该方法使用一个弱类型参数类型
public void ProcessStream(Stream stream){}

不好的方法:该方法使用强参数类型
public void ProcessString(FileStream stream){}

第一个方法能够处理任何一种流,包括FileSteam,NetWorkStream和MemorySteam等。
第二个方法只能处理FileSteam流,这样就限制了方法的应用。

返回类型指导原则:
一般最好是将方法的返回类型声明为最强的类型(已免受限于特定的类型)。例如:最好声明方法返回一个FileStream对象而不是Stream对象:
好的方法:方法返回一个强返回类型
public FileStream OpenFile(){}

不好的方法:该方法返回一个弱返回类型
public Stream OpenFile(){}

第一个方法是首选的,它允许方法的调用者选择将返回对象为FileStream对象或者一个Stream 对象。
第二个方法要求调用者将返回对象视为一个Stream对象。总之要确保调用者在调用方法时有尽量大的灵活性或者使用方法的范围更大。
   有时想在不影响调用者的前提下修改方法内部的实现。比如在刚刚的例子中OpenFile方法不太可能更改内部实现来返回除FileStream或者FileStream的派生类型之外的其它对象。但是,如果某个方法返回List<String>对象就可能想在未来的某个方法时候修改它的内部实现,返回一个String[]数组。如果希望保持一定的灵活性,以便将来更改方法返回的东西,请选择一个较弱的返回类型。例如:
较好的方法,返回一个较弱的返回类型
public IList<String> GetCollection(){}

不灵活的方法,返回一个较强类型的返回对象
public List<String> GetCollection(){}

 在这个例子中即使GetCollection()方法在内部使用一个List<String>对象并返回它,但最好还是修改方法的原型,适它返回一个IList<String>。将来,GetCollection方法可更改它的内部集合使用一个String[] 数组。与此同时不需要修改调用者的源代码,事实上调用者甚至不需要重新编译。注意:这个例子在较弱的类型中选择的是最强的那一个。例如:它没有使用最弱的IEnumerable<String>,也没有使用较强的ICollection<String>。
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务