Допустим, у меня есть программа с большим количеством опций конфигурации. Пользователь может указать их в конфигурационном файле. Моя программа может анализировать этот файл конфигурации, но как он должен внутренне хранить и передавать параметры?
В моем случае программное обеспечение используется для проведения научного моделирования. Есть около 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, но мой вопрос касается любого подобного языка программирования.