규칙 클래스 이름: DoNotExposeGenericList
규칙 ID: CA1002
분류: 디자인 규칙
메시지 레벨: 에러
확실도: 95%

원인: System.Collections.Generic.List<T> 타입을 외부로 노출시켰거나, 리턴 타입으로 사용하거나, 혹은 파라미터로 사용했을 때 이 규칙에 위반된다.

규칙 설명
System.Collections.Generic.List<T>는 성능을 위해서 디자인된 제네릭 컬렉션이며 상속성등은 고려되지 않았다. 그래서 어떤 가상 멤버도 그 안에 포함할 수가 없다. 아래의 제네릭 컬렉션은 상속성을 고려해서 디자인되었으므로, 리턴 타입/파라미터/외부 노출 형식에는 아래 타입들을 써야 할 것이다.

원문: http://www.gotdotnet.com/team/fxcop/Docs/Rules/Design/DoNotExposeGenericLists.html

* System.Collections.Generic.List<T>는 MSDN을 보면 나와있듯이 ArrayList의 Generic 버전이라고 생각하면 된다. 즉, 동적으로 크기가 늘어나고 빠르게 접근할 수 있는 특정 구현 형태로 보면 될 것이다.
외부 노출/리턴 타입/파라미터 등은 각 클래스들이 관계를 맺는 방식에 영향을 줄 수 있다. 이런 곳에서 상속할 수 없는 특정 구현 형태를 사용함으로써 그것에 얽매이는 것은 매우 좋지 않다는 것이 바로 이 규칙이 말하는 바라고 생각된다.
Posted by kkongchi

댓글을 달아 주세요

  1. 자바쪽도 JDK5부터 generic이 지원됬죠. 무지 좋습니다. 타입을 정의함으로써 내부적으로 메모리 할당이나 속도면에서 획기적으로 바뀌었으니까요.
    그냥 List 보다 List<Integer> 이 더 관리측면에서는 더 좋죠. 물론 사용하는 측면에서도요. ^^

    2007.02.21 12:45 [ ADDR : EDIT/ DEL : REPLY ]
  2. FAQ: Why does DoNotExposeGenericLists recommend that I expose Collection<T> instead of List<T>? [David Kean]
    ; http://blogs.msdn.com/fxcop/archive/2006/04/27/585476.aspx

    위의 토픽에서도 잘 설명해 주고 있습니다. ^^

    2007.02.21 14:12 [ ADDR : EDIT/ DEL : REPLY ]
  3. 좋은 정보네요~ ^^

    2007.03.28 16:09 [ ADDR : EDIT/ DEL : REPLY ]