2010-11-22 2 views
0

私が使用するコードベースは、MDB2から継承するデータベースクラスです。これは、使用中のMVCフレームワーク(カスタムビルド)の基礎を形成し、モデルは順番にdbから継承されます。継承の代わりにカプセル化するクラスを変更する

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

私の計画では、dbクラスを継承するのではなく、MDB2をカプセル化するように変更し、そのシングルトン機能を使用してMDB2のインスタンスを1つ維持します。

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

MDB2クラスをカプセル化して上位レイヤーを変更せずに呼び出しを渡す方法はありますか?MDB2のすべてのメソッドにラッパーメソッドを記述する必要はありませんか?

+0

サンプルモデルクラスを見せてもらえますか?そのため、それらがどの程度結合されているかを確認できますか? – Gordon

答えて

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のインスタンス間で共有されます。ここでシングルトンを使用する理由はありません。

__callインターセプタは、MDBメソッドでメソッドを呼び出すDBで呼び出されたメソッドがキャッチされ、MDBインスタンスに委譲されることを確認します。マジックメソッドはパフォーマンスに大きな影響を与える可能性があるため、パフォーマンスに影響があることがわかったら、呼び出されたメソッドをDBクラスに追加し、そこから委譲します。

DBインスタンスがまだモデルクラスに密接に結合されているため、これはまだ最適な解決策ではありません。より多くのリファクタリングが必要な場合は、現在のところ、DBから継承しているすべてのクラスを代わりにカプセル化することをお勧めします(ActiveRecords以外の場合)。次に、Dependency Injectionを使用してDBインスタンスを使用可能にします。

関連する問題