5

Oracle または MySQL とやり取りできるクラスがあります。このクラスは、「Oracle」または「MySQL」のいずれかのキーワードと、両方のデータベース タイプに標準的な他のいくつかのパラメーター (出力する内容、例外で停止するかどうかなど) で初期化されます。

始めたときは必要に応じて簡単に追加できif Oracle do A, elif MySQL do Bましたが、1 つのデータベース タイプにのみ適用される特殊なコードを追加するにつれて、これは見苦しくなっていきます。クラスを Oracle 用と MySQL 用の 2 つに分割し、コードの重複を避けるためにいくつかの共有関数を使用しました。

これらの新しいクラスの呼び出しを処理する最も Pythonic な方法は何ですか? これと同じキーワードを使用し、正しいクラスを返すラッパー関数/クラスを作成する必要がありますか? 古いジェネリック クラスを呼び出すすべてのコードを、正しい DB 固有のクラスを呼び出すように変更する必要がありますか?

必要に応じてサンプル コードを喜んでモックアップしますが、必要だとは思いませんでした。助けてくれてありがとう!

4

2 に答える 2

4

これと同じキーワードを使用して正しいクラスを返すラッパー関数/クラスを作成しますか?

それがアイデアです。このような関数は、ファクトリ関数と呼ばれます。

def connect_to(db, *args):
    if db == "MySQL":
        return MySQL(*args)
    elif db == "Oracle":
        return Oracle(*args)
    else:
        raise ValueError("unknown database type: %r" % db)

両方のデータベースクラスが同じAPIを持っていることを確認してください。これは、ダックタイピングまたは抽象基本クラス(ABC)のいずれかを使用して実現できます。isinstance後者は、機能がクラス間で共有されている場合、またはオブジェクトがデータベース接続を表しているかどうかを確認するためのチェックを実行する場合に最も役立ちます。

共有機能の場合、テンプレートメソッドパターンが役立つことがよくあります。

于 2012-10-29T16:37:29.857 に答える
3

パラメータに基づいて実装を返すファクトリ クラスを作成します。次に、両方の DB タイプに共通の基本クラスを作成し、それぞれに 1 つの実装を作成して、ファクトリがパラメーターに基づいて正しい実装を作成、構成し、ユーザーに返すようにします。

これは、2 つのクラスが非常によく似た動作をする場合にうまく機能します。しかし、DB 固有の機能を使いたいとすぐに、isFeatureXSupported()(良いアプローチ) やisOracle()(どの DB がどの機能を持っているかの知識をヘルパー クラスからアプリ コードに移すため、より単純ですが悪い) のような方法が必要になるため、見苦しくなります)。

または、両方のすべての機能を実装し、一方がサポートされていない場合に例外をスローすることもできます。コード内で例外を探して、これを確認できます。これにより、コードがよりクリーンになりますが、機能を実際に使用しなくても機能が利用可能かどうかを実際に確認できるようになりました。これにより、アプリのコードで問題が発生する可能性があります (たとえば、メニューを無効にする場合や、アプリが別の方法でそれを実行できる場合)。

于 2012-10-29T16:11:43.650 に答える