인터페이스 또는 클래스 반환


9

내가 방법을 가지고 있다고 가정

public List<User> GetBatchOfUsers(IEnumerable<int> userIDs)
{
    List<User> users = new List<User>();

    // some database stuff

    return users;
}

a를 반환하는 대신 인터페이스 ( IList또는 IEnumerable) 를 반환하는 것이 더 낫다는 것을 읽었습니다 List. 내가 들었던 몇 가지 주장은 데이터를 숨기고 API 개발자에게 나중에 데이터의 내부 표현을 변경할 수있는 유연성을 제공한다는 것입니다.

방금 반환에 대한 나의 관심사는 IEnumerable임의 액세스 및 Count속성 과 같은 기능이 손실된다는 것 입니다.

나는 IEnumerable매개 변수로 수용하는 것이 의미가 있다는 것을 알고 있습니다 . 소비자가 분석법을 작동시키는 데 필요한 최소한의 요구 사항 인 내 방법으로 데이터를 보낼 수있는 최상의 유연성을 제공합니다.

반품 유형에 대한 모범 사례는 무엇입니까?


5
훨씬 더 중요한 : 인터페이스를 매개 변수 유형으로 사용하십시오.
Michael Borgwardt

답변:


10

일반적으로 인터페이스로 시작하여 추가 방법을 예상보다 자주 사용하는 경우 콘크리트 유형을 반환 유형으로 전환 할 수 있습니다.

글쎄, 당신이 인터페이스를 반환하면 더 많은 유연성을 유지합니다. 나중에 다른 구체 유형을 리턴하도록 구현을 변경할 수 있습니다. 반면에, 그것은 발신자에게 정보를 덜 제공하므로 특정 작업을 수행하지 못할 수 있습니다. 예를 List<T>들어을 반환 하면 호출자는을 반환한다고 선언하면 변환 할 수없는 ConvertAll 등을 사용할 수 있습니다 IList<T>. 경우에 따라 구체적 유형을 지정하는 것이 좋습니다.

Count 또는 Sort 메서드와 관련하여 표준 컬렉션 인터페이스는 없습니다. 그러나 IList를 정렬하거나 계산하는 확장 메서드를 작성할 수 있습니다.


나는 이것이 정말로 어려운 규칙이 아닌 것 같아?
Matthew

예, 실제로 사용법에 따라 다릅니다.
Yusubov

1

컬렉션을 필요로하는 Count경우을 사용할 수 있습니다 ICollection<T>.


-1. 카운트는 이미 논의
되었고이

@ Konrad Rudolph, 이것은 대답이 아니며 의견입니다.
superM

@superM 인터페이스 자체를 결정해야하는 OP의 이유를 명시 적으로 다루기 때문에 자체 답변을 얻을만한 가치가 있다고 생각합니다.
Konrad Rudolph

1

정의하고있는 메소드에 대해 신중한 것을 리턴합니다. 일련의 항목을 반환하는 중입니까 (초점은 항목에 있음) 또는 항목 모음을 반환하는 중입니까 (초점은 컬렉션 전체에 있음)? 컬렉션 구현에 차이를 허용하는 것이 가치가 있습니까? 생성기를 사용하는 것이 합리적이지 않거나을 사용하는 HashSet것이 List좋습니다.


1

예 방법에 특정 : 당신은 그 권리를 돌려 IEnmuerable<T>당신의 기능을 잃게 의미 Count(당신이 LINQ 방법을 사용할 수 있지만 및 인덱싱을 Count()하고 ElementAt()실제로 구현에 사용하고있는 형태를 효율적으로 구현된다 IList<T>).

를 반환 IList<T>하면 일부 기능이 손실되지만 일반적으로 얻을 수있는 이점은 그만한 가치가 있습니다.

그러나 소비자가 반환 된 컬렉션을 변경하는 것은 이치에 맞지 않기 때문에 IEnumerable<T>and 사이에있는 것이 더 좋습니다. 그러나 IList<T>그가 사용 Count하거나 인덱싱 하는 것은 이치에 맞습니다.

.Net 4.5에는 다음과 같은 인터페이스가 IReadOnlyList<T>있습니다.


IReadOnlyListVS2013을 얻을 수있을 때 좋은 소리가납니다. 감사합니다!
Matthew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.