程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Effective C#原則33:限制類型的訪問(2)

Effective C#原則33:限制類型的訪問(2)

編輯:關於C語言

幾個月過後,這個類還是可以很好的工作。當你得到一個國際電話號碼的請求時,前面的這個PhoneValidator就失敗了。它只是針對US的電話號碼的。你仍然要對US電話號碼進行驗證,而現在,在安裝過程中還要對國際電話號碼進行驗證。與其粘貼額外的功能代碼到一個類中,還不如了斷減少兩個不同內容耦合的做法,直接創建一個接口來驗證電話號碼:

public interface IPhoneValidator
{
 bool ValidateNumber( PhoneNumber ph );
}

下一步,修改已經存在的電話驗證,通過接口來實現,而且把它做為一個內部類:

internal class USPhoneValidator : IPhoneValidator
{
 public bool ValidateNumber( PhoneNumber ph )
 {
  // perform validation.
  // Check for valid area code, Exchange.
  return true;
 }
}

最後,你可以為國際電話號碼的驗證創建一個類:

internal class InternationalPhoneValidator : IPhoneValidator
{
 public bool ValidateNumber( PhoneNumber ph )
 {
  // perform validation.
  // Check international code.
  // Check specific phone number rules.
  return true;
 }
}

為了完成這個實現,你須要創建一個恰當的類,這個類基於電話號碼類型類,你可以使用類廠模式實現這個想法。在程序集外,只有接口是可見的。而實際的類,就是這個為世界不同地區使用的特殊類,只有在程序集內是可見的。你可以為不同的區域的驗證創建不同的驗證類,而不用再系統裡的其它程序集而煩擾了。

你還可以為PhoneValidator創建一個公共的抽象類,它包含通用驗證的實現算法。用戶應該可以通過程序集的基類訪問公共的功能。在這個例子中,我更喜歡用公共接口,因為即使是同樣的功能,這個相對少一些。其他人可能更喜歡抽象類。不管用哪個方法實現,在程序集中盡可能少的公開類。

這些暴露在外的公共類和接口就是你的合約:你必須保留它們。越多混亂的接口暴露在外,將來你就越是多的直接受到限制。越少的公共類型暴露在外,將來就越是有更多的選擇來擴展或者修改任何的實現。

返回教程目錄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved