0

私が手渡されたコードベースは、MDB2から継承するデータベースクラスを備えています。これは、使用中のMVCフレームワーク(カスタムビルドの問題)の基礎を形成し、モデルはdbから継承します。

お気づきの方もいらっしゃると思いますが、これはかなり大きな問題につながります。モデルをインスタンス化するたびに、新しいデータベース接続が作成されます。これは明らかにかなり無駄です。また、モデルの1つのインスタンスでトランザクションが開始された場合、コミットが発生するまでその影響は他のインスタンスには表示されないため、意図したとおりにトランザクションを使用できないことも意味します。

私の計画は、dbクラスを変更してMDB2を継承するのではなくカプセル化し、シングルトン機能を介してMDB2の単一インスタンスを維持することです。

ただし、MDB2は多くのメソッドを備えた大きなライブラリであり、コードベースの上位にある多くのものは、MDB2メソッドにアクセスできるかどうかに依存します。

MDB2クラスをカプセル化し、上位層を変更せずに、またMDB2のすべてのメソッドのラッパーメソッドを作成せずに、MDB2クラスに呼び出しを渡す方法はありますか?

4

1 に答える 1

3

まだコードを提供していないので、これは、非常に少ないコードで継承を削除すると同時に、完全な機能を維持し、MDBクラスが一度だけインスタンス化されるようにする方法を盲目的に提案しています。

class Db
{
    protected static $_mdb;
    public function __construct()
    {
        if(self::_mdb === NULL) {
            self::_mdb = new MDB;
        }
    }
    public function __call($method, $args)
    {
        return call_user_func_array(array(self::_mdb, $method), $args);
    }
}

これにより、基本的にDBクラスがMDBのデコレータになります。最初のインスタンス化で、DBクラスはMDBの静的インスタンスを作成して保存します。これは、子クラスを含むDBのすべてのインスタンス間で共有されます。ここでシングルトンを使用する理由はありません。

インターセプターは、__callMDBメソッドのメソッドを呼び出すDBで呼び出したすべてのメソッドがキャッチされ、MDBインスタンスに委任されることを確認します。マジックメソッドはパフォーマンスに深刻な影響を与える可能性があるため、パフォーマンスへの影響に気付いた場合は、呼び出されたメソッドをDBクラスに追加し、そこから委任します。

言うまでもなく、DBインスタンスはまだモデルクラスに緊密に結合されているため、これは依然として最良のソリューションではありません。より多くのリファクタリングを行う余裕がある場合は、現在DBから継承しているすべてのクラスを代わりにDBインスタンスをカプセル化することをお勧めします(ActiveRecordsでない場合)。次に、依存性注入を使用してDBインスタンスを使用可能にします。

于 2010-11-22T11:14:01.330 に答える