W dużych i złożonych produktach oprogramowania zarządzanie konfigurowalnymi ustawieniami staje się poważnym problemem. Dwa podejścia, które widziałem, to:
- każdy składnik w systemie ładuje własną konfigurację z plików konfiguracyjnych lub ustawień rejestru.
- mają klasę programu ładującego ustawienia, która ładuje wszystkie konfigurowalne ustawienia systemowe i każe każdemu komponentowi wysłać zapytanie do programu ładującego ustawienia o swoje ustawienia.
Oba te podejścia wydają mi się złe.
Czy są jakieś wzorce projektowe, które można wykorzystać do uproszczenia problemu? Może coś, co wykorzystałoby technikę wstrzykiwania zależności.
Odpowiedzi:
Wolę tworzyć interfejs do ustawiania zapytań, ładowania i zapisywania. Używając wstrzykiwania zależności, mogę wstrzyknąć to do każdego składnika, który tego wymaga.
Zapewnia to elastyczność w zakresie zastępowania strategii konfiguracji i daje wspólną podstawę dla wszystkiego, na czym ma działać. Wolę to od pojedynczego, globalnego "programu ładującego ustawienia" (twoja opcja 2), zwłaszcza, że mogę zastąpić mechanizm konfiguracji pojedynczego komponentu, jeśli absolutnie tego potrzebuję.
źródło
Obecnie pracuję w systemie, w którym konfiguracja jest zarządzana przez jeden globalny obiekt singleton, który przechowuje mapę kluczy konfiguracji do wartości. Ogólnie rzecz biorąc, żałuję, że nie zostało to zrobione w ten sposób, ponieważ może to powodować wąskie gardła współbieżności w systemie i jest niechlujne do testowania jednostkowego itp.
Myślę, że Reed Copsey ma do tego prawo (zagłosowałem na niego), ale zdecydowanie poleciłbym przeczytanie świetnego artykułu Martina Fowlera na temat wstrzykiwania zależności:
http://martinfowler.com/articles/injection.html
Niewielki dodatek ... jeśli chcesz wykonać jakiekolwiek testy jednostkowe typu obiektu, wstrzyknięcie zależności jest zdecydowanie właściwą drogą.
źródło
ll be flexible with adding new things to your config. Sure as all approaches this have it
zalety i wady.Co powiesz na to. Definiujesz interfejs Configurable za pomocą jednej metody konfiguracji (konfiguracji). Argument konfiguracyjny to po prostu tablica haszująca, która wiąże nazwy parametrów konfiguracyjnych z ich wartościami.
Obiekty root mogą tworzyć konfigurację hashtable w dowolny sposób (np. Odczytywanie jej z pliku konfiguracyjnego). Ta tablica hashy może zawierać parametry konfiguracyjne dla obiektu głównego iselft, a także wszelkie parametry, których może używać jeden z jego komponentów, podkomponentów, podkomponentów (itp.).
Obiekt główny następnie wywołuje konfigurację (konfigurację) na wszystkich konfigurowalnych składnikach.
źródło
Możesz utworzyć wiele implementacji interfejsu, który definiuje moduł ładujący konfigurację. Zasadniczo wzorzec strategii, w którym można zdefiniować jeden podstawowy interfejs jako configLoader, a następnie kolejne różne implementacje, takie jak FileSystemLoader, ClasspathLoader, EnvVariablesLoader itp. Szczegóły pod tym linkiem
źródło