Вероятно, очень общий вопрос, но не мог найти подходящий ответ еще ..Распространяющиеся настройки приложения
У меня есть (Python ж/модулей C++) приложение, которое делает интенсивное использование базы данных SQLite и путь получает комплект поставки пользователем при запуске приложения.
Каждый раз, когда какая-то часть приложения нуждается в доступе к базе данных, я планирую приобрести новый сеанс и отменить его, когда это будет сделано. Для этого мне явно нужен доступ к пути, указанному при запуске. Пара способов, которые я вижу, что это происходит:
1. Явных аргументы
Путь к базе данных передаются везде она должна быть через явный параметр и сеанс базы данных создаются с этим явным путем. Это, пожалуй, самый модульный, но кажется невероятно неудобным.
2. Путь к базе данных одноточечно
База данных объекта сессия будет выглядеть следующим образом:
import foo.options
class DatabaseSession(object):
def __init__(self, path=foo.options.db_path):
...
Я считаю, что это меньшее зло-синглтон, так как мы сохраняем только постоянные строки, которые не изменяются во время выполнения приложения. Это дает возможность переопределить значение по умолчанию и выполнить единичный тест класса DatabaseSession
, если это необходимо.
3. Путь к базе данных одноточечно + статический метод фабрики
Возможно незначительное улучшение по сравнению с выше:
def make_session(path=None):
import foo.options
if path is None:
path = foo.options.db_path
return DatabaseSession(path)
class DatabaseSession(object):
def __init__(self, path):
...
Таким образом, модуль не зависит от foo.options
вообще, если мы не используя заводской метод. Кроме того, метод может выполнять такие вещи, как кеширование сеанса или многое другое.
И еще есть другие узоры, о которых я не знаю. Я смутно видел что-то подобное в веб-фреймворках, но у меня нет опыта с ними. Мой пример довольно специфичен, но я предполагаю, что он также расширяется до других параметров приложения, следовательно, заголовок сообщения.
Я хотел бы услышать ваши мысли о том, каким будет наилучший способ организовать это.
только для того, чтобы быть ясным, foo.options определяет db_path как singleton? –