先週、サブクラスのメソッドを誤ってオーバーライドしてしまい、2 度噛みつきました。私は継承のファンではありませんが、職場のアプリケーションでこれを (ab) 使用しています。私がやりたいのは、メソッドが親メソッドをオーバーライドしていることを示すための宣言構文を提供することです。このようなもの:
use Attribute::Override;
use parent 'Some::Class';
sub foo : override { ... } # fails if it doesn't override
sub bar { ... } # fails if it does override
ここにはいくつかの問題があります。まず、メソッドのロードが何らかの理由で遅延した場合 (たとえば、AUTOLOAD を介してロードされたメソッドや、後でシンボル テーブルにインストールされたメソッド)、これはそれらのメソッドを検出しません。
継承ツリーのウォークも同様にコストがかかる可能性があります。Class::Sniffでこれを行いますが、コードの実行にはあまり適していません。継承ツリーをたどって、適切なシンボル テーブルに定義された CODE スロットがある場所を単純に一致させることができます。その方が高速ですが、メソッド キャッシュが無効になっている場合、それらの結果をキャッシュすると壊れてしまいます。
だから私は2つの質問があります.これは合理的なアプローチですか?メソッドキャッシュが変更されたかどうかを確認できるフックはありますか? (「perldoc perlobj」で「キャッシュ」を検索してください)。
もちろん、これは本番コードを壊すべきではありません.TEST_HARNESS環境変数がアクティブな場合にのみ失敗するか警告することを考えています(本番コードがTEST_HARNESSを設定する場合は、強制的に非アクティブにするための明示的な環境変数を持っています)何らかの理由で環境変数)。