Pokażę Ci w tym materiale ważny typ danych jaki w programowaniu określa się typem wyliczeniowym, w skrócie "enum" 🔥. Wyjaśnię co to za typ danych, czym się charakteryzuje i w jakich celach się go stosuje, aby kod źródłowy był jeszcze lepszy! Zapraszam 😊!
OTO DLACZEGO WARTO STOSOWAĆ "ENUM" W PROGRAMOWANIU!
Najpierw definicja, potem przedstawienie w kodzie źródłowym.
Czym jest "enum" w programowaniu?
"enum" (skrót od "enumeration"), to inaczej wyliczeniowy typ danych. To taka struktura, która dysponuje zestawem określonych stałych zawierających nazwy. Natomiast w danej chwili może być wybrana tylko jedna z możliwości. Jest bardzo przydatna w sytuacjach dodawania abstrakcyjnego identyfikatora zbiorom danych (trochę jak w bazach danych) oraz programowaniu zmiennych, które powinny przyjmować niestandardową wartość tylko z podanego zbioru.
Dla przykładu, definiując produkty spożywcze w sklepie, mógłbyś/mogłabyś chcieć określić ich rodzaj pochodzenia: roślinny, pszenny, mięsny itd. Wtedy używając własnego typu wyliczeniowego, przypisujesz wszystkim produktom odpowiednią kategorię 👍. Każdy z nich może przyjąć tylko jedną spośród kilku kategorii, natomiast wiele produktów może należeć do jednej kategorii (jak w relacji "jeden do wielu" 😉).
Dużym plusem jest łatwe użycie - po prostu tworzysz nowy typ wyliczeniowy, przypisujesz mu nazwę, a w środku niego określasz stałe oraz ich nazwy. Później chcąc z niego skorzystać, tworzysz zmienną i przypisujesz jedną z wartości pochodzących wyłącznie od tego typu danych. I to wszystko ✔️.
Przejdźmy teraz do zagadnienia jak się tworzy typ wyliczeniowy w kodzie!
Jak utworzyć "enum" w programowaniu?
Jeżeli chodzi o konstrukcję typu wyliczeniowego, to to zależy od języka programowania. Większość posiada ogólnie przyjętą jedną formę zapisu, natomiast część nie posiada możliwości tworzenia typów "enum" i trzeba sobie radzić inaczej 😳. Dlatego pokażę 2 zapisy: ten najczęściej spotykany (nazwijmy go "oficjalnym") oraz alternatywny (przyjmujący strukturę zbliżoną do "enum").
Jak utworzyć "enum" w języku programowania, który to umożliwia?
Zapis może się mniej lub bardziej różnić od pierwotnego zapoczątkowanego w języku C, natomiast w zdecydowanej większości języków wysokiego poziomu, postać jest następująca 👇:
enum MyEnum
{
ConstantA,
ConstantB,
ConstantC
};Tłumaczę o co chodzi.
Zaczynamy od słowa kluczowego "enum", choć często przed nim dodajemy jeszcze modyfikator dostępu (powtarzam, cała konstrukcja zależy od języka ⚠️). Następnie podajemy nazwę typu wyliczeniowego, która najlepiej aby określała gatunek/rodzaj/kategorię np. płeć człowieka.
Po nadaniu nazwy otwieramy klamerki i wewnątrz nich umieszczamy nazwy stałych wymieniając je po przecinku, z wyjątkiem ostatniej pozycji. I tu najlepszą nazwą będzie abstrakcyjne określenie jednego z tych "gatunków", czyli w przypadku płci będzie pasować "Male" i "Female" 🙂.
To wystarczy, aby poprawnie zdefiniować własny typ wyliczeniowy ✅. Warto jednak pamiętać, że dany język programowania może wspierać dodatkowe możliwości związane z typem wyliczeniowym ⭐. Na przykład w Javie można utworzyć całą klasę wyliczeniową (o tym jest osobny materiał ℹ️), a język C# posiada atrybut "Flags" jaki można nałożyć na "enum", który oznaczać będzie interpretowanie każdej stałej jak jednego bitu, czyli N-tej potęgi liczby 2, co pozwala na tworzenie kombinacji różnych wartości w postaci sum bitów 💡.
Ponieważ jest to materiał dotyczący ogólnych wątków programowania (niezwiązanych z żadnym językiem), to nie jest miejsce na opisywanie każdego istniejącego dodatku i najlepiej abyś zapoznał(a) się z artykułem na temat typów wyliczeniowych dotyczących konkretnego języka programowania 👍.
Przejdźmy teraz do przypadku, w którym język w jakim piszesz kod nie posiada typu "enum" jako takiego.
Jak utworzyć "enum" w języku programowania, który nie posiada takiej możliwości?
"enum" to w rzeczywistości obiekt posiadający w sobie wiele stałych o przypisanej wartości, zatem jeżeli potrzebujesz zdefiniować sobie strukturę przypominającą typ wyliczeniowy, spróbuj utworzyć sobie obiekt takiej postaci 👇:
MyEnum =
{
ConstantA = [wartość],
ConstantB = [wartość],
ConstantC = [wartość]
}Jeżeli język pozwala na tworzenie takich struktur, to w zupełności wystarczy aby uzyskać dokładnie taki sam efekt jak przy prawdziwym typie "enum" 😄. Wartość niekoniecznie musi być całkowitoliczbowa. Może to być każdy inny prosty typ danych i w ten sposób możesz sprytnie połączyć działanie typu wyliczeniowego z przypisywaniem stałych zmiennym ❤️.
Tworzenie mamy wyjaśnione ✔️. Teraz jak się z tego korzysta 🚀!
Jak skorzystać z "enum" w programowaniu?
Nieważne czy język programowania wspiera typ wyliczeniowy, czy nie - korzystamy z tego w identyczny sposób 👍. Tworzymy sobie zmienną tego typu danych (jeśli język jest silnej typizacji) i przypisujemy jedną ze stałych pochodzących od tego typu. To przypisanie różni się od pozostałych typów danych bowiem podajemy najpierw nazwę samego typu wyliczeniowego, potem wstawiamy kropkę, a potem dopiero wpisujemy nazwę stałej 🔥!
To jest przykład 👇:
MyEnum myEnumVariable = MyEnum.ConstantA;Tak jak pisałem, szczegóły składni już zależą od języka, lecz taka jest ogólna forma. Mając taką zmienną, możemy w każdej chwili przypisać inną stałą pochodzącą wciąż od tego samego zbioru, korzystając z tego samego przypisania 👇:
myEnumVariable = MyEnum.ConstantB;Pamiętaj - typ wyliczeniowy działa na zasadzie wyboru jednej z wielu możliwości. Poza tym, jest to typ jak każdy inny i można go umieszczać w różnych miejscach w kodzie jako składowa klasy, parametr funkcji czy do typów generycznych ❤️. Jest to bardzo uniwersalna i prosta w użyciu konstrukcja! "enum" pasuje rewelacyjnie do instrukcji wielokrotnego wyboru "switch", w której tworzymy jeden blok do sprawdzania wielu konkretnych wartości (operator porównania) jakie może przyjąć dana zmienna i tego też polecam się nauczyć!
Przechodzimy do prostego przykładu użycia typu wyliczeniowego w praktyce i to będzie wszystko 😉!
Przykład użycia "enum" w programowaniu
Pokażę przykład zdefiniowania i użycia typu wyliczeniowego do oceny parzystości liczby całkowitej, której program będzie oczekiwał podania przez użytkownika za pomocą klawiatury ⏏️. Użyję języka C i to da się w nim zrobić w następujący sposób 👇:
#include <stdio.h>
int main(void)
{
typedef enum
{
Odd,
Even
} ParityType;
int typedNumber;
printf("Podaj dowolny numer: ");
if(scanf("%d", &typedNumber) == 1)
{
ParityType parityType = typedNumber % 2 == 0 ? Odd : Even;
switch (parityType)
{
case Odd:
printf("Liczba jest parzysta\n");
break;
case Even:
printf("Liczba jest nieparzysta\n");
break;
}
}
else
{
printf("Nieodpowiedni znak\n");
}
return 0;
}Wyjaśniam poszczególne fragmenty wewnątrz funkcji "main" 🔍!
Na początek tworzymy sobie typ wyliczeniowy dla dwóch rodzajów parzystości liczby, czyli "parzysta" i "nieparzysta". W języku C dobrze jest połączyć konstrukcję "enum" ze słowem "typedef", ponieważ to zdecydowanie ułatwia korzystanie z tego typu danych w późniejszym etapie i w osobnym artykule wyjaśniłem dokładnie ten temat 😄.
W kolejnym kroku deklarujemy zmienną do przechowywania liczby całkowitej jaka zostanie podana przez użytkownika (deklarujemy, więc nie przypisujemy ✋). Dalej wypisujemy komunikat z informacją o podaniu dowolnej liczby z użyciem funkcji "printf" (napisałem "numer", aby uniknąć podawania polskich znaków, które w języku C nie są wspierane same z siebie ❌).
W dalszej części sięgamy po instrukcję warunkową i wewnątrz niej umieszczamy wywołanie funkcji "scanf", za pomocą której możemy wpłynąć na wartość zmiennej poprzez wprowadzenie liczby z klawiatury. Robimy w ten sposób, ponieważ "scanf" zwraca wartość określającą liczbę poprawnie wprowadzonych wartości 💡. W tym przypadku mamy jedną, więc badamy czy wartość będzie równa 1 🙂.
Jeżeli okaże się, że nie dojdzie do prawidłowego podania akurat liczby całkowitej (tylko na przykład wpiszemy literkę), to wynikiem wywołania funkcji "scanf" będzie 0 (zero) i wtedy program przejdzie do bloku "else" wypisując informację o źle podanej liczbie 🚫. W przeciwnym razie, wykona się blok obejmujący największą część przykładu.
Zaczyna się od zdefiniowania sobie zmiennej typu wyliczeniowego i określenia jaką wartość powinna przyjmować. W zależności od parzystości podanej liczby (wnioskowanej poprzez sprawdzenie czy reszta z dzielenia przez 2 wynosi zero 💡), wartość tej zmiennej będzie równa stałej "Odd" (parzysta) bądź "Even" (nieparzysta). Do przypisywania jednej z dwóch możliwości w jednym wierszu stosuję operator trójargumentowy (warunkowy), który opisałem w innym artykule.
Po ustaleniu stałej typu wyliczeniowego, program przechodzi do instrukcji "switch" (również wytłumaczonej w odrębnym materiale), która ma za zadanie sprawdzić jaką wartość typu wyliczeniowego przyjmuje wskazana zmienna i na jej podstawie wykonać odpowiedni blok instrukcji.
Jeżeli wartość jest równa "parzysta", to zostanie wypisany komunikat ponownie z użyciem funkcji "printf", że podana liczba jest parzysta 😊. Z kolei, gdy zmienna przyjmuje wartość "nieparzysta", to w taki sam sposób wypisujemy komunikat o tym, że podano liczbę nieparzystą 😁. To jest koniec programu ☑️.
![]() |
"enum" w programowaniu oznacza typ wyliczeniowy, czyli typ danych składający się ze zbioru stałych z określonymi nazwami pisanymi abstrakcyjnym językiem.
To wszystko w temacie typów wyliczeniowych. Uwierz mi, że warto opanować ich stosowanie i mogą nieraz uprzyjemnić wiele sytuacji podczas programowania 💙.
