enum을 정의합니다. struct {enum Type {};

5022 단어 struct
본고는SolidmCP에서 더 읽을 수 있는 enum을 어떻게 정의하는지 토론할 뿐이고Clean Code와Readable Code의 부작용을 공략하는 셈이다.
 -- Piaoger
>>enum을 정의하는 몇 가지 방법
사실 이 몇 가지 형식의 주요 차이점은 다음과 같다.
enum의 정의를 끼워 넣은 enum Type에 넣을지 여부;
enum Type이 struct에 중첩되어 있는지 아니면 namespace 안에 중첩되어 있는지 여부
1. 네스트되지 않음
enum DateTimeKind
{
kUnspecified = 0,
kLocalTime = 1,
kUtcTime = 2
};

inline bool isUtc(DateTimeKind kind)
{
return kind == kUtcTime;
}

2.namespace 내에 enum Type 중첩
namespace DateTimeKind
{
enum Type
{
kUnspecified = 0,
kLocalTime = 1,
kUtcTime = 2
};
}

inline bool isUtc(DateTimeKind::Type kind)
{
return kind == DateTimeKind::kUtcTime;
}

3. enum Type은 struct에 중첩
struct DateTimeKind
{
enum Type
{
kUnspecified = 0,
kLocalTime = 1,
kUtcTime = 2
};
}

inline bool isUtc(DateTimeKind::Type kind)
{
return kind == DateTimeKind::kUtcTime;
}

4. 클래스의 enum Type이 struct에 중첩됨
클래스에 namespace가 있을 수 없기 때문에 enum Type은 struct에만 넣을 수 있습니다
class DateTime
{
public:
struct Kind
{
enum Type
{
kUnspecified = 0,
kLocalTime = 1,
kUtcTime = 2
};
};

private:
// Data Members
};

inline bool isUtc(DateTime::Kind::Type kind)
{
return kind == DateTime::Kind::kUtcTime;
}

5. 클래스 중첩 없음enum
class DateTime
{
public:
enum Kind
{
kUnspecified = 0,
kLocalTime = 1,
kUtcTime = 2
};
};

inline bool isUtc(DateTime::Kind kind)
{
return kind == DateTime::kUtcTime;
}

 
>> 중첩 Or 중첩 안함?
상대적으로 Piaoger는 끼워 넣는 형식을 좋아해서 이름 충돌의 기회를 줄이고 읽을 수 있다.
가독성으로 말하자면DateTime::Kind::kUtcTime은DateTime::kUtcTime보다 틀림없이 클 것이다. 우리는 kUtcTime가Time이TimeKind라는 것을 잘 알 수 있다.
이름 충돌을 줄일 때 한 종류 중 여러 개의 enum에 kUnknown을 추가하고 싶을 때 문제를 발견할 수 있습니다. 보통 아래에 접미사를 붙여서 차이점을 표시할 수 밖에 없습니다.
class ClassName
{
public:
enum EnumXX
{
kUnknownXX = 0,
kValue1XX = 1,
kValue2XX = 2
};

enum EnumYY
{
kUnknownYY = 0,
kValue1YY = 1,
kValue2YY = 2
};
};

>> struct Or namespace
namespace의 약점은 계승할 수 없고,class와struct에 사용할 수 없다는 것이다.struct 형식은 일부 어리석은 컴파일러가 struct에서 기본 구조 함수와 같은 코드를 몰래 생성할 수도 있다.
이런 멍청한 컴파일러가 드물고namespace의 형식이 통일되기 어렵다는 것을 감안하여 Piaoger는 결국 struct {enum Type {};이런 형식, 즉 위에서 언급한 세 번째와 네 번째 형식.
● 자주 사용하는 enum을class 이외에 정의하기
이렇게 하면 필요없는include도 피할 수 있다.
Qt는 qnamespace에 있습니다.h에서 대량의 상용enum을 정의했다.(...\src\corelib\global\qnamespace.h)
나는 모든 모듈에 XXXTypes를 추가하는 것을 비교적 좋아한다.h, 관련 enum 정의와class 전방향 성명과 모두 이 파일에 넣으세요.

좋은 웹페이지 즐겨찾기