Ich glaube, die Frage ist selbsterklärend. Ich würde mich eher auf das Beispiel konzentrieren, um die Frage zu unterstützen.Schnittstelle Trennung Prinzip - Wie zu entscheiden, was zu trennen?
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
public interface ICollection : IEnumerable
{
void CopyTo(Array array, int index);
int Count { get; }
Object SyncRoot { get; }
bool IsSynchronized { get; }
}
public interface IList : ICollection
{
Object this[int index] { get; set; }
int Add(Object value);
bool Contains(Object value);
void Clear();
bool IsReadOnly { get; }
bool IsFixedSize { get; }
int IndexOf(Object value);
void Insert(int index, Object value);
void Remove(Object value);
void RemoveAt(int index);
}
Es ist klar, dass IEnumerable
getrennt ist nur über Sammlungen Looping zu ermöglichen. Aber ich verstehe nicht, warum sie ICollection
und IList
getrennt gehalten haben? Selbst wenn sie eins wären, würde IList nicht fett werden, weil dieses Verhalten immer von jeder Sammlung verlangt würde?
Ich stieß auf this Beitrag, der sagt, dass Ihre API IEnumerable
zurückgeben würde, wenn Client nur Schleife der Elemente benötigt, ICollection
, wenn nur Lesezugriff erforderlich war und so weiter.
Wie hat MSFT ISP so perfekt angewendet, dass es in all den Jahren nie Probleme verursacht hat?
Wird ISP einen fortlaufenden Prozess basierend auf Client-Code-Anforderungen oder einer einmaligen Anwendung anwenden? Wenn ISP nur einmal angewendet wird, dann ist meine Frage in dem Posttitel selbst.
Ich bin nicht sicher, ob ich die .NET-Typen als Beispiele für Best Practices verwenden würde. –
Basierend auf dem Beispiel würde ich fragen, warum IList nicht in zwei oder mehr Teile aufgeteilt wurde. Add + Remove könnte eine Stufe unterhalb der At- und der [] -Methode gewesen sein. –