22

私の職場 (php のみ) には、データベース抽象化のための基本クラスがあります。新しいデータベース テーブルをベース レイヤーに追加する場合は、このベース クラスのサブクラスを作成し、いくつかのメソッドをオーバーライドして、このテーブルを使用するための個々の動作を定義する必要があります。通常の動作は同じままである必要があります。

今では、デフォルトの動作のメソッドをオーバーライドするだけの新しいプログラマーを会社でたくさん見てきました。すべてのデフォルトの動作を入れて、好きな場所に個々のものを追加するだけで「いい」ものもあれば、基本クラスとその継承者を使用しようとして自殺するものもあります。

この問題を解決するために私が最初に考えたのは、継承クラスによってオーバーライドされるべき抽象メソッドについて考えることでした。しかし、抽象メソッドに対する他の引数のほかに、「抽象」は、ベースクラスを単独で使用できない理由と、これらの関数をオーバーライドする必要がある理由を示していません。

いくつかグーグルで調べた後、PHPで「実際の」仮想関数を実装するための良い答えが見つかりませんでした(具体的な実装のすべての希望をほとんど殺してしまう仮想関数があるだけです)。

それで、あなたはこの問題をどうしますか?

4

3 に答える 3

33

PHP では、パブリック関数とプロテクト関数はすべて「仮想」です。finalキーワードを先頭に追加することで、関数がオーバーライドされるのを防ぐことができます。(または非公開にすることもできますが、これはおそらく悪い考えです)。

ベースクラスの設計では、サブクラスが影響を与える動作について考えます。たとえば、before_update() や after_insert() などの空の関数を作成します。

function after_insert() {
  // Virtual
}

更新/挿入イベントが発生したときにベースクラスが呼び出すもの。

おそらく、ベースクラスで常に true を返す is_valid() 関数で、コメントブロックを使用して、サブクラスが false を返した場合の結果を説明します。

うまくいけば、これはあなたにいくつかのインスピレーションを与えるでしょう.

于 2009-08-31T22:13:52.780 に答える
4

人々がクラスを間違った方法で使用している場合、クラス関数の一部がオーバーライドされるのを防ぐために、いつでも「final」キーワードを使用できます。

彼らは特定の機能を実現できないため、メソッドをオーバーライドしているように思えます。クラスの設計を確認する必要がある場合があります。

于 2010-07-01T11:04:30.763 に答える
1

基本クラスの実装例がなければ、具体的な情報を提供するのは困難です。しかし、いくつかのことが頭に浮かびます:

  1. データベースの抽象化は、そもそも複雑なものです。無駄のない、クリーンで意地悪なものにしたい気持ちはわかりますが、なかなか難しいと思います。どの部分が一般的で、どの部分が専門化が必要かを確認するには、さまざまな DB エンジンの仕様を徹底的に調べる必要があります。また; 基本クラスを拡張して DB テーブルを追加することについて話しているので、DB 抽象化をテーブル データ ゲートウェイ パターンと混同していませんか?

  2. 現在の基本クラスのメソッドは、拡張クラスが後ろ向きに曲がりすぎてきれいに保たれている場合、やりすぎているか、そもそも一般的ではない可能性があります。おそらく、基本クラスのインターフェイス メソッドを、拡張クラスのオーバーライド メソッドで再利用するのに十分一般的である、より小さな保護されたメソッドに分割する必要がありますか? またはその逆: インターフェイス メソッドにオーバーライド可能なメソッドへのフックが必要かもしれません。

  3. ポイント 2 から: いくつかの一般的に実装されたメソッドを持つ抽象クラスを持ち、バニラ クラス (基本クラス) と他のクラスにそれを継承させることの何が問題になっていますか?

  4. 最後に、基本クラスを拡張するのではなく、実装するインターフェイスを強制する必要がありますか?

于 2009-08-29T03:45:56.647 に答える