2009-04-09 17 views
4

におそらく非常に一般的な質問の伝播が、私はSQLiteのデータベースを多用して、そのパスを供給します(PythonのC++モジュール/ w)のアプリケーションを持って、適切な答えはまだ..は、アプリケーションの設定

を見つけることができませんでしたアプリケーションの起動時にユーザーによって

アプリケーションの一部がデータベースにアクセスする必要があるたびに、私は新しいセッションを取得し、完了すると破棄します。それが起こるには、私は明らかに起動時に提供されたパスにアクセスする必要があります。私はそれが起こって見る方法のカップル:

1.明示的な引数

データベース・パスは、それが明示的なパスでインスタンス化された明示的なパラメータとデータベースセッションを介してである必要がどこにでも渡されます。これはおそらく最もモジュラーですが、信じられないほど厄介なようです。我々は唯一の定数文字列を格納しているので、私は、これはあまり悪シングルトンであると考えて

import foo.options 
class DatabaseSession(object): 
    def __init__(self, path=foo.options.db_path): 
     ... 

、:

2.データベース・パスシングルトン

は、データベースのセッションオブジェクトは次のようになります。アプリケーション実行時には変更されません。これにより、必要に応じてDatabaseSessionクラスのデフォルトおよびユニットテストをオーバーライドすることが可能になります。上記オーバー

3.データベース・パスシングルトン+ staticファクトリメソッド

おそらく若干の改善:私たちがしている場合を除き

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をシングルトンとして定義していますか? –

答えて

2

はい、他にもあります。あなたの選択肢3は非常にPythonicです。

が正しく設定セッションを放出する工場を使用してください(これはDjangoのようなWebフレームワークがそれを行う方法です)オプションをカプセル化する

を標準のPythonモジュールを使用してください。

SQLiteには既に「接続」があるので、それを使用しないでください。あなたのDatabaseSessionクラスは、ビルトイン接続に欠けているものを何を追加しますか?

+0

コメントありがとうございます。私はこの例を単純化するために "データベースセッション"という用語を使用しました。現実には、データベースから青写真を得るオブジェクトファクトリに似ています。 –

関連する問題