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 jako typ wyliczeniowy

"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 💙.

PODOBNE ARTYKUŁY