2012-03-16 11 views
0

以下のような状況に対処するための設計パターンはおそらく十分だと思いますが、拡張クラスの上書きメソッドの代わりに、具体的にはMVCモデル

基本的な問題

問題のescenseはその後、私は方法myMethodmyClassを持っていると私はmyClassを拡張するクラスextClassを持っていると私はextMethod少し異なる動作を持つようにmyMethodをしたいと言っているI拡張クラス内のメソッドを上書きすることができますが、重複したコードを持つことになります。

具体的な詳細

私は挿入と削除が実行される方法を定義するベースモデルクラスを持っているところ私が対処しようとしている具体的な問題は、MVCを使用しています。いくつかのデータベーステーブルでは、基本クラスを継承し、挿入/削除メソッドを上書きしてトリガーを追加してレコードバージョンを作成するクラスversion_modelで行われるレコードのバージョン管理を実装しています。これは、いくつかの特定のデータベーステーブルモデルの場合を除いては問題ありません。ノミナル化されたテーブル(人テーブル>アドレスなど)への挿入を自動的に処理するカスタム挿入/削除メソッドを定義したいと思います。これは、どちらが拡張するかによって、version_modelまたはbase_modelのいずれかからコードをコピーする必要がある場合を除いて、問題ありません。

これはフックで解決できると思っていたので、私のversion_modelとbase_modelのinsert/deleteメソッドは 'before_insert()'と 'after_insert()'メソッドを呼び出し、ベース機能を複製せずに追加機能を追加できました。これを行うより良い方法はありますか?

答えて

1

一般的なコードとは異なるコードを区切り、スーパークラスに共通コードを保存し、親クラスのメソッドをサブクラスから呼び出します。 (PHP)

protected function subclass_method() { 
    $data = parent::superclass_method(); 

    // do stuff with data 
} 

フックのアプローチは、あなたが同じ多かれ少なかれをやってますが、template method patternの一例であるスーパーの中にロジックを入れている場合には、あまりにも動作します。

普通の方法は、振る舞いをオブジェクトとして入れ替えるところですが、これは、必要なメソッドの組み合わせが非常に複雑なクラス階層を引き起こし、過度の操作になるような状況に適しています。テンプレートまたは親メソッドへの呼び出しは、このIMOでは問題ありません。できるだけ小さな手順でプロセスを分解してください。クラスによって異なる複数のステップがある場合は、template/hooksを使用します。 1つだけの場合は、親クラスの関数を使用します。

+0

ちょうど私が探していた答えのちょうど種類!どうもありがとうございました! – rgvcorley

+0

喜んで:) –

関連する問題