[C/C++] Pytanie o typy wyliczeniowe


(Quatre050) #1

Witam!

Po moim ostatnio założonym temacie uzyskałem fachową(za którą dziękuję) odpowiedź więc myślę, że to miejsce będzie dobre na zadanie kolejnego pytania. Czy jak używam typów wyliczeniowych w swoich programach zyskuje cokolwiek poza czytelnością kodu? Czy istnieje jakakolwiek przewaga tego

switch(figura)

{

case TROJKAT:

break;

case KWADRAT:

break;

default:

break;

}

nad tym

switch(figura)

{

case 1:

break;

case 2:

break;

default:

break;

}

Oczywiście to tylko taki oderwany od rzeczywistości przkładzik.


(Pablo_Wawa) #2

Czytelność i mniejsza podatność na błędy to najważniejsze sprawy. Podałeś krótki i prosty przykład - ale pomyśl, jakby to było z 20 elementami? W językach nie mających takich możliwości trzeba sobie jakoś radzić (ważne są komentarze), ale jeśli masz możliwość pisania czytelniej , to czemu nie?

Weź pod uwagę to, że często po latach inny programista zagląda do danego kodu i musi coś w niem zmienić/poprawić. Dzięki stałym i typom wyliczeniowym ma ułatwione zadanie. Nie wspominając już o zbiorowym tworzeniu kodu.


([alex]) #3

Częściowo już Pablo_Wawa odpowiedział na pytanie, tylko nie wskazał konkretnie w czym jest przewaga oprócz czytelności.

Wyobraź sobie że rok po napisaniu kodu obsługującego kolo i kwadrat musisz dodać jeszcze romb, więc jeżeli użyłeś 1 i 2 to musisz prześledzić cały kod aby sprawdzić czy przypadkiem rok temu oprócz kwadrata i trójkąta nie dodałeś obsługę np kola i/lub trapezu, potem w zależności od wyniku przydzielić dla rombu kolejną liczbę.

A przypadku enum zwyczajnie dodajesz kolejną wartość ROMB i w odpowiednich miejscach obsługę tego przypadku. Czyli ułatwiasz rozwój kodu.


(linux_to_syf_^^) #4

Rozważ też użycie enum class, zamiast enum. Wtedy odpada niejawna konwersja do int. Inaczej możesz skończyć z kodem

switch(figura)

{

case TROJKAT:

break;

case JABLKO:

break;

default:

break;

}

Który będzie kompilowalny.