Вероятно, очень распространенный вопрос, но пока не нашел подходящего ответа.
У меня есть приложение (модули Python w / C ++), которое интенсивно использует базу данных SQLite, и ее путь указывается пользователем при запуске приложения.
Каждый раз, когда какой-то части приложения требуется доступ к базе данных, я планирую получить новый сеанс и отказаться от него, когда закончите. Чтобы это произошло, мне, очевидно, нужен доступ к пути, указанному при запуске. Несколько способов увидеть это:
1. Явные аргументы
Путь к базе данных передается везде, где он должен быть через явный параметр, и сеанс базы данных создается с этим явным путем. Это, пожалуй, самый модульный, но, кажется, невероятно неловкий.
2. Путь к базе данных синглтон
Объект сеанса базы данных будет выглядеть так:
import foo.options
class DatabaseSession(object):
def __init__(self, path=foo.options.db_path):
...
Я считаю, что это синглтон меньшего зла, поскольку мы храним только постоянные строки, которые не меняются во время выполнения приложения. Это дает возможность переопределить значение по умолчанию и при необходимости выполнить модульное тестирование класса DatabaseSession
.
3. Путь к базе данных singleton + метод статической фабрики
Возможно, небольшое улучшение по сравнению с выше:
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
, если только мы не используем фабричный метод. Кроме того, метод может выполнять такие вещи, как кэширование сеанса или еще много чего.
А потом есть другие паттерны, о которых я не знаю. Я смутно видел нечто подобное в веб-фреймворках, но у меня нет никакого опыта с ними. Мой пример довольно специфичен, но я предполагаю, что он распространяется и на другие настройки приложения, отсюда и название поста.
Мне бы хотелось услышать ваши мысли о том, как лучше всего это устроить.