witam, piszę w Javie, pytanie jednak mam dość ogólne.
Czy istnieje uznane rozwiązanie opisujące, jak przechowywać w programie i udostępniać obiektom (przekazywać) opcje aplikacji?
Wyobraźmy sobie program z interfejsem graficznym, gdzieś w menu jest pozycja "Opcje". Otwiera ona panel z ustawieniami, użytkownik coś tam modyfikuje, potem wciska OK i opcje się uaktualniają. Zanim otwarto panel, już były jakieś wartości domyślne. Więc istnieje pewnie jakiś obiekt przechowujący opcje (ja tak robiłem do tej pory).
Chodzi mi o to, jak przekazywać ten obiekt, albo jak tego unikać?
Załóżmy, że to program rysujący bibliotekę. Obiekt ramowy aplikacji (ten, w którym jest main() ) ma referencję do opcji. Tworzy on np. obiekt "biblioteka", "biblioteka" tworzy "półkę", "półka" tworzy "książkę", "książka" tworzy swój "grzbiet". Dajmy na to, że grzbiet musi umieć się narysować i robi to na podstawie opcji (np. prawdopodobieństwo wyboru koloru, domyślna czcionka itp.).
ROZWIĄZANIA (żadne nie jest dobre):
-
GLOBALNE: opcje globalne - odpada w przedbiegach, nawet nie wiem, czy Java na to pozwala...
-
STATYCZNE: zapisywanie dla każdej klasy opcji, które jej dotyczą w polach statycznych tej klasy przed pierwszym użyciem. Dobre, bo każda klasa pamięta tylko to, co jej dotyczy. Ale co, gdy mamy wiele bibliotek, wiele półek, a wszystkie mają być różne (z różnymi opcjami)?
-
ŁAŃCUCH: z głównego obiektu opcje są przekazywane do biblioteki, z biblioteki do półki, z półki do książki itd. Wady: łańcuch bywa bardzo długi (czasem po kilkanaście ogniw), a opcje potrzebne tylko w ostatnim - wszystkie pośrednie obiekty (nawet takie, które nie potrzebują żadnych opcji) są więc "zarażane" uzależnieniem od obiektu opcji, tzn. muszą przechowywać referencje do opcji, których nie potrzebują i które ich nie dotyczą. Robi się z tego straszny balast (bo takie sytuacje się namnażają), bałagan i zaciemnia to kod. Potem jest tak, że prawie każda moja klasa przyjmuje w konstruktorze parametr ProgramOptions opt. Takie coś skutecznie uniemożliwia powtórne użycie kodu i wydaje mi się ogłupiające, ale nie wymyśliłem nic lepszego.
Po drugie w programie może być 20 000 obiektów, a każdy ma referencję. Nie da się tego szybko aktualizować, ani mieć pewności, która referencja jest aktualna, a która nie. Poza tym wtedy wszystko staje się powiązane ze wszystkim - nie da się narysować diagramu UML moich programów.
Ktoś zna jakieś skuteczne rozwiązanie tego problemu? To chyba problem zupełnie typowy, większość aplikacji ma jakieś opcje... Tymczasem google w kółko pokazują mi do znudzenia Adater, Bridge, Facade, Decorator, jak zgraną płytę...