簡體   English   中英

接口隔離原則在一組對象上

[英]Interface Segregation Principle on a collection of objects

我正在研究SOLID原則,而接口隔離原則使我很難理解這種情況。

基本上,我有一組使用接口的對象...用戶...。

public interface IUserInfo 
{
    string Name { get; }
    string Extension { get; }
}

問題在於,在某些情況下,繼承此接口的類將不使用擴展名。 因此,為了解決這個問題,它只返回一個空字符串。

現在,從技術上講,這很好,因為字符串已綁定到UI。 因此,它將僅顯示該字段的空字符串。

但是,這違反了接口隔離原則。 建議的是拆分這些接口。

但是后來我遇到了想要在集合中使用此接口的問題,請考慮以下問題:

public interface IUserExtension : IUserInfo
{
    string Extension { get; }

}
    public ObservableCollection<IUserInfo> StoredUserInfos { get; set; } = new ObservableCollection<IUserInfo>()
    {
        new User1(),
        new User2(),
    };

    public class User1 : IUserExtension
    {
        public string Name { get; } = "Alex";
        public string Extension { get; } = "(715) 925";

        public override string ToString()
        {
            return Name;
        }
    }

    public class User2 : IUserInfo
    {
        public string Name { get; } = "Daniel";
        public override string ToString()
        {
            return Name;
        }
    }

我無法綁定到該集合的索引並獲得擴展,因為它是IUserInfo接口。 巧合的是,由於User2類沒有實現它,因此我也不能將其作為IUserExtension的集合。

據我所知,唯一可行的方法是使用模式匹配

        if (UserIndex != -1)
        {
            var userInfo = StoredUserInfos[UserIndex];
            Extension = userInfo is IUserExtension info ? info.Extension : "No Extensions";
            Name = userInfo.Name;
        }

但這會增加代碼的復雜性,並且可能會違反其他規則,因為它正在檢查類型。

在這種情況下,最好的解決方案是實現一個實現該接口的抽象類,而默認實現是一個空字符串嗎?

這是一個困難的過程,但是我要伸出脖子來嘗試回答。

在IUserInfo接口中包括Extension是否違反ISP? 我認為是和不是。

假設您要在IUserInfo接口中包含MiddleName屬性。 中間名並不是所有人都擁有的,但是您可能不想將其添加到單獨的接口中。 它們與“名稱”屬性一起是一個內聚單元,即它們屬於一起。

在這種情況下,您可能希望返回一個空字符串(如上所示)或類似的內容。 (對於行為更復雜的對象,“ 空對象”模式是一個更好的解決方案。)

因此,如果我們回到上面的問題,您是否將Extension視為自己屬於接口的東西? 可能不是。 再次,讓我們想象將EmailAddress添加到IUserInfo接口。 與擴展一起,它們構成了一個有凝聚力的單元,並在概念上代表了聯系方式。 如果要將它們提取到單獨的界面中,則仍然會有一些沒有擴展名的用戶,在這種情況下,您需要返回一個空字符串(或類似字符串)。

因此,為回答您的問題,我認為如果不太可能使用其他屬性擴展接口,則可以將Extension保留在IUserInfo接口中。 否則,創建一個代表聯系人詳細信息概念的接口,但是如果用戶沒有擴展名,則仍然返回一個空字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM