2012-12-17 3 views
6

이 논의는 디폴트 값의 이름에 관한 것입니다 : C#: Should the default value of an enum be None or Unknown?C++ 기본 열거 값을 사용

그러나, 나는 유해한, 불필요하고 잠재적으로 나쁜 관행으로 이어지는 최근 간주 기본 열거 값으로 말한 사람들의 많은 양의.

는 예를 들어 고려으로 다음과 같은 : 그것은 JOB_STATE_UNKNOWN, 말에있을 일에 대해 이해가되지 것입니다,하지만 당신이 상상할 수있는

enum eJobStates 
{ 
    JOB_STATE_INITIALISING, 
    JOB_STATE_PROCESSING, 
    JOB_STATE_DONE 
}; 

의 모니터링에 사용하고있는 모든 구조 작업이 수 말했다 그러한 가치를 사용하십시오.

열거 형을 정의 할 때 기본값을 만드는 것과 관련된 모범 사례/규칙이 있습니까? 가능한 경우 언제든지 회피해야합니까?

+0

모니터링 클래스에서 MONITORING_STATE 값을 추가하여 열거 형을 '확장'할 수 있습니까? – dchhetri

+0

제안을 완전히 이해하지 못할 수도 있습니다. 이 특정 예제에서 MONITORING_STATE는 여전히 작업 관점에서 이해가되지 않으며 [link] (http://stackoverflow.com/questions/1804840/extending-enums-in-c)에 따라 열거 형을 확장 할 수 없습니다. 모니터링 클래스 (이상적으로 eJobStates를 개인 변수로 사용). – ellimilial

+1

예 자연스럽게 열거 형을 확장 할 수 없다는 것을 알고 있습니다. monitoring_state는 단지 이름이지만 job_state_unknown을 확실히 사용할 수 있습니다. 내가 제안한 것은 모니터링 클래스에 enum을 추가하는 것이 었습니다. eJobStates의 마지막 열거 형 값을 취하여 1을 더하고 모니터링 클래스의 시작 열거 형 상태 값으로 만들면됩니다. 결국 열거 형을 사용하면 상태를 나타내는 int를 단순히 비교하는 것입니다. 보다 구체적인 것을 원한다면, 링크에서 제안한대로 Enum 클래스를 만들거나 각 상태에 대한 상태 객체를 만들 수 있습니다. – dchhetri

답변

2

잘못된 기본값은 기본적으로 디자인에서 변형입니다. 오브젝트는 작성시 유효하지 않습니다. 이 합당한 경우 일 때 피해야합니다. "모든 비용을 지불하면"피할 수는 없습니다.

일부 문제는 변형 된 상태에서 시작해야합니다. 이 경우 이있어 그 잘못된 값을 정신적으로 추론 할 수 있습니다. 이름을 지정하지 않으면 코드의 표현력이 저하됩니다. 나중에 코드를 유지 관리해야하는 사람과 의사 소통의 관점에서 생각하십시오.

바람 불어 오는 쪽 처리는 성가신 일입니다. 변형 된 상태에서 시작하지만, 관련성이있는 시점까지는 더 이상 변형되지 않기를 바랍니다. 내가 선호하는 전략은 사용자가 변형 된 상태를 무시하고 실수했을 때 던져 버리는 것을 허용하는 것입니다.

namespace FooType { 
    enum EnumValue { 
    INVALID = 0 
    ,valid 
    }; 
} 

struct Foo { 
    Foo() : val(FooType::INVALID) {} 
    FooType::EnumValue get() const { 
    if (val == FooType::INVALID) 
     throw std::logic_error("variant Foo state"); 
    return val; 
    } 
    FooType::EnumValue val; 
}; 

이것은을 위해 싸우는 가치가 귀하의 분산, 추론 할 필요가 사용자를 해제합니다.

도망 갈 수 없다면, 나는 안전하고 안전하지 않은 인터페이스로 저하되는 것을 선호합니다.

struct Foo { 
    Foo() : val(FooType::INVALID) {} 
    bool get(FooType::EnumValue& val_) const { 
    if (val == FooType::INVALID) 
     return false; 
    val_ = val; 
    return true; 
    } 
    FooType::EnumValue get() const { 
    FooType::EnumValue val_; 
    if (!get(val_)) 
     throw std::logic_error("variant Foo state"); 
    return val_; 
    } 
    FooType::EnumValue get_or_default(FooType::EnumValue def) const { 
    FooType::EnumValue val_; 
    if (!get(val_)) 
     return def; 
    return val_; 
    } 
    FooType::EnumValue val; 
}; 

이러한 종류의 인터페이스는 null 값이 예상되는 데이터베이스와 같은 것에 적합합니다.

+0

"나중에 코드를 유지해야하는 사람과 그 사람과의 의사 소통 측면에서 생각해보십시오."+1을 위해 나머지 모든 것 위에! – xtofl