Предположим, у меня есть программа с большим количеством параметров конфигурации. Пользователь может указать их в файле конфигурации. Моя программа может анализировать этот файл конфигурации, но как его внутренне хранить и передавать параметры?
В моем случае программное обеспечение используется для проведения научного моделирования. Есть около 200 вариантов, большинство из которых имеют нормальные значения по умолчанию. Обычно пользователь должен указывать только около дюжины. Трудность, с которой я сталкиваюсь, заключается в том, как создать мой внутренний код. Многие объекты, которые нужно построить, зависят от многих параметров конфигурации. Например, для объекта может потребоваться несколько путей (для которых будут храниться данные), некоторые параметры, которые необходимо передать алгоритмам, вызываемым объектом, и некоторые параметры, которые непосредственно используются самим объектом.
Это приводит к объектам, требующим очень большого количества аргументов, которые нужно построить. Кроме того, поскольку моя кодовая база находится под очень активной разработкой, большая боль проходит через стек вызовов и передает новую конфигурационную настройку вплоть до того, где она необходима.
Один из способов предотвратить эту боль - иметь глобальный объект конфигурации, который можно свободно использовать в любом месте кода. Мне не очень нравится этот подход, поскольку он приводит к функциям и классам, которые не принимают ни одного (или только одного) аргумента, и для читателей не очевидно, с какими данными связана функция/класс. Это также предотвращает повторное использование кода, поскольку весь код зависит от гигантского объекта конфигурации.
Может ли кто-нибудь дать мне несколько советов о том, как такая структура должна быть структурирована?
Вот пример того, что я имею в виду для стиля передачи конфигурации:
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)
Вот пример глобального стиля конфигурации:
class A:
def __init__(self, config):
self.config = config
def foo(self, arg):
algo(arg, config)
Примеры приведены в Python, но мой вопрос означает любое подобное программирование langauge.