Распространение настроек приложения - PullRequest
4 голосов
/ 09 апреля 2009

Вероятно, очень распространенный вопрос, но пока не нашел подходящего ответа.

У меня есть приложение (модули 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, если только мы не используем фабричный метод. Кроме того, метод может выполнять такие вещи, как кэширование сеанса или еще много чего.

А потом есть другие паттерны, о которых я не знаю. Я смутно видел нечто подобное в веб-фреймворках, но у меня нет никакого опыта с ними. Мой пример довольно специфичен, но я предполагаю, что он распространяется и на другие настройки приложения, отсюда и название поста.

Мне бы хотелось услышать ваши мысли о том, как лучше всего это устроить.

1 Ответ

2 голосов
/ 09 апреля 2009

Да, есть и другие. Ваш вариант 3, хотя и очень Pythonic.

Использование стандартного модуля Python для инкапсуляции опций (так делают веб-фреймворки, такие как Django)

Используйте фабрику для создания правильно настроенных сеансов.

Поскольку SQLite уже имеет «соединение», почему бы не использовать это? Что добавляет ваш класс DatabaseSession в отсутствие встроенного соединения?

...