Jakie wzorce projektowe można zastosować do problemu z ustawieniami konfiguracji?


83

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.


4
Dlaczego uważasz, że opcja 2 jest błędna?
ChaosPandion

2
Zwykle jest implementowany jako singleton, chociaż istnieją inne sposoby na jego implementację.
Daniel Bingham

Odpowiedzi:


47

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


7
cześć, będzie miło, jeśli udostępnisz jakąś próbkę :)
issamux

20

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


Wygląda na to, że dekorator pasuje do Twoich potrzeb. Możesz stworzyć dekorator z możliwością serializacji, który będzie mógł tworzyć serializowanie klas na swój własny sposób. Strategii można użyć, aby wszystkie obiekty miały swoją strategię serializacji. Te obiekty, które nie wymagają serializacji, mogą używać strategii ignorowania. Te, które muszą tylko serializować swoje pola, strategia OnlyFields i tak dalej. Masz ll be flexible with adding new things to your config. Sure as all approaches this have itzalety i wady.
Yaroslav Yakovlev

4

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.


0

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.