Nieprawidłowa wartość domyślna jest w zasadzie wariantem w projekcie. Obiekt nie jest ważny, gdy jest tworzony. Powinieneś tego unikać, gdy jest to uzasadnione uzasadnione. W żadnym wypadku nie należy tego unikać "za wszelką cenę".
Niektóre problemy wymagają uruchomienia w innym stanie. W takim przypadku użytkownik ma, aby uzasadnić tę niepoprawną wartość mentalnie. Jeśli unikniesz nazywania go, aktywnie sprawisz, że Twój kod będzie mniej wyrazisty. Pomyśl o tym w kategoriach komunikacji między Tobą a osobą, która będzie musiała zachować kod później.
Radzenie sobie z wiatrem jest denerwujące. Zaczynasz w stanie wariantowym, ale do czasu, gdy jest to istotne, masz nadzieję, że nie jest to już wariant. Strategia, którą preferuję, pozwala użytkownikom ignorować stan wariantu i po prostu rzucać, gdy popełniłem błąd.
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;
};
To uwalnia użytkowników od konieczności rozumować o swojej sprzeczności, które warto walczyć.
Jeśli nie można uciec z tym, że zazwyczaj wolą degradować do bezpiecznych i niebezpiecznych interfejsów.
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;
};
Tego rodzaju interfejsy są przydatne w takich bazach danych, w których można oczekiwać wartości pustych.
Czy możesz mieć swoją klasę monitorowania "rozszerzania" wyliczenia przez dodanie wartości MONITORING_STATE? – dchhetri
Może nie rozumiem w pełni sugestii. W tym konkretnym przykładzie MONITORING_STATE nadal nie miałoby sensu z perspektywy pracy i, jak na [link] (http://stackoverflow.com/questions/1804840/extending-enums-in-c), nie mogę rozszerzyć wyliczenia w klasa monitorowania (która najlepiej używa eJobStates jako zmiennej prywatnej). – ellimilial
Tak, zdaję sobie sprawę, że nie można naturalnie przedłużać wyliczenia. Parametr monitoring_state był po prostu nazwą, ale można zdecydowanie użyć parametru job_state_unknown. Proponowałem dodanie dodatkowego wyliczenia w klasie monitorowania. Możesz to zrobić, biorąc ostatnią wartość wyliczenia eJobStates i dodając do niej 1, i ustaw ją jako początkową wartość stanu wyliczeniowego dla klasy monitorowania. W końcu, po przeliczeniu, po prostu porównujesz ints reprezentujące stany. Jeśli chcesz czegoś bardziej konkretnego, to zgodnie z sugestią w łączu możesz utworzyć klasę Enum lub utworzyć obiekt stanu dla każdego stanu. – dchhetri