열거형 디자인

열거형은 특수한 종류의 값 형식입니다. 열거형에는 단순 열거형과 플래그 열거형의 두 종류가 있습니다.

단순 열거형은 작은 닫힌 선택 집합을 나타냅니다. 단순 열거형의 일반적인 예는 색 집합입니다.

플래그 열거형은 열거형 값에 대한 비트 연산을 지원하도록 설계되었습니다. 플래그 열거형의 일반적인 예는 옵션 목록입니다.

✔️ DO는 열거형을 사용하여 값 집합을 나타내는 매개 변수, 속성 및 반환 값을 강력하게 입력합니다.

✔️ 정적 상수 대신 열거형을 사용하는 것이 좋습니다.

❌ 열려 있는 집합에 열거형을 사용하지 마세요(예: 운영 체제 버전, 친구 이름 등).

❌ 나중에 사용하기 위한 예약된 열거형 값을 제공하지 마세요.

나중에 언제든지 기존 열거형에 값을 추가할 수 있습니다. 열거형에 값을 추가하는 방법에 대한 자세한 내용은 열거형에 값 추가를 참조하세요. 예약된 값은 실제 값 집합을 오염시키고 사용자 오류로 이어지는 경향이 있습니다.

❌ 값이 하나만 있는 열거형을 공개적으로 노출하지 않도록 합니다.

C API의 향후 확장성을 보장하기 위한 일반적인 방법은 메서드 서명에 예약된 매개 변수를 추가하는 것입니다. 이러한 예약된 매개 변수는 단일 기본값을 사용하여 열거형으로 표현할 수 있습니다. 관리되는 API에서는 이 작업을 수행해서는 안 됩니다. 메서드 오버로드를 사용하면 이후 릴리스에서 매개 변수를 추가할 수 있습니다.

❌ 열거형에 sentinel 값을 포함하지 마세요.

프레임워크 개발자에게 도움이 되는 경우도 있지만 sentinel 값은 프레임워크 사용자에게 혼동을 줍니다. 열거형이 나타내는 집합의 값 중 하나가 아닌 열거형의 상태를 추적하는 데 사용됩니다.

✔️ DO는 단순 열거형에 0 값을 제공합니다.

"없음"처럼 값을 호출하는 것이 좋습니다. 이러한 값이 이 특정 열거형에 적합하지 않은 경우 열거형의 가장 일반적인 기본값은 0의 기본값으로 할당되어야 합니다.

✔️ 다음 중 어느 것이라도 충족되지 않는 한(대부분의 프로그래밍 언어에서 기본값) 열거형의 기본 형식으로 사용하는 Int32 것이 좋습니다.

  • 열거형은 플래그 열거형이며 32개 이상의 플래그가 있거나 나중에 더 많은 플래그가 있을 것으로 예상됩니다.

  • 기본 형식은 크기가 다른 Int32 열거형이 필요한 관리되지 않는 코드와의 상호 운용성을 더 쉽게 위해 달라야 합니다.

  • 기본 형식이 작을수록 공간이 상당히 절약될 수 있습니다. 열거형이 주로 제어 흐름의 인수로 사용될 것으로 예상하는 경우 크기는 거의 차이가 없는 것입니다. 다음과 같은 경우 크기 절감이 중요할 수 있습니다.

    • 열거형이 매우 자주 인스턴스화된 구조체 또는 클래스의 필드로 사용될 것으로 예상합니다.

    • 사용자가 열거형 인스턴스의 큰 배열 또는 컬렉션을 만들 것으로 예상합니다.

    • 열거형의 많은 수의 인스턴스가 serialize될 것으로 예상합니다.

메모리 내 사용의 경우 관리되는 개체는 항상 DWORD정렬되므로 인스턴스의 여러 열거형 또는 기타 작은 구조체가 효과적으로 더 작은 열거형을 압축하여 차이를 만들어야 합니다. 전체 인스턴스 크기는 항상 1로 반올림 DWORD되기 때문입니다.

✔️ DO 이름 플래그 열거형에는 복수 명사 또는 명사구, 단수 명사 또는 명사구가 있는 단순 열거형이 있습니다.

❌ 직접 확장 System.Enum 하지 마세요.

System.Enum 는 CLR에서 사용자 정의 열거형을 만드는 데 사용하는 특수 형식입니다. 대부분의 프로그래밍 언어는 이 기능에 액세스할 수 있는 프로그래밍 요소를 제공합니다. 예를 들어 C# enum 에서 키워드는 열거형을 정의하는 데 사용됩니다.

플래그 열거형 디자인

✔️ 플래그 열거형에 System.FlagsAttribute 적용합니다. 이 특성을 단순 열거형에 적용하지 마세요.

✔️ 비트 OR 연산을 사용하여 자유롭게 결합할 수 있도록 플래그 열거형 값에 2의 권한을 사용합니다.

✔️ 일반적으로 사용되는 플래그 조합에 대한 특수 열거형 값을 제공하는 것이 좋습니다.

비트 연산은 고급 개념이며 간단한 작업에는 필요하지 않습니다. ReadWrite 는 이러한 특수 값의 예입니다.

❌ 특정 값 조합이 잘못된 플래그 열거형을 만들지 마십시오.

❌ 값이 "모든 플래그가 지워짐"을 나타내고 다음 지침에 따라 적절하게 이름이 지정되지 않는 한 플래그 열거형 값은 0으로 사용하지 마세요.

✔️ DO 이름을 플래그 열거형의 0 값으로 지정합니다.None 플래그 열거형의 경우 값은 항상 "모든 플래그가 지워집니다."를 의미해야 합니다.

열거형에 값 추가

이미 선적한 후 열거형에 값을 추가해야 한다는 것을 발견하는 것은 매우 일반적입니다. 새로 추가된 값이 기존 API에서 반환될 때 애플리케이션 호환성 문제가 발생할 수 있습니다. 잘못 작성된 애플리케이션이 새 값을 올바르게 처리하지 못할 수 있기 때문입니다.

✔️ 작은 호환성 위험에도 불구하고 열거형에 값을 추가하는 것이 좋습니다.

열거형 추가로 인한 애플리케이션 비호환에 대한 실제 데이터가 있는 경우 새 값과 이전 값을 반환하는 새 API를 추가하고 이전 API를 더 이상 사용하지 않는 것이 좋습니다. 이 API는 이전 값만 계속 반환해야 합니다. 이렇게 하면 기존 애플리케이션이 계속 호환됩니다.

Portions © 2005, 2009 Microsoft Corporation. All rights reserved.

Pearson Education, Inc의 동의로 재인쇄. 출처: Framework Design Guidelines: Conventions, Idioms, and Patterns for Reusable .NET Libraries, 2nd Edition 작성자: Krzysztof Cwalina 및 Brad Abrams, 출판 정보: Oct 22, 2008 by Addison-Wesley Professional as part of the Microsoft Windows Development Series.

참고 항목