おそらく非常によくある質問ですが、まだ適切な答えが見つかりません..
SQLite データベースを多用する (Python w/ C++ モジュール) アプリケーションがあり、そのパスはアプリケーションの起動時にユーザーによって提供されます。
アプリケーションの一部がデータベースにアクセスする必要があるたびに、新しいセッションを取得し、完了したら破棄する予定です。そのためには、明らかに、起動時に提供されるパスにアクセスする必要があります。私がそれが起こっているのを見るいくつかの方法:
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
この方法では、ファクトリ メソッドを使用しない限り、モジュールはまったく依存しません。さらに、メソッドはセッションキャッシングなどを実行できます。
そして、私が知らない他のパターンがあります。Web フレームワークで似たようなものを漠然と見ましたが、それらの経験はありません。私の例は非常に具体的ですが、他のアプリケーション設定にも拡張されると思います。したがって、投稿のタイトルです。
これをどのように配置するのが最善かについて、あなたの考えをお聞きしたいと思います。