2009-02-15 18 views
5

Ostatnio natknąłem się na wiele kodu Java, który opiera się na "plikach właściwości" do konfiguracji. Ale zamiast zwykłych starych literałów łańcuchowych, kod używa stałych (static Final Strings) do pobierania wartości właściwości.Jaki jest sens używania stałych dla kluczy właściwości?

znajdę ten dodatkowy poziom zadnie denerwujące bo muszę wykonać DWA wyszukiwań w ZARÓWNO kierunku. Jeśli zacznę od właściwości obserwowanej w pliku konfiguracyjnym, muszę najpierw wyszukać nazwę właściwości, aby znaleźć stałą Java, a następnie ponownie wyszukać, aby znaleźć odniesienia do stałej w kodzie. Jeśli zacznę od kodu, muszę znaleźć rzeczywistą wartość stałej, zanim będę mógł określić wartość właściwości w pliku konfiguracyjnym!

O co ci chodzi?

Rozumiem wartość wykorzystania stałych do odwoływania się do kluczy w pakunku zasobów, zwykle na poparcie i18n. Mam na myśli proste, niezwiązane z użytkownikiem wartości konfiguracyjne. Przyczyną, dla której mogę myśleć, jest ułatwienie późniejszej zmiany nazwy nieruchomości, ale ta korzyść jest znacznie mniejsza niż irytacja IMHO, szczególnie biorąc pod uwagę łatwość globalnego wyszukiwania i zamiany.

Odpowiedz

6

Jeśli wartość należy zmienić bez ponownej kompilacji, nieuchronnie potrzebne jest pewne przekierowanie, ale zrobienie kolejnej jest całkiem głupie, chyba że klucz musi być przywoływany w więcej niż jednym miejscu (co jest oznaką złego rozdzielenia obaw).

Łańcuchy klawiszy powinny być wystarczająco opisowe, aby nie mogły kolidować z osobami spoza ich zakresu (zwykle klasa), a przechowywanie literałów w obrębie jednej klasy nie jest skomplikowane ani nie może być tak poważnym problemem, aby zasługiwać na ich deklarację w pojedynczym bloku .Dlatego (IMO) ta praktyka jest po prostu kimś niewolniczo przestrzegającym reguł bez zrozumienia pierwotnej intencji reguły.

Jeśli chcesz podać alternatywną wytyczną do nich, aby usprawiedliwić relaksację, proponuję KISS.

+0

Doskonały punkt o wielu referencjach będących nieprzyjemnym zapachem! To eliminuje zarówno pośrednie * ORAZ * potrzeby globalnego S & R! – jcrossley3

0

Widziałem tę praktykę również przedtem, w rzeczywistości kiedy byłem w projekcie, w którym musiałem szukać pliku stałych, który doprowadził mnie do pliku XML, który ostatecznie dałby mi nazwę nieruchomości, której szukałem . A potem musiałem zajrzeć do pliku własności, ponieważ wartość była tym, czego naprawdę chciałem.

Myślę, że jest to przykład rzeczy, o których Jeff i Joel mówili na temat the last podcasts, gdzie programiści ślepo podążają za praktyką, o której słyszeli (w tym przypadku, praktyka, aby nigdy nie mieć literału ciągłego w swoim kod), nie myśląc o tym, czy jest to naprawdę właściwe, biorąc pod uwagę sprawę.

+0

Tak, jeśli stała, do której odnosi się tylko raz, wówczas jej wartość jest wątpliwa. Posiadanie stałej pojedynczej * może * być dobre, jeśli stała nazwa zastępuje magiczną liczbę, ale w tym przypadku nawet to nie ma zastosowania. Jednak, jeśli nazwy klawiszy pojawiają się w całym kodzie, to będę trzymać się stałych. – dwc

+0

W tym przypadku jednak? Dlaczego kiedykolwiek zmieniłaby się nazwa klucza własności? Jest to wartość, która jest znacznie bardziej prawdopodobna do zmiany. – bpapa

+0

Jeśli aplikacja korzysta z tych pośredników, muszą istnieć funkcje do wyszukiwania. Napisz główną funkcję 4-liniową, aby wywoływać te funkcje, zamiast samemu wyszukiwać pliki. Dobrzy programiści są leniwi. –

11

Po pierwsze, nie można pomylić klawiszy przy użyciu stałych bez otrzymania błędu kompilatora.

+0

Zgadzam się, że "argument literowy" ma pewną wartość podczas rozwoju, ale NIE przy debugowaniu problemów produkcyjnych. I twierdzę, że odpowiednie testy jednostkowe w jakikolwiek sposób zmniejszają ryzyko literówek (nie mówiąc już o kwestiach produkcji), więc koszt pośrednictwa wciąż znacznie przewyższa korzyści. – jcrossley3

5

Nawet w dzień łatwego wyszukiwania globalnego i zamiany (co nie jest nowe) za pomocą stałej pozwala ci wiedzieć, że ciąg jest właśnie dla tego pliku właściwości. To jest dobre, ponieważ:

  • A ciągłe oznaczają literówki dostanie błędy kompilatora, String nie
  • stałą pozwala oddzielić klucz „ID” dla jednego pliku właściwości wersety klucza „ID” dla innego Plik XML. Ten sam ciąg, inne znaczenie.
  • Wyszukiwanie globalne i zastąpienie może spowodować wiele problemów, podczas gdy IDE pozwoli ci bardzo łatwo wyszukać wszystkie zastosowania stałej i zmienić tylko te istotne.

W wielu przypadkach jest to dobry nawyk, w który wpadają programiści, ale dobre nawyki istnieją z jakiegoś powodu.

0

Bo funkcja autouzupełniania działa lepiej na identyfikatorach stałych, ale jeśli wszystkie kluczowe wartości to "com.foo.bar.whatever", nie otrzymasz informacji zwrotnej.

+0

Wygląda na to, że nadszedł czas, aby IDE lepiej obsługiwały pliki właściwości. – bpapa

Powiązane problemy