WEB开发网
开发学院软件开发C语言 Effective C# 原则33:限制类型的访问 阅读

Effective C# 原则33:限制类型的访问

 2009-02-19 08:16:01 来源:WEB开发网   
核心提示: 对于我们这样的使用者来说,不须要知道ArrayListEnumerator类,Effective C# 原则33:限制类型的访问(2),所有你须要知道的,就是当我们在ArrayList对象上调用GetEnumerator函数时,在安装过程中还要对国际电话号码进行验证,与其粘贴额外的功能代码

对于我们这样的使用者来说,不须要知道ArrayListEnumerator类,所有你须要知道的,就是当我们在ArrayList对象上调用GetEnumerator函数时,你所得到的是一个实现了IEnumerator接口的对象。而具体的实现则是一个明确的类。.Net框架的设计者在另一个集合类中使用了同样的模式:哈希表(Hashtable)包含一个私有的HashtableEnumerator, 队列(Queue)包含一个QueueEnumerator, 等等。私有的枚举类有更多的优势。首先,ArrayList类可以完全取代实现IEnumerator的类型,而且你已经成为一个贤明的程序员了,不破坏任何内容。其实,枚举器类不须要是CLS兼容的,因为它并不是公共的(参见原则30)。而它的公共接口是兼容的。你可以使用枚举器而不用知道实现的类的任何细节问题。

创建内部的类是经常使用的用于限制类型可见范围的概括方法。默认情况下,很多程序员都总是创建公共的类,从来不考虑其它方法。这是VS.net的事。我们应该取代这种不加思考的默认,我们应该仔细考虑你的类型会在哪些地方使用。它是所有用户可见的?或者它主要只是在一个程序集内部使用?

通过使用接口来暴露功能,可以让你更简单的创建内部类,而不用限制它们在程序集外的使用(参见原则19)。类型应该是公共的呢?或者有更好的接口聚合来描述它的功能?内部类可以让你用不同的版本来替换一个类,只要在它们实现了同样的接口时。做为一个例子,考虑这个电话号码验证的问题:

public class PhoneValidator
{
 public bool ValidateNumber( PhoneNumber ph )
 {
  // perform validation.
  // Check for valid area code, exchange.
  return true;
 }
}

几个月过后,这个类还是可以很好的工作。当你得到一个国际电话号码的请求时,前面的这个PhoneValidator就失败了。它只是针对US的电话号码的。你仍然要对US电话号码进行验证,而现在,在安装过程中还要对国际电话号码进行验证。与其粘贴额外的功能代码到一个类中,还不如了断减少两个不同内容耦合的做法,直接创建一个接口来验证电话号码:

Tags:Effective 原则 限制

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接