2011-03-02 3 views
4

열거 형을 허용하는 함수를 작성하는 동안 나는이 혼란에 직면합니다. 어느 다음 옵션에서 더 좋을 것 노출 API :api 서명을 결정하는 방법

public void Resolve(Func<bool>[] howtos) 

public void Resolve(IEnumerable<Func<bool>> howtos) 

public void Resolve(List<Func<bool>> howtos) 

나는 일반적으로 다음에 따라 결정합니다 입력이 항목을 추가하거나 삭제하여 수정해야 이라면 다른 사람을 IEnumerable을 사용하여 목록을 사용합니다. 배열 옵션에 대해 잘 모르겠습니다.

노출 될 api를 결정할 때 고려해야 할 다른 사항이 있습니까? on을 다른 것보다 선호해야하는 상황을 명확하게 식별하는 규칙이 있습니까?

고마워요.

답변

4

가장 제한이 적은 매개 변수 유형을 항상 허용해야합니다.

IEnumerable<T>, ICollection<T> 또는 IList<T>을 의미합니다.
이렇게하면 클라이언트는 HashSet<T> 또는 ReadOnlyCollection<T>과 같은 모든 종류의 구현을 자유롭게 전달할 수 있습니다.

특히 당신은 또한 항목을 추가하거나 제거 할 경우에만, ICollection<T>의 데이터를 반복해야하는 경우, 당신은 IEnumerable<T>을해야하거나 크기를 알 필요가 있고, IList<T> 경우는 (인덱서를 랜덤 액세스를 필요로하는 경우).

+0

Resharper는 일반적으로 가장 제한이 적은 유형이 없을 때 알려줍니다. –

+0

@ Yuriy : 코드 분석과 동일합니다. – SLaks

1

좋은 방법입니다. 내가 바꿀 유일한 것은 List<T> 대신에 IList<T>이 있어야한다는 것입니다. 예를 들어 사용자가 목록에 추가하는 내용의 유효성을 검사하도록 허용합니다.

2

이 결정을하기에 나를 위해 주요 요인은 컬렉션하고 실제로 해결 무엇

입니까? 해결은 어떤 방법으로 컬렉션을 돌연변이되지 않은 경우

후, 나는 절대적으로 IEnumerable<Func<bool>> 서명을 선호 할 것입니다. 가장 많은 사용 사례를 허용하며 API의 의도를 가장 정확하게 표현합니다. 나는 어떤 사람들이 List<T>과 같은 더 구체적인 유형을 취하는 것이 전달 된 컬렉션을 수정하려고한다고 가정합니다. IEnumerable<T>을 보면 컬렉션이 단순히 열거된다는 확신이 들게됩니다.

Resolve가 콜렉션에 돌연변이를 일으키고 있다면 List<T> 시그니처를 선호하여 돌연변이가 실제로 가능했음을 나타낼 수 있습니다. 우리는 아마도 IEnumerable<T>을 가져 와서 유창한 인터페이스를 만들 것입니다. Resolve 메소드의 유형에 따라 많이 달라질 것입니다. 하나를 선택할 때 일반화하기가 어렵습니다.

+0

감사합니다. 좋은 설명. +1 – stackoverflowuser

관련 문제