7

私は Java のインターフェースの価値を知っており、理解しています。インターフェイスにコーディングすると、インターフェイスを使用してコードを変更することなく、実装を変更できます。多くの場合、「契約」という用語はインターフェースに関連して使用されます。私が理解している方法は、インターフェイスがアプリケーションと実装の間の「契約」を定義していることです。

したがって、実装を作成するときは、契約を履行する必要があります。私の質問は、私が履行しなければならない契約の内容は正確には何ですか?

明らかに、少なくともインターフェイスと同じシグネチャを持つメソッドを提供する必要があります。それ以外の場合、コードはコンパイルされません。「契約」ってそれだけ?もっとあるべきだと思われる。

たとえば、インターフェイスのテストと特定の実装のテストの価値、またはその両方を行うことの価値について議論している記事を読んだことがあります。どの入力がどのような出力を期待するかを知るために、インターフェイスのテストを行うことには大きな価値があると思います。これもインターフェースの「契約」の一部になるように思えます。インターフェイスのすべての実装は、同じ入力から同じ出力を生成する必要があります。明らかに、このコントラクトをコードで強制する方法はありませんが、テスト ケースを通じて強制することはできます。ここで私の考えは間違っていますか?

最後に、実装が持つ副作用についてはどうでしょうか? ここでは、主に、実装の一部として発生する可能性のある永続性について話しています。操作の実行中にいくつかのレコードを DB に保存する実装があるとします。これはどういうわけかインターフェースの「契約」の一部になるのでしょうか? もしそうなら、どのようにこの契約を強制することができますか? インターフェイス レベルからは、実装が実際に何をしているのかわかりません。私が知っているのは、入力を与えることと、テストできる出力が得られることだけです。発生する永続性も「出力」と見なされますか? もしそうなら、これをどのようにテストして実施できるかわかりません。私は持続性無知の支持者なので、何かを持続する必要があることはわかっていましたが、方法がわかりません。それは永続化されます。ですから、何かが実際にいつ持続したかを知る方法がわかりません。単純な CRUD 操作ができるインターフェイスなら簡単かもしれませんが、もっと複雑なインターフェイスについて考えてみたいと思います。

私の質問が理にかなっており、誰かが良いフィードバックを提供できることを願っています. これについては一般的に説明したいと思いますが、何について話しているのか明確でない場合は、具体的な例を示すことができます。

4

3 に答える 3

4

「コントラクト」と「インターフェース」の共通点は少ないと思います。

インターフェイスはドアのようなものです。ドアは典型的な人間を通過できますが、ゾウ、キリン、または車は通過できません。

契約とは、ドアを通って女性、男性、またはソフトウェア開発者だけが来ることを保証できる場合です。

したがって、コントラクトはBEHAVIORを定義し、インターフェイスは渡される情報を定義します

于 2012-03-30T18:11:29.783 に答える
2

あなたは「契約」という用語について大げさなことをしていると思います。

Eiffel」には、非常に具体的な「契約による設計」の哲学があります。個人的には、他の言語も同様のことから恩恵を受けると思います。

くだけた言い方をすれば、Java の「インターフェース」を「契約」と考えることができます。Java インターフェースの定義は確かに優れています。

少なくとも、インターフェイスと同じシグネチャを持つメソッドを提供する必要があります。それ以外の場合、コードはコンパイルされません。

Q: 「契約」はそれだけですか?

A: おそらく違います。それはすべて、「契約」をどのように定義するかによって異なります;)

しかし、私見ですが、Java インターフェイスは、C++ の「多重継承」の恐ろしさよりもはるかにクリーンな機能です。そして、両方の背後にある主な動機の 1 つは、" mixins " をサポートすることです。

同様に、Java インターフェースも、「コールバック」をサポートするための、クリーンで比較的単純な型保存ソリューションを提供します。

最後の提案: 「インターフェース」と「抽象クラス」の違いを考えてください。これにより、Java インターフェイスと、独自のコードでそれらを効果的に使用する方法についての追加の洞察が得られる場合もあります。

インターフェイス vs 抽象クラス (一般的なオブジェクト指向)

于 2012-03-30T18:09:02.560 に答える
0

したがって、コントラクトはメソッド シグネチャ + 関数/クラスに関連付けられたドキュメントです。ここからわかることは、インターフェースは java キーワードと同じ意味ではないということinterfaceです。インターフェイスとは、別のシステムと対話できるようにするものです。したがって、次のように宣言された関数の契約をどのように履行するかという問題に対して:

    /**  Throws IllegalArgumentException if s is null.    
Converts the input <b>s</b> into an {@link Integer}  */
    function go(String s);

次のように実装を記述する必要があります。

function go(String s)  
{  
    if(null == s) throw new IllegalArgumentException();  
    int i = Integer.parseInt(s);
}  

はい、不自然ですが、これは契約を実装し、それを遵守する方法を説明する必要があります。

于 2012-03-30T18:12:57.033 に答える