2

私はいつもこの言葉contractを目にしますが、意味が違うように思えたり、少なくとも私にはそう見えるので (私は英語のネイティブ スピーカーではありません)、「契約」という言葉を見ると、何を理解して何を期待すべきか確信が持てません。それから。他の誰かが同じ問題を抱えているかどうかはわかりませんが、これは私を大いに悩ませています。例えば「インターフェース」と聞くと、「抽象化、依存性注入、継承など」を連想します。そして、自分が何を求めているかを知っており、それが頭の中でうまく簡単に形作られています。

しかし、言葉contractになると、パターンやクラスなど、それが何であれ視覚化できません。interfaceそれは、またはaclassまたはおそらくanattributeなどを使用して形成されたものですか.

たとえば、ここ(Json.NET 内) にクラスがあり、呼び出されたものについて話しIContractResolver、そのページが何に使用されるかが説明されています。

IContractResolver インターフェイスは、クラスに属性を配置することなく、JsonSerializer が .NET オブジェクトを JSON にシリアル化および逆シリアル化する方法をカスタマイズする方法を提供します。

説明は非常に分かりやすいですが、見たときにアイデアを形成することはContractできず、言うこともできません。

「ええと、これを行ういくつかのメソッドを期待しているので、それをオーバーライドして、後でこのクラスをあちこちで使用して、いくつかの機能を変更/実現します。」

これは私を大いに悩ませます。それについての記事を読んだことがありますが、彼らは契約による設計について話しているので、「契約」の意味に問題がある人にとっては役に立たないものです.

では、この用語をどのように理解すればよいか、またそれを見たときに何を期待すべきかを説明してもらえますか? 視覚化するために、サンプルコードを追加していただければ幸いです。

4

4 に答える 4

3

「Design by Contract」におけるコントラクトとは、ライブラリ(クラス、関数)の開発者と消費者との間の合意を意味します。

null特定のパラメーターについて誰も合格しないという合意になる可能性があります。特定のメソッドが常に 200 ミリ秒未満で完了するという合意が成り立つ場合があります。または、オブジェクトを作成したスレッドでイベントが発生します。重要なことは、ルールでいっぱいのドキュメントがあり、呼び出し元と関数の両方がそれらのルールに同意していることです。

IContractResolverデータ形式を提供しているようです。契約ではありません。(通信の両方のエンドポイントが特定のメッセージにこの形式を使用するというコントラクトがある場合がありますが、形式自体は完全なコントラクトではありません。コントラクトでは、各メッセージをいつ送信する必要があるかなども記述する必要があります。 )

于 2013-04-09T23:27:39.503 に答える
3

契約は、少なくとも 2 つの当事者間の合意です。このコンテキストでは、.NET コントラクトは完全に理にかなっています。

コントラクトのコンテキストによる設計では、似ています。合意による設計では、インターフェイスといくつかの検証可能な義務について合意しています。

于 2013-04-09T23:28:56.353 に答える
2

契約はかなり広い用語ですが、いくつかの特定の意味があります。したがって、それを正しく理解するには、コンテキストを知っておく必要があります。一般的な定義は次のとおりです(ここから):

2 人以上の個人または当事者間の拘束力のある合意

次のように、どの操作が提供されるかについて合意することができます (部分的にprotocol同義) 。

サービス コントラクトは、サービスがサポートする操作を指定します。

または、どの形式のデータを渡す必要があるか ( here ):

データ コントラクトは、サービスとクライアントの間の正式な契約です。

またinterface、契約と呼ばれることもあります。これは、まさにそれであるためです。何をどのように呼び出すことができるかについての拘束力のある合意です。

データ駆動型開発におけるコントラクトは、どのデータを渡すことができるか、どのデータを返すことができるか、およびオブジェクトの有効な状態は何かについての合意でもあります。それは本質的に最初の引用と同じです: 2 つの異なるコード間の拘束力のある合意。

したがって、文脈がよくわからない場合は、常識を働かせるようにしてください。コンテキストに慣れていない場合は、理解しようとするか、次のように尋ねてください。

  • この場合、契約は何を定義しますか?
  • それはどのように定義されていますか?
  • 関与している当事者は何ですか?
于 2013-04-09T23:37:11.427 に答える
1

さて、契約は、文脈に応じて多くの意味を持つ負担のかかる言葉の 1 つです。

私にとって、これは 2 つの当事者間の合意であるため、.NET インターフェースの意味でのインターフェース (つまり型) である場合もあれば、当事者間で交換されるメッセージのセットとシーケンス (つまりプロトコル) である場合もあります。 JSONの例では、オブジェクトとその永続化されたフォームの間のマッピング。

必ずしもそうであるとは限らないため、「インターフェース」をより明確に言及することは興味深いことです。私はそれを抽象化、依存性注入、または継承 (特に最後のもの) と関連付けませんが、あらゆる種類のプロトコルとより大まかに関連付けます。おそらくその理由は、特定の意味を持ち、キーワードとして組み込まれたインターフェースを持たない言語 (例: C++) から始めたからでしょう。ポイントは、文脈にも依存するということです。

于 2013-04-09T23:28:28.510 に答える