2009-04-09 2 views
4

Вероятно, очень общий вопрос, но не мог найти подходящий ответ еще ..Распространяющиеся настройки приложения

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

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

Я хотел бы услышать ваши мысли о том, каким будет наилучший способ организовать это.

+0

только для того, чтобы быть ясным, foo.options определяет db_path как singleton? –

ответ

2

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

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

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

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

+0

Спасибо за комментарий. Для упрощения примера я использовал термин «сеанс базы данных»; в действительности, это больше похоже на объектную фабрику, которая получает свои чертежи из базы данных. –