幾個月過後,這個類還是可以很好的工作。當你得到一個國際電話號碼的請求時,前面的這個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創建一個公共的抽象類,它包含通用驗證的實現算法。用戶應該可以通過程序集的基類訪問公共的功能。在這個例子中,我更喜歡用公共接口,因為即使是同樣的功能,這個相對少一些。其他人可能更喜歡抽象類。不管用哪個方法實現,在程序集中盡可能少的公開類。
這些暴露在外的公共類和接口就是你的合約:你必須保留它們。越多混亂的接口暴露在外,將來你就越是多的直接受到限制。越少的公共類型暴露在外,將來就越是有更多的選擇來擴展或者修改任何的實現。
返回教程目錄