W mojej pracy rozmawialiśmy o wykorzystaniu wyliczeń w Javie.
Współpracownik twierdził, że używając wyliczeń po stronie serwera, ilekroć jest to wymagane, powinniśmy używać ciągu znaków, aby się do niego odwoływać (na przykład podczas wysyłania danych z JS do serwera lub podczas przechowywania w bazie danych), argumentując, że jest to o wiele bardziej przejrzyste dla programisty, a także argumentuje, że szybko się nie powiedzie w przypadku literówek.
W tych przypadkach zawsze używałem liczb całkowitych do identyfikowania wyliczeń, ponieważ byłyby to niezmienne identyfikatory i nie miałyby problemów z literami i literówką (nawet jeśli programista popełnił błąd przy użyciu wartości 2 zamiast 1, nie zawiodłoby to szybko).
Będąc bardzo analitycznym w stosunku do tych argumentów, powiedziałbym, że użycie ciągów jest lepsze, ale mam dziwne przeczucie (jakby to nie było dobre podejście).
Czy są jakieś najlepsze praktyki dotyczące tej dyskusji, które mogłyby mnie poprowadzić?
Edycja: Gdy tylko jest to możliwe, używamy samego wyliczenia, więc cały nasz kod Java korzysta z wyliczenia. Przez „odniesienie do wyliczenia” mam na myśli: odwołanie się do wartości w wyliczeniu podczas wymiany danych z JavaScript na serwer lub przechowywania danych w bazie danych
źródło
Odpowiedzi:
Dobre pytanie. Wykorzystanie wyliczenia w Javie jest przeznaczone przede wszystkim do obsługi informacji o charakterze nieco kategorycznym. Klasycznym przykładem jest użycie enum do obsługi czterech rodzajów kolorów, które może mieć karta. Zapewnia przewagę wydajności przy użyciu liczb całkowitych i jest to również widoczne w twoim programie.
Więc poza Javą, dlaczego nie miałbyś nadal używać liczby całkowitej? Być może nie masz typów wyliczania poza Javą, ale to nie znaczy, że nie możesz dalej używać liczb całkowitych do celów wydajnościowych, prawda? Tak, to całkowicie prawda, ale zastanów się, co się stanie, gdy dodasz nową wartość wyliczenia. Jeśli nie dodasz go do końca, wszystkie pozostałe wartości wyliczenia po nowej wartości zostaną zwiększone o jeden. Cóż, po prostu określimy liczbę, aby nie mogła się zmienić lub zawsze dodamy ją na końcu. Czy jesteś pewien, że twoi koledzy z pracy zawsze zrobią to dobrze? Meh Prawdopodobnie? Ufnie? Może nie jesteś w 100% na tym. Pamiętaj o tym przez chwilę.
Twój szef informuje cię, że po ostatniej aktualizacji u klienta występuje bałagan przy użyciu oprogramowania. Teraz wszystkie byty X zachowują się tak, jakby im przypisano wartość wyliczenia Y, nawet jeśli naprawdę zostały im przypisane Z. Sprawdzasz repozytorium i tak, ktoś dodał nową wartość wyliczenia i nie postępował zgodnie z twoimi wytycznymi, o co prosiłeś. Masz teraz dodatkową komplikację, że w bazie danych jest napisane 4, kiedy tak naprawdę powinno być 3, z wyłączeniem rekordów, które zostały wstawione przed aktualizacją, które tak naprawdę są 4. Jaka wartość wyliczenia i tak dotyczy 4? Czy to nie Y? Nie pamiętasz Musisz sprawdzić program, aby zweryfikować. Mówiąc najprościej, to bałagan.
Jeśli zamiast tego twoja baza danych napisała „HEARTS”, „DIAMONDS”, „SPADES”, „CLUBS”, niewiele straciłeś pod względem miejsca i tyle zyskałeś. To prawda, że mówimy o niewielkim spadku wydajności, ale tak naprawdę nie powinieneś uzyskiwać dostępu do bazy danych, aby często coś zmienić. Jeśli chodzi o miejsce, pozostaw to administratorom systemów (nie twoim problemom.).
Jeśli stworzyłeś prosty program, który można łatwo wprowadzić, na dłuższą metę zrobiłeś sobie przysługę, zaufaj mi. Ten aspekt nie różni się moim skromnym zdaniem.
źródło
HEARTS
naHeart
lub coś w twoim przykładzie) i nagle wszystko znowu się psuje.Zgadzam się z odpowiedzią Neila, ale tylko dodatkiem:
W Javie wyliczenia są obiektami, więc mogą mieć pola i metody. Możesz więc nadać każdemu wyliczeniu jakąś ręcznie określoną wartość, a odwołując się do niego do pracy na zewnątrz, użyj tej wartości.
Przetrwa zarówno dodawanie / usuwanie / zmianę kolejności, jak i zmianę nazwy wystąpienia enum. Ale będziesz musiał napisać logikę serializacji / deserializacji dla pól wyliczeniowych zamiast używać automagic dostępnego w wielu narzędziach. (To łatwe, ale dodatkowa praca).
I musisz ręcznie zachować te wartości unikalne (ale to samo w wyliczeniach w stylu C), i możesz napisać test, aby to sprawdzić.
źródło