목록을 노출하는 것이 나쁜 것으로 간주되는 이유?
이 질문에 이미 답변이 있습니다.
- List <T> 또는 IList <T> 18 답변
FXCop에 따르면 목록은 API 객체 모델에 노출되지 않아야합니다. 이것이 왜 나쁜 습관으로 간주됩니까?
나는 여기서 정글 속의 무스에 동의한다 : List<T>
은 "수하물"이 많은 제한되지 않고 부풀어 오른 물건이다.
다행히 해결책은 간단 IList<T>
합니다. 대신 노출하십시오 .
의 대부분 List<T>
의 메서드 를 포함하는 베어 본 인터페이스를 노출하고 (같은 것을 제외 AddRange()
하고) 특정 List<T>
유형으로 제한하지 않으므로 API 소비자가 자체 사용자 정의 구현자를 사용할 수 있습니다 IList<T>
.
더 많은 유연성을 위해 IEnumerable<T>
적절한 경우 일부 컬렉션을에 노출하는 것이 좋습니다.
두 가지 주요 이유가 있습니다.
- List <T>는 많은 시나리오와 관련이없는 멤버가 많은 다소 부풀어 오른 유형입니다 (공용 개체 모델에 대해 너무 "바쁨").
- 클래스가 봉인되지 않았지만 특별히 확장되도록 설계되지 않았습니다 (멤버를 재정의 할 수 없음).
수천 또는 수백만 명의 개발자가 사용할 API를 작성하는 경우에만 나쁜 습관으로 간주됩니다.
.NET 프레임 워크 설계 지침은 Microsoft의 공용 API를위한 것입니다.
많은 사람들이 사용하지 않는 API가있는 경우 경고를 무시해야합니다.
나는 당신의 소비자가 당신의 수익에 새로운 요소를 추가하는 것을 원하지 않는다고 생각합니다. API는 명확하고 완전해야하며 배열을 반환하는 경우 정확한 데이터 구조를 반환해야합니다. 나는 그것이 말 당 T와 관련이 있다고 생각하지 않지만 오히려 배열 [] 대신 List <>를 직접 반환합니다.
한 가지 이유는 List가 시뮬레이션 할 수있는 것이 아니기 때문입니다. 덜 인기있는 라이브러리에서도이 권장 사항으로 인해 List 개체를 IList로 노출하는 데 사용되는 반복을 보았으며 이후 버전에서는 데이터를 목록 (아마도 데이터베이스)에 저장하지 않기로 결정했습니다. IList 였기 때문에 클라이언트 아래의 구현을 변경하면서도 모든 사람이 계속 작업하는 것은 큰 변화가 아니 었습니다.
그 이유 중 하나는 사용자가 목록을 변경할 수 있고 목록 소유자가 이에 대해 알지 못하지만 경우에 따라 목록에 항목을 추가 / 제거한 후 몇 가지 작업을 수행해야하기 때문입니다. 지금은 필요하지 않더라도 미래의 요구 사항이 될 수 있습니다. 따라서 클래스 소유자에게 AddXXX / RemoveXXX 메서드를 추가하고 목록에 IEnumerable을 노출하거나 (내 의견으로는 더 낫습니다) IList로 노출하고 WindowsBase에서 ObservableCollection을 사용하는 것이 좋습니다.
참조 URL : https://stackoverflow.com/questions/387937/why-is-it-considered-bad-to-expose-listt
'IT story' 카테고리의 다른 글
Yarn에서 글로벌 패키지를 업데이트하려면 어떻게해야합니까? (0) | 2020.12.25 |
---|---|
RESTful 서비스를 디버깅하는 방법은 무엇입니까? (0) | 2020.12.25 |
Facebook 오프라인 액세스 단계별 (0) | 2020.12.25 |
해시 코드 계산을위한 합리적인 소수는 무엇입니까? (0) | 2020.12.25 |
log4net에서 프로그래밍 방식으로 버퍼를 플러시하는 방법이 있습니까? (0) | 2020.12.25 |