규칙 ID: CA1002
분류: 디자인 규칙
메시지 레벨: 에러
확실도: 95%
원인: System.Collections.Generic.List<T> 타입을 외부로 노출시켰거나, 리턴 타입으로 사용하거나, 혹은 파라미터로 사용했을 때 이 규칙에 위반된다.
규칙 설명
System.Collections.Generic.List<T>는 성능을 위해서 디자인된 제네릭 컬렉션이며 상속성등은 고려되지 않았다. 그래서 어떤 가상 멤버도 그 안에 포함할 수가 없다. 아래의 제네릭 컬렉션은 상속성을 고려해서 디자인되었으므로, 리턴 타입/파라미터/외부 노출 형식에는 아래 타입들을 써야 할 것이다.
- System.Collections.ObjectModel.Collection<T>
- System.Collections.ObjectModel.ReadOnlyCollection<T>
- System.Collections.ObjectModel.KeyedCollection<Tkey, TItem>
원문: http://www.gotdotnet.com/team/fxcop/Docs/Rules/Design/DoNotExposeGenericLists.html
* System.Collections.Generic.List<T>는 MSDN을 보면 나와있듯이 ArrayList의 Generic 버전이라고 생각하면 된다. 즉, 동적으로 크기가 늘어나고 빠르게 접근할 수 있는 특정 구현 형태로 보면 될 것이다.
외부 노출/리턴 타입/파라미터 등은 각 클래스들이 관계를 맺는 방식에 영향을 줄 수 있다. 이런 곳에서 상속할 수 없는 특정 구현 형태를 사용함으로써 그것에 얽매이는 것은 매우 좋지 않다는 것이 바로 이 규칙이 말하는 바라고 생각된다.
'코드분석 규칙 > 디자인 규칙' 카테고리의 다른 글
[번역]디자인규칙3. 제네릭 목록을 노출하지 마십시오 (6) | 2007.02.21 |
---|---|
[번역]디자인규칙2. 삭제가능한 필드가 있는 형식은 삭제가능해야 합니다 (0) | 2006.10.21 |
[번역]디자인규칙1. 정적 멤버를 제네릭 형식으로 선언하지 마십시오 (0) | 2006.10.16 |
[Article]VSTS 코드 분석 디자인 규칙 (0) | 2006.10.14 |
댓글을 달아 주세요
자바쪽도 JDK5부터 generic이 지원됬죠. 무지 좋습니다. 타입을 정의함으로써 내부적으로 메모리 할당이나 속도면에서 획기적으로 바뀌었으니까요.
2007.02.21 12:45 [ ADDR : EDIT/ DEL : REPLY ]그냥 List 보다 List<Integer> 이 더 관리측면에서는 더 좋죠. 물론 사용하는 측면에서도요. ^^
역시 서로 닮아가고 있군요..자바와 닷넷..ㅎㅎ
2007.02.21 15:21 신고 [ ADDR : EDIT/ DEL ]FAQ: Why does DoNotExposeGenericLists recommend that I expose Collection<T> instead of List<T>? [David Kean]
2007.02.21 14:12 [ ADDR : EDIT/ DEL : REPLY ]; http://blogs.msdn.com/fxcop/archive/2006/04/27/585476.aspx
위의 토픽에서도 잘 설명해 주고 있습니다. ^^
매번 좋은 자료 감사합니다. 그리고 방문해 주신 점도요^^
2007.02.21 15:22 신고 [ ADDR : EDIT/ DEL ]좋은 정보네요~ ^^
2007.03.28 16:09 [ ADDR : EDIT/ DEL : REPLY ]ㅎㅎ 방문해주셔서 감사합니다.
2007.03.31 00:44 신고 [ ADDR : EDIT/ DEL ]