2013-09-02 14 views
5

Mam wiele konfiguracji, które mogą zmienić się w przyszłości, ale prawdopodobieństwo, że nigdy nie będą musiały zostać zmienione.Czy ustawienia hardcode w klasie są złe?

Jeśli czegoś brakuje lub jest ono nieprawidłowe, pewna funkcja mojego systemu nie będzie działać poprawnie.

Jeśli nadal będą one odzyskiwane, będą to jakieś konfiguracje, xml, baza danych itp. I udostępnione użytkownikowi końcowemu do zmiany - czy jest to dobra sytuacja, w której bardziej sensowne jest zakodowanie ich w klasie, która używa im?

Spędziłem wiele czasu, zmieniając zdanie na ten temat.

+1

Jeśli kiedykolwiek się okaże, że musisz zmodyfikować te ustawienia, musisz wykonać nowe wydanie zamiast edytować te parametry w xml i zrestartować system. Lepiej dmuchać na zimne. –

+1

Podobnie jak wiele rzeczy jest to równowaga. Jeśli uważasz, że te właściwości nie zmienią się w przyszłości i wysiłek włożenia ich we właściwości (czytanie, wstrzykiwanie ich) jest więcej niż banalne, umieść je w klasie. Jedno pytanie do zadawania sobie, to: kiedy stała staje się zewnętrzną konfiguracją? – Augusto

+0

Zwykle używam plików właściwości. A gdy definicja właściwości nie zostanie znaleziona w pliku właściwości, używam zakodowanej wartości domyślnej jako zastępczej. – h3nrik

Odpowiedz

3

Szacowanie przez projektanta prawdopodobieństwa wystąpienia czegoś, co wymaga zmiany, nie jest wiarygodnym kryterium podejmowania decyzji, ponieważ rzeczywiste wykorzystanie naszych programów ma swoje szczególne sposoby udowodnienia nam błędu.

Zamiast pytać siebie "jak prawdopodobne jest coś, co można zmienić?", Zadaj sobie pytanie "czy ma sens dla użytkownika końcowego dokonanie zmiany?" Jeśli odpowiedź brzmi "tak", zmień ją na użytkownika; w przeciwnym razie zmień go tylko za pomocą kodu.

Szczególny mechanizm, dzięki któremu można zrobić coś zmiennego (baza danych, plik konfiguracyjny, niestandardowy plik XML itd.) Nie ma większego znaczenia. Ważne jest, aby mieć dobre ustawienia domyślne dla brakujących ustawień, tak aby użytkownicy końcowi mieli trudniejsze złamanie systemu, dostarczając częściowe konfiguracje.

0

Jeśli konfiguracje nigdy się nie zmienią, jak powiedziałeś, to dobrze, jeśli zadeklarujesz te właściwości jako zmienną w interfejsie lub oddzielnej klasie i użyjesz tej stałej przez cały program.
Oddzielne pliki właściwości są używane tylko wtedy, gdy niektóre wartości właściwości nie są ustalone i zależą od środowiska takiego jak nazwa bazy danych, nazwa użytkownika, hasło itp. Podczas gdy niektóre właściwości są poprawione i nie są zależne od środowiska, w którym ma zostać wdrożone, jak portno , tablenames if any itp.

4

Najlepszą praktyką jest użycie dowolnego rodzaju pliku konfiguracyjnego lub właściwości i użycie wartości domyślnych i failsafe, jeśli plik jest uszkodzony/brakuje. Te podejście ma następujące zalety:

  • To może być łatwo rozpoznany jako plik konfiguracyjny oznaczającego kolejne dev nie trzeba nurkować przez swoich klas, aby zmienić parametr
  • plików nieruchomość może być napisany przez budowania narzędzi, takich jak mrówki , więc jeśli masz np adresse serwer testowy i produktywne adres serwera mrówka zadanie może zmienić treść odpowiednio
  • współpracuje z wartości domyślnych nawet bez niego

wadą jest dodany złożoność.

+0

Jeśli jedna z konfiguracji była wyrażeniem regularnym, które miało zostać użyte w funkcji dopasowywania wzorca wartości przekazanej, czy wpłynęłoby to na Twoją opinię? –

+0

Nie widzę regex jako config i nie chciałbym umieścić ich w zewnętrznym pliku konfiguracyjnym. Proponowałbym hermetyzację różnych opcji i tryb 1, tryb2 itd. do konfiguracji.Konfiguracja nie powinna składać się ze szczegółowych technicznych danych implementacyjnych (nie wstawiłbyś obrazka jako bytearray do konfiguracji, ale wstawiłbyś tam link, jeśli złapiesz mój dryf) – for3st

0

To zależy od aplikacji. Podstawową zaletą jest to, że używa on statycznych zmiennych do przechowywania danych, których potrzebuje program, zamiast ciągów kodowania i liczb całkowitych w całym miejscu; Oznacza to, że wszelkie zmiany (np. Kolor czcionki w aplikacji) w przyszłości będą wymagać tylko jednej zmiany, a następnie cyklu kompilacji i Twojego dobra.

Jednakże, jeśli te ustawienia można konfigurować przez użytkownika, nie można ich zakodować na sztywno, ale zamiast tego należy je odczytać z zewnętrznego źródła, a gdzie to zrobi, jest kwestią projektu, złożoności i bezpieczeństwa.

Zwykłe pliki tekstowe są dobre dla małej aplikacji, gdzie bezpieczeństwo jest luźne, a rzeczy są zwykłym tekstem. Edytor SublimeText i edytor notepad ++ robią to dla swoich ustawień tematycznych i działa dobrze. (Wierzę, że był to zwykły tekst, być może przeniósł się teraz do XML).

Lepszą opcją jest XML, ponieważ ma strukturę, łatwiej jest czytać/parsować/pisać. Wiele projektów korzysta z tego jako opcja. Jedną z rzeczy, na które należy zwrócić uwagę, są uszkodzone pliki, podczas ich odczytu/zapisu, jeśli użytkownik zamyka program lub wirtualna maszyna wirtualna z dowolnego powodu wychodzi z niego losowo. Możesz spojrzeć na takie rzeczy jak bufory. A także radzić sobie z FileNotFoundExceptions, jeśli brakuje pliku text/xml.

Inną opcją jest pewien rodzaj pliku bazy danych, nieco bardziej bezpieczny, można dodać szyfrowanie na poziomie aplikacji i masz wiele opcji. Duże programy, które już korzystają z backendu DB, jak MySQL, mają już bazę danych do przekazania, więc utwórz nową tabelę i zapisz tam konfigurację.Małe aplikacje mogą traktować SQLite jako opcję.

0

Nigdy nie twardo koduj rzeczy, jeśli hej "może" się zmienić, albo możesz być zmartwiony później i zwariować innych (bardzo prawdopodobne w dużych projektach i/lub open source). Jeśli konfiguracja nigdy się nie zmieni, to nie jest to konfiguracja więcej niż stała.

Używaj tylko twardego kodowania podczas eksperymentów z kodem.

Jeśli chcesz zapisać proste wartości, możesz użyć właściwości java.

Poszukaj przykładu HERE.

powodzenia.

2

Tak, to prawie na pewno zły pomysł na ich zakodowanie; jeśli nic innego, może sprawić, że testowanie (zarówno zautomatyzowane, jak i manualne) będzie o wiele trudniejsze, niż powinno być. W swoim słoiku łatwo jest umieścić plik .properties ze zwykłymi ustawieniami domyślnymi, a zmiana ich w przyszłości wymagałaby zastąpienia ich w środowisku wykonawczym. Wstrzyknięcie zaleŜności jest zwykle jeszcze lepszym wyborem, jeŜeli masz moŜliwość jej zorganizowania.

+2

+1, w szczególności dla ustawienia wartości domyślnych w plik właściwości (lub inny plik) w słoiku. To przenosi je z kodu i do pliku konfiguracyjnego bez ponoszenia dodatkowej złożoności wdrażania. Odtąd jest to niewielki krok do podjęcia opcjonalnego zewnętrznego pliku konfiguracyjnego, a jednocześnie można przywrócić domyślne ustawienia. W sytuacji awaryjnej sysop może nawet upuścić nowy plik właściwości do słoika ręcznie, czego nie da się łatwo zrobić przy pomocy plików klas. –

0

Istnieje kilka właściwości, które można zmienić bez konieczności ponownego testowania oprogramowania. Te właściwości zostały przetestowane pod kątem zakresu wartości lub na pewno można je bezpiecznie zmienić przy co najwyżej ponownym uruchomieniu. Te właściwości można konfigurować.

Istnieją inne właściwości, których nie można zakładać, po prostu działają bez konieczności ponownego testowania oprogramowania. W takim przypadku lepiej jest je zakodować IMHO. Zachęca to do przejścia przez proces wydawania po zmianie takiej wartości. Wartości, których nie spodziewasz się zmienić, są dobrym kandydatem do tego.

Powiązane problemy