2012-12-17 20 views
6

Ta dyskusja jest o nazwie Wartość domyślna: C#: Should the default value of an enum be None or Unknown?Wykorzystanie Domyślna wartość enum C++

Jednak duża ilość ludzi, z którymi rozmawiałem z niedawno uznawanych wartości domyślne enum szkodliwe, niepotrzebne i potencjalnie prowadzące do złych praktyk.

Jako przykład należy rozważyć następujące kwestie:

enum eJobStates 
{ 
    JOB_STATE_INITIALISING, 
    JOB_STATE_PROCESSING, 
    JOB_STATE_DONE 
}; 

To nie miałoby sensu pracy, aby być w powiedzmy JOB_STATE_UNKNOWN, ale można sobie wyobrazić, że każda struktura, które mogą być wykorzystane do monitorowania powiedział Jobs mógł użyj takiej wartości.

Czy są jakieś najlepsze praktyki/reguły kciuka dotyczące tworzenia wartości domyślnej podczas definiowania enum? Czy należy ich unikać za wszelką cenę, kiedy tylko jest to możliwe?

+0

Czy możesz mieć swoją klasę monitorowania "rozszerzania" wyliczenia przez dodanie wartości MONITORING_STATE? – dchhetri

+0

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

+1

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

Odpowiedz

2

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.

+0

"Pomyśl o tym, jeśli chodzi o komunikację między tobą a osobą, która będzie musiała zachować kod później" +1 za to, a na dodatek całą resztę! – xtofl