7

私はphpで働いていますが、インターフェースの概念はここでは少し役に立たないようです。読んでみると、インターフェースは「契約による設計」の一部であることがわかりますが、少なくとも特定の種類の型の戻りを保証することなく、実際には契約はありません。「私たちは次のことを行うことに同意します:」という契約書のように思えます -- 契約条件はありません。

オブジェクトがメソッドを持っていることを保証したい場合、インターフェイスが特に役立つとは思えません。オブジェクトにないメソッドを呼び出そうとすると、致命的なエラーが発生するため、そのクラスにはその名前のメソッドがないことがすぐにわかります。スマートになりたい場合は、クラスにメソッドがあるかどうかを事前に確認してから、インターフェイスを確認し、オブジェクトがそのインターフェイスを実装しているかどうかを確認しても、そのオブジェクトを直接確認するよりも時間を節約できないようです (私ならそうします)。とにかく、実装したかどうかに関係なく、クラスにそのメソッドがあるかどうかを確認します)。

つまり、特定の名前を持つ一連のメソッドを持っているからといって、特定の動作が保証されるわけではありません。特定の型の変数が返されることが保証されている場合、少なくとも出力がどうなるかについてある程度の理解があり、そのインターフェイスでオブジェクトを使用するコードを書くことができます。それの。文字列が返された場合、少なくとも後で文字列出力を処理しているという確信を持ってコーディングを続けることができます。したがって、戻り値の型が指定されている場合、少なくともいくつかの動作が保証されます。動作を保証することは、インターフェースの目的の一部ですか、それともありませんか?

私が考えることができる唯一のことは、コードを書いているとき、後でそのクラスを書くときに特定のメソッドを確実に作成するための付箋として役立つということです。コードを書いているときの足場のように思えます。実際に使ってみるとあまりメリットがありません。したがって、クラスを作成するときよりも、クラスを作成するときに標準を維持することが重要です。この利点は、契約による設計の概念に実際には反映されていないようです。

PHP のような動的/型指定の緩い言語でインターフェースを使用することで、実際にどのような利点が得られますか? それらは素晴らしいものですか、それともより堅牢な OO 言語が実装するものなので、PHP も実装しますか?

4

4 に答える 4

3

インターフェイスは、オブジェクトがメソッドを実装することを実際に期待するときに使用されます。

たとえば、DB ラッパーを構築していて、ブートストラップに自分自身を登録する動作をサポートしている場合、動作 (sluggable など) を実行する前に、以下を使用して「DB_Wrapper_Behaviour_Interface」が実装されていることを確認します。

if(!($behaviourObject instanceof DB_Wrapper_Behaviour_Interface)) {
    throw new Exception("Your behaviour doesn't implement my interface");
}
于 2010-08-25T16:28:59.900 に答える
1

コントラクトによる設計は、戻り値の型がないとより難しくなりますが、「尋ねる」よりも「伝える」ことを優先することを忘れないでください。

インターフェイスは責任のようなものだと思います。あなたはコーディング中で、協力者が必要です。作業中のコードがすべてを実行できるわけではないため、何かを実行するように依頼します。つまり、別のオブジェクトに何かをするように依頼しています。インターフェイスは共同作業者が仕事をすることを保証しますが、「どのように」それが行われたかを隠します。

ここで、正式な契約は必要ないと主張することができます。協力者があなたが求めていることを実行できない場合でも、システムはエラーをスローするからです。しかし、それはインターフェイスを責任として使用するという点を見逃していると思います。

于 2010-08-25T18:19:17.640 に答える
0

PHP5.4は型ヒントをサポートすることに注意してください。今のところ、関数の引数には型ヒントしかないのではないかと思いますが、戻り値にもあると思います。(少なくともRFCはすでに存在しますが、非常に古くて時代遅れのものです。)

于 2010-08-25T16:45:05.670 に答える
0

致命的なエラーが発生することは、必ずしも「簡単」ではありません。クラスに何かが実際に欠けていることを確認するために、特定のモジュール/アクションに進む必要がある場合があります。インターフェイスを使用すると、すべてのメソッドが実装されていることを確認し、これらのメソッドを文書化できます (パラメーターが正確にどうなるか、戻り値がどのように見えるか)。これは、パラメーター/値が特定の構造を持つ配列であり、代わりにクラスを使用したくない場合に便利です (単純化のため)。

于 2010-08-25T16:36:32.053 に答える