Powiedzmy, że mam program, który ma dużą liczbę opcji konfiguracyjnych. Użytkownik może określić je w pliku konfiguracyjnym. Mój program może analizować ten plik konfiguracyjny, ale w jaki sposób powinien on wewnętrznie przechowywać i przekazywać opcje?Jak zaprojektować program z wieloma opcjami konfiguracji?
W moim przypadku oprogramowanie służy do przeprowadzenia symulacji naukowej. Istnieje około 200 opcji, z których większość ma normalne wartości domyślne. Zazwyczaj użytkownik musi podać tylko około tuzina. Trudność, jaką napotykam, polega na tym, jak zaprojektować swój wewnętrzny kod. Wiele obiektów, które trzeba skonstruować, zależy od wielu opcji konfiguracyjnych. Na przykład obiekt może wymagać kilku ścieżek (dla miejsca, w którym będą przechowywane dane), niektórych opcji, które należy przekazać do algorytmów, które obiekt wywoła, oraz niektórych opcji, które są używane bezpośrednio przez sam obiekt.
Prowadzi to do obiektów wymagających bardzo dużej liczby argumentów do skonstruowania. Dodatkowo, ponieważ moja baza kodów jest bardzo aktywnie rozwijana, bardzo trudno jest przejść przez stos wywołań i przekazać nową opcję konfiguracji, aż do miejsca, w którym jest potrzebna.
Jednym ze sposobów uniknięcia tego bólu jest posiadanie obiektu konfiguracji globalnej, który można swobodnie używać w dowolnym miejscu kodu. Nie podoba mi się to podejście, ponieważ prowadzi do funkcji i klas, które nie przyjmują żadnego (lub tylko jednego) argumentu i nie jest oczywiste dla czytelnika, z jakimi danymi korzysta dana funkcja/klasa. Zapobiega także ponownemu użyciu kodu, ponieważ cały kod zależy od gigantycznego obiektu konfiguracyjnego.
Czy ktoś może udzielić mi porady dotyczącej tego, jak powinien wyglądać taki program?
Oto przykład tego, co oznacza dla konfiguracji opcja mijania stylu:
class A:
def __init__(self, opt_a, opt_b, ..., opt_z):
self.opt_a = opt_a
self.opt_b = opt_b
...
self.opt_z = opt_z
def foo(self, arg):
algo(arg, opt_a, opt_e)
Oto przykład globalnego stylu config:
class A:
def __init__(self, config):
self.config = config
def foo(self, arg):
algo(arg, config)
Przykłady są w Pythonie, ale moja pytanie oznacza wszelkie podobne języki programowania.
Globalny obiekt konfiguracyjny łączy wszystkie kody razem. Byłoby miło, gdyby program był bardziej modułowy. Podoba mi się rozwiązanie pokazane przez @HYRY. Wygląda jak najlepszy z obu światów. – qsc