Podczas pisania aplikacji zdarzają nam się obiekty, które mają jakiś swój specyficzny rodzaj. Część z tych problemów można rozwiązać poprzez dziedziczenie, ale w wielu przypadkach będzie to przerost formy nad treścią, a samo zapisanie później danych do bazy będzie rodziło wiele problemów i obciążeń. Z pomocą w tym przypadku przychodzi nam typ wyliczeniowy.
Załóżmy, że tworzymy aplikację do zarządzania naszą biblioteczką. Każda książka ma swoje umiejscowienie (półka, szafa, biurko, inne) i informację o statusie jej posiadania (chcę mieć, zamówiona, posiadana, pożyczona). Można to zrobić na kilka sposobów:
Sposób 1:
Utworzenie zmiennych typu string:
public string Status { get; set; } public string Umiejscowienie { get; set; }
I teraz ustawienie statusu:
ksiazka.Status = "Półka";
Zawsze problemem jest string, bo bardzo łatwo o literówki. Jeśli ktoś dostanie nasz kod i będzie chciał coś dopisać, to może potraktować nasz status fizyczny egzemplarza i wpisać, że książka jest uszkodzona. Z kolei baza danych musi przechowywać sporo informacji. Problem ten można rozwiązać w inny sposób.
Sposób 2:
Przechowywanie statusów jako liczby:
public int Status { get; set; } public int Umiejscowienie { get; set; }
I teraz ustawienie statusu:
ksiazka.Status = 3;
Ok, problem literówek mamy już rozwiązany, a baza danych przechowuje małe liczby całkowite, więc też jest to dobre rozwiązanie. Tylko co oznacza to 3? W chwili pisania kodu ustalę sobie, że 3 to książka posiadana. Za tydzień będę o tym pamiętał? A za pół roku? Jak wstawię komentarz to czy będę o nim pamiętał, chciało mi się szukać lub nie usunę go przypadkiem/nie dokonam edycji?
Sposób 3:
Z pomocą przychodzi nam typ wyliczeniowy. Po pierwsze deklarujemy go. W tym celu tworzymy nowy plik .cs i podobnie jak tworząc klasę wpisujemy:
public enum StatusPosiadania { ChceMiec, Zamowiona, Posiadana, Pozyczona } public enum UmiejscowienieKsiazki { Polka, Szafa, Biurko, Inne }
Teraz w klasie Ksiazka typem statusów będzie odpowiedni typ utworzony powyżej:
public StatusPosiadania Status { get; set; } public UmiejscowienieKsiazki Umiejscowienie { get; set; }
Teraz ustawimy status i umiejscowienie:
ksiazka.Status = StatusPosiadania.Posiadana; ksiazka.Umiejscowienie = UmiejscowienieKsiazki.Biurko;
Teraz jest czytelnie i nie potrzebujemy żadnych komentarzy. Jeśli sąsiad za pół roku, a my za rok będziemy coś dopisywać, to nie ustawimy innego statusu niż jeden z wymienionych. Kolejną zaletą typu wyliczeniowego jest możliwość rzutowania na liczbę całkowitą.
Zapis i odczyt danych z/do bazy zrealizujemy poprzez rzutowanie na int i z powrotem:
int status = (int)ksiazka.Status; ksiazka.Status = (StatusPosiadania)status;
Z automatu mamy załatwioną optymalizację przechowywanych danych, bo zapisujemy tylko proste integery. W banalny sposób można też odczytać dane i wrzucić je do obiektu.
Można też ustawić konkretną liczbę, która będzie reprezentować dany typ:
public enum UmiejscowienieKsiazki { Polka, Szafa, Biurko = 5, Inne }
W tym przypadku biurko zostanie zamienione na liczbę 5, a inne na kolejną, czyli 6. Zawsze domyślną wartością pierwszego elementu jest 0, dlatego półka to 0, a szafka jest reprezentowana przez 1.
Polecam korzystanie z tego rozwiązania, bo naprawdę sporo ułatwia i upraszcza nasz kod. Sam miałem problemy ze zrozumieniem tego na początku, ale jak doczytałem dokumentację, wszystko stało się jasne i teraz każda moja aplikacja posiada sporo enumów 🙂
Najnowsze komentarze