2016-06-17 1 views
2

나는 그 질문이 스스로 설명하는 것이라고 믿는다. 차라리 질문을지지하기 위해 예제에 좀 더 집중할 것입니다.인터페이스 분리 원칙 - 분리 대상 결정 방법은 무엇입니까?

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); 
} 

IEnumerable이 컬렉션을 통해 반복 만 할 수 있도록 분리 된 것이 분명하다. 그러나 나는 그들이 왜 ICollectionIList을 분리하여 보관했는지 이해하지 못한다. 비록 그들이 하나 일지라도, IList는 그 행동이 어떤 콜렉션에 의해 항상 요구되기 때문에 지방이되지 않을 것입니까?

나는 클라이언트 만 등 읽기 전용 액세스가 필요한 경우 항목 ICollection의 루프에 필요하고 경우 API는 IEnumerable을 반환 말한다 this 포스트를 가로 질러왔다.

MSFT는 어떻게 ISP를 완벽하게 적용하여 지난 몇 년 동안 아무런 문제도 일으키지 않았습니까?

ISP에 클라이언트 코드 요구 사항 또는 한 번만 적용되는 응용 프로그램을 계속 적용합니까? ISP가 한 번만 적용되는 경우 내 질문은 게시물 제목 자체에 있습니다. 그들은 ICollectionIList 분리를 유지하는 이유

+1

.NET 형식을 모범 사례의 예로 사용하는지 잘 모르겠습니다. –

+1

예제를 기반으로 IList가 2 개 이상의 부분으로 분할되지 않은 이유를 묻습니다. Add + Remove는 At 및 [] 메소드보다 낮은 레벨 일 수 있습니다. –

답변

2

이해가 안 돼요?

IList은 색인으로 항목을 얻는 것이 논리적 인 컬렉션입니다. 하위 인터페이스로의 분리는 색인 생성이 정의되지 않은 다른 모음이 존재한다는 사실을 인식하여 이루어집니다. ISet은 이러한 컬렉션의 예입니다.

ICollection 병합 및 IList 때문에 이러한 네 가지 방법 구현 할 필요없이 깨끗한 방법으로 ISet을 정의하는 하나의 능력에 부정적인 결과있을 것입니다 : 한편

this[int index] 
int IndexOf(Object value) 
void Insert(int index, Object value) 
void RemoveAt(int index) 

을, 하나는 합리적 방법을 주장 할 수

int Add(Object value); 
bool Contains(Object value); 
void Clear(); 
bool IsReadOnly { get; } 
bool IsFixedSize { get; } 
void Remove(Object value); 

ICollection 인터페이스에 속할 수 있습니다.

인터페이스 분리 원리 - 무엇을 분리 할 것인가?

분류 할 항목을 결정하는 작업은 수업이 진행 중일 때 되돌아 보면 훨씬 쉽습니다. 구현되어 있지 않은 예외를 throw하기 위해서 필요한 클래스가 있을지 어떨지를 확인합니다. 이 방법들은 도입 될 필요가있는 하위 인터페이스로 이동할 수있는 주요한 후보입니다. 예를 들어

IList 방법 ICollection 내로 이동하여, 설계를 시작하지 고려하고, 더 IList 하위 인터페이스. 이 두 인터페이스를 사용하여 ListLinkedList 클래스를 성공적으로 빌드 할 수 있습니다.

이제 HashSet을 믹스에 추가하는 것을 고려하십시오. 이 클래스는 집합 콜렉션이있는 4 개의 메소드를 구현해야합니다. 이는 하나 또는 두 개의 하위 인터페이스를 추가하는 것을 고려해야 함을 나타냅니다. 하나는 목록 용이고 다른 하나는 집합 용입니다.

인터페이스를 사용해야하는 특정 클래스의 요구를 충족시키는 경향이 있으므로 클래스를 만들기 전에 분리를 결정하는 것이 훨씬 더 어렵습니다. 플랫 인터페이스 구조로 시작하여 후속 릴리스에서 리팩터링을 통해 확장하는 것은 드문 일이 아닙니다.

+0

차가워지면 나에게 더 분명해진다. 실제 질문 - * 인터페이스 분리 원칙 - 분리 할 항목을 결정하는 방법 * ISP에서 고려해야 할 핵심 사항은 무엇입니까? – niksofteng

+1

ISP 위반의 명확한 '냄새'와 분리해야 할 부분을 결정하는 방법에 대한 명확한 안내는 클래스가 인터페이스를 구현하고 하나 이상의 메소드가 'NotImplementedException'을 던집니다. 인터페이스의 특정 부분이 있습니다. –

+0

@ Think2ceCode1ce 또는이 특정 질문의 경우 집합/유한 집합/정렬 된 유한 집합 개념을 표현할 수 있습니다. –