Czy lepiej używać ciągów znaków lub int do odwoływania się do wyliczeń poza częścią java systemu?

11

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

JSBach
źródło
1
Co jest dla ciebie „odniesieniem do wyliczenia”? Normalne użycie w kodzie źródłowym? Serializacja do przechowywania w bazie danych? Wyrażenie do wykorzystania w dokumentacji użytkownika? Wyrażenie do zastosowania w dokumentacji technicznej? Odpowiedź będzie zupełnie inna dla wszystkich.
Kilian Foth,
Zredagowałem pytanie i mam nadzieję, że jest teraz jaśniejsze: przez „odniesienie do wyliczenia” mam na myśli odniesienie do wartości podczas wymiany danych z JavaScript na serwer lub na odwrót lub przechowywanie wartości w bazie danych
JSBach
W javascript API z pewnością użyłbym ciągów znaków. W DB oba mają swoje zalety. Niektóre bazy danych mają wbudowaną obsługę enum.
CodesInChaos

Odpowiedzi:

15

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ę 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.

Neil
źródło
2
Dobre punkty, ale zapominacie o przypadku, w którym ktoś decyduje się zmienić nazwę jednej z enum ( HEARTSna Heartlub coś w twoim przykładzie) i nagle wszystko znowu się psuje.
Scott Whitlock,
1
@ScottWhitlock Nie, jeśli to zrobisz, ale mogą zdecydować o całkowitej zmianie nazwy. Mogą przypadkowo usunąć bazę danych i projekt, ale nie możemy tutaj uwzględnić każdego możliwego incydentu.
Neil
5
@Neil - prawda, ale staramy się grać tutaj. Nie znam wyliczeń Java, ale w języku C # jawnie ustawiam wartości wyliczeń, jeśli wartości muszą mieć znaczenie poza programem (np. W bazie danych) (np. Kierki = 1, Diamenty = 2 itd.) . Ponieważ nie jest to domyślny sposób użycia wyliczenia, powinien on przerwać późniejszy edytor. Dodatkowo przydatny jest komentarz wskazujący, gdzie jeszcze są one używane.
Scott Whitlock,
1
@ScottWhitlock To zdecydowanie lepszy sposób na obejście tego, aby uniknąć takich problemów. Zakładając, że to zrobiłeś, nadal widzisz 1, 2, 3, 4 w bazie danych lub szeregowane w jakimś pliku. Nie jest idealny z punktu widzenia konserwacji w żaden sposób.
Neil,
2
Jeśli mogę dodać, jeśli wyliczenie jest szeregowane jako ciąg i ktoś zmieni nazwę wyliczenia, podczas deserializacji błąd wystąpi podczas analizowania. Jeśli wyliczenie jest int i ktoś zmieni definicję, błąd będzie dalej w dół linii, podczas przetwarzania, co będzie trudniejsze do zdiagnozowania. CC @ScottWhitlock.
Endy Tjahjono
1

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ć.

użytkownik470365
źródło
Tak, poszliśmy tą ścieżką, ale używamy hibernacji i musieliśmy dodać dodatkowy kod, aby móc przeanalizować wartość do / z bazy danych i wydawało się to dziwne, więc zdecydowaliśmy się użyć relacji .STRING i idź z imieniem enum.
JSBach,