잘못된 기본값은 기본적으로 디자인에서 변형입니다. 오브젝트는 작성시 유효하지 않습니다. 이 합당한 경우 일 때 피해야합니다. "모든 비용을 지불하면"피할 수는 없습니다.
일부 문제는 변형 된 상태에서 시작해야합니다. 이 경우 에이있어 그 잘못된 값을 정신적으로 추론 할 수 있습니다. 이름을 지정하지 않으면 코드의 표현력이 저하됩니다. 나중에 코드를 유지 관리해야하는 사람과 의사 소통의 관점에서 생각하십시오.
바람 불어 오는 쪽 처리는 성가신 일입니다. 변형 된 상태에서 시작하지만, 관련성이있는 시점까지는 더 이상 변형되지 않기를 바랍니다. 내가 선호하는 전략은 사용자가 변형 된 상태를 무시하고 실수했을 때 던져 버리는 것을 허용하는 것입니다.
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 값이 예상되는 데이터베이스와 같은 것에 적합합니다.
모니터링 클래스에서 MONITORING_STATE 값을 추가하여 열거 형을 '확장'할 수 있습니까? – dchhetri
제안을 완전히 이해하지 못할 수도 있습니다. 이 특정 예제에서 MONITORING_STATE는 여전히 작업 관점에서 이해가되지 않으며 [link] (http://stackoverflow.com/questions/1804840/extending-enums-in-c)에 따라 열거 형을 확장 할 수 없습니다. 모니터링 클래스 (이상적으로 eJobStates를 개인 변수로 사용). – ellimilial
예 자연스럽게 열거 형을 확장 할 수 없다는 것을 알고 있습니다. monitoring_state는 단지 이름이지만 job_state_unknown을 확실히 사용할 수 있습니다. 내가 제안한 것은 모니터링 클래스에 enum을 추가하는 것이 었습니다. eJobStates의 마지막 열거 형 값을 취하여 1을 더하고 모니터링 클래스의 시작 열거 형 상태 값으로 만들면됩니다. 결국 열거 형을 사용하면 상태를 나타내는 int를 단순히 비교하는 것입니다. 보다 구체적인 것을 원한다면, 링크에서 제안한대로 Enum 클래스를 만들거나 각 상태에 대한 상태 객체를 만들 수 있습니다. – dchhetri