並非所有型別都應為 public。在滿足功能前提下,應將型別存取層級限制在最小必要範圍。VS.NET 預設建立 public class 往往過度暴露,實際上許多類別僅供組件內部使用,應標記為 internal。
.NET Framework 大量採用此模式。例如 ArrayList 內部定義私有 ArrayListEnumerator 實作 IEnumerator:
public class ArrayList : IEnumerable
{
private class ArrayListEnumerator : IEnumerator { ... }
public IEnumerator GetEnumerator() => new ArrayListEnumerator(this);
}
優勢:
IEnumerator),不依賴具體實作類別。以電話號碼驗證為例:
public interface IPhoneValidator { bool ValidateNumber(PhoneNumber ph); }
internal class USPhoneValidator : IPhoneValidator { ... }
internal class InternationalPhoneValidator : IPhoneValidator { ... }
搭配 Factory 模式,外部僅見介面,實作類別隱藏於組件內部。新增地區驗證無需修改公開合約。
公開的類別與介面構成組件契約,一旦發布便難以變更。盡量減少公開型別,保留未來擴充與重構彈性。預設使用 internal,唯有確須跨組件使用時才設為 public。