0

コンポジションを使用する場合、オブジェクトがインターフェースのタイプでない場合、明示的に例外をスローする必要があります。

例は次のとおりです。

$myObject = new MyConcreteTypeA();

今、私のインターフェースはMyInterface.

$myObjectの型をチェックして、MyInterface使用する前に実装されていることを確認し、そうでない場合はエラーをスローする必要がありますか?

すなわち

if (! ($myObject instanceof MyInterface)) {
    throw new Exception('Invalid type');
}

それとも、これはただの手抜きですか?

4

2 に答える 2

1

$myObjectでは、使用する前に実装されていることを確認するために型をチェックし、実装されMyInterfaceていない場合はエラーをスローする必要がありますか? それとも、これはただの手抜きですか?

わざわざインターフェースを作成し、オブジェクトを期待するものがそのインターフェースを実装することも期待している場合は、はい、絶対にチェックして文句を言う必要があります。

あなたのアプローチをダックタイピングと対比してください。批評のセクションでは、2 つの無関係な方法の間の混乱について述べています。Python* の代わりに PHP で動作するように、彼らの例を適応させます。

press()メソッドを実装するクラスがアクションを実行することを期待する、Finger というクラスを簡単に作成できます。ただし、 Trousers というクラスもpress()メソッドを実装する場合があります。Duck Typing では、奇妙で検出が困難なエラーを防ぐために、開発者はメソッドの潜在的な使用法をそれぞれ認識しておく必要がありますpress()。たとえそれが自分が取り組んでいることと概念的に無関係であってもです。

ズボンを着用しようとするときにのみズボンを処理することが絶対に重要な場合press()は、そのチェックを行う必要があります. press()コードが ed を取得する限り、何が ed を取得するかを気にしない場合はpress()チェックを破棄できます。

* 元の例では、プロパティとメソッドを使用しています。Python のプロパティとメソッドは同じ名前空間を共有します。プロパティをメソッドとして使用しようとするとさらに悲惨なことになりますが、PHP には当てはまりません。

于 2012-12-17T18:34:11.907 に答える
-1

PHP は動的に型付けされているだけでなく、弱く型付けされています。特定のインターフェイスを実装することを確認することによって行っていること$myObjectは、言語に構造化された型付けシステムがないことを何らかの形で補うことです。やりたい場合は可能ですが、考慮すべきいくつかの問題があります。

  • 作成しているチェックは実行時に実行されるため、動的型付けから静的型付けに移行することはありません。つまり、チェックが失敗した場合でも、実行時に失敗します。
  • その哲学に一貫性を持たせたい場合は、コード全体にそのようなチェックを追加する必要があるかもしれません。次に、防御的なプログラミング スタイルに移行することを検討してください (注: 私はそのスタイルのファンです)。
  • また、 PHP タイプ ヒンティングを検討することもできます。
  • この種のチェックを行うことで、PHP の型哲学に反することになります

私の見解では、コード全体で均一な作業パターンを採用することが重要instanceofですis_a。PHP の型システムが適切ではない/安全でないと感じた場合は、次のことを検討してください。

  • 可能であれば、型システムが使いやすい別の言語 (Java や C# など) に切り替えてください。
  • PHPUnitValidators [*] を組み合わせて、コードの信頼性を高めるなど、追加のツールを利用してください。

HTH

[*] 免責事項: 私は Quanbit Research で働いています。

于 2012-12-17T19:03:23.377 に答える