問題タブ [design-by-contract]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 契約。使用が必要
これが私の問題です。私は契約による設計の大ファンです。特に他の開発者が使用できるライブラリを開発するときに、この概念を使用しています。私はこれを行うための新しい方法を見つけました。それは:Contract.Requires
の代わりにException
:だから:の代わりに:
私は今持っています:
編集:私はデバッグモードでVS2010の下で働いています。
問題:ある場合でもContract.Requires
、何もしません!name
null
MSDNのドキュメントには次のように書かれています。
囲んでいるメソッドまたはプロパティの前提条件コントラクトを指定します。
ただし、条件が満たされない場合は何も指定されません。
また、例外をスローし、メッセージを表示する他の オーバーロードがあることに気づきました...しかし、それでは何のためにあるのでしょうか?Contract.Requires
Contract.Requires(Boolean)
以下の回答を編集して、APIのフルパワーを得るにはプラグインをインストールする必要があることを強調しましたが、Contract
異なるプラットフォームでコードを同じように動作させたいMonoユーザーはどうでしょうか?
java - クラスで開発者が間違ったことをするのを制限する必要がありますか?
私は、良い契約がどこで終わり、パラノイアが始まるのかを理解しようとしています. 本当に、私は良い開発者が何を気にかけ、何を省くべきなのかまったくわかりません:)
java.lang.Integer のような値を保持するクラスがあるとします。そのインスタンスは、他のオブジェクト (MappedObjects) (1 対多または多対多) によって集約され、MappedObjects のメソッド内でよく使用されます。パフォーマンス上の理由から、これらの関係を TreeMap (guava MultiMap は関係ありません) で追跡し、整数キーの範囲にバインドされた MappedObjects を高速に反復できるようにします。したがって、システムを一貫した状態に保つには、MappedObject.bind(Integer integer) メソッドを変更して、次のように Map を更新する必要があります。
この最終メソッドを使用して抽象 MappedObject クラスを作成し、他のメソッドを強制的に継承させることもできますが、それは失礼です。メソッド bind() を使用して MappedObject をインターフェイスとして定義し、スケルトン実装を提供する場合、他の開発者は後でそれをオブジェクトに含め、Map を更新せずに自分でメソッドを実装するのを忘れる可能性があります。
computer-science - このステートメントはクラス不変条件と見なすことができますか?
これは非常に一般的な考えですが、この例では C# を使用しましょう。
とすれば
- 私は使い捨てクラスを持って
Foo
います。つまり、実装していますIDisposable
。 Foo
が呼び出されるまでfalseであるブールフラグdisposed
を持ち、その後はtrueになります。Dispose
Foo
throwsのすべての public メソッドは、呼び出されたときにtrueのObjectDisposedException
場合。disposed
この発言は
Foo
を除くのすべてのメソッドは、破棄された のインスタンスで呼び出されたときにDispose
をスローします。ObjectDisposedException
Foo
の不変量をFoo
記述する
python - Python でのコントラクトによる設計の使用
私は職場で多数の Python ベースのプロジェクトで DBC の使用を開始しようとしていますが、他の人が DBC でどのような経験をしたのか知りたいと思っています。これまでのところ、私の調査では次のことがわかりました。
- http://www.python.org/dev/peps/pep-0316/ - 延期された Python の契約による設計を標準化することになっている PEP 316。この PEP は、docstring の使用を提案しています。
- http://www.wayforward.net/pycontract/ - Python のコントラクト。これは、docstring を使用した完全なフレームワークですが、メンテナンスされていないようです。
- http://www.nongnu.org/pydbc/ - メタクラスを使用してコントラクトを実装する PyDBC。また、数年間メンテナンスされていません。
私の質問は、Python で DBC を成熟した製品コードに使用したことがありますか? どれくらいうまくいきましたか/努力する価値がありましたか? どのツールをお勧めしますか?
design-by-contract - RESTful Web サービスを使用したコントラクトによるコーディング方法
当社では、ベスト プラクティスとして、Contract-First アプローチを使用して Web サービスを作成しています。
WSDL は、実装が検討される前に定義されます。
RESTを使用してそのようなアプローチを使用することは可能ですか? XSD を使用することを考えていましたが、呼び出しは通常 XML ではありません。では、機械が解釈できる方法でコントラクトを指定するにはどうすればよいでしょうか。
java - 契約による設計では、どのような前提条件が適切ですか?
Student
次のコンストラクターを持つクラスがあると仮定します。
間違っている場合は訂正してください。ただし、この例では、可能な入力値に(かなり静的な)制約を指定し、それらが満たされない場合は一般的な未チェックの例外を発生させることで、契約パラダイムによる設計に従いました。
現在、入学番号で索引付けされた学生のリストを管理するバックエンドクラスがあります。このマッピングを保存するためのを保持し、次のメソッドMap<Integer, Student>
を介してアクセスを提供します。addStudent
ここで、この方法に「同じ入学番号の学生がデータベースにすでに存在していてはならない」などの制約があると仮定します。
これを実現する方法には2つの選択肢があります。
オプションA
同じ母校の生徒UniquenessException
が育てたカスタムクラスを定義します。addStudent
番号はすでに存在します。呼び出しコードは次のようになります。
オプションB
要件を前提条件として記述しIAE
、それが成り立たない場合は単にを上げます。さらに、失敗するcanAddStudent(Student stud)
かどうかを事前にチェックする方法を提供します。addStudent
コードを呼び出すと、次のようになります。
オプションAは、少なくとも次の理由から、ソフトウェアエンジニアリングの観点からははるかにクリーンだと思います。
- 呼び出し元のコードを変更せずに、簡単にスレッドセーフにすることができます(正確な問題を説明しているように見えるTOCTTOUを教えてくれたVooに感謝します)
したがって、私は疑問に思います:
- さらに優れた3番目のオプションはありますか?
- オプションBには、私が思いもよらなかった利点がありますか?
- 契約の観点からの設計から、オプションBを使用し、
addStudent
メソッドの前提条件として一意性を定義することは実際に許可されますか? IAE
前提条件を定義して単純に発生させる場合と、「適切な」例外を使用する場合の経験則はありますか?「システムの現状に依存しない限り、前提条件にする」というのもそういうルールかもしれないと思います。より良いものはありますか?
更新:別の良いオプションがあるようです。それはpublic boolean tryAddStudent(...)
、例外をスローせず、代わりに戻り値を使用してエラー/失敗を通知するメソッドを提供することです。
unit-testing - 契約による設計、テストに適したコードの記述、オブジェクトの構築、および依存関係の挿入をまとめたベスト プラクティス
私は、テストに適したコードを書くためのベスト プラクティスを見つけようとしていますが、より具体的には、オブジェクトの構築に関連するプラクティスを見つけようとしています。ブルーブックでは、エンティティや値オブジェクトなどの破損を回避するために、オブジェクトを作成するときに不変条件を適用する必要があることを発見しました。これに従うと、次のようなコードを書くことになります。
まあ、これは一見良さそうですよね?オブジェクトが作成されるたびにCar
、オブジェクトが「有効」であることを確認できるように、必要なコントラクトを公開する安全なクラスを構築しているようです。
では、テスト主導の観点からこの例を見てみましょう。
テストに適したコードを作成したいのですが、オブジェクトを分離してテストできるようにするには、Car
オブジェクトを作成するためだけに、依存関係ごとにスタブまたはダミー オブジェクトのモックを作成する必要があります。メソッドのように、これらの依存関係の 1 つだけを使用するStartEngine
メソッド。Misko Hevery のテスト哲学に従って、コンストラクターに null 参照を渡すだけの Door または Wheel オブジェクトを気にしないことを明示的に指定するテストを書きたいと思いますが、null をチェックしているので、それを行うことはできません。
これはほんの小さなコードですが、実際のアプリケーションに直面すると、サブジェクトの依存関係を解決する必要があるため、テストを書くのはますます難しくなります。
Misko は、コード内で null チェックを悪用するべきではないと提案しています (これは Design By Contract に反します)。それを行うと、テストを書くのが苦痛になります。別の方法として、彼は次のように述べています。私たちのコードは、どこにでもヌルチェックがあるという理由だけで安全です。」
これについてどう思いますか?どのようにしますか?ベストプラクティスは何ですか?
design-by-contract - ACSLの事後条件における\oldの意味
私はFrama-Cの初心者ユーザーであり、ポインターに対するアサーションに関していくつか質問があります。
以下のCフラグメントについて考えてみます。
- 2つの関連するデータ構造DataとHandle、stHandleにはDataへのポインターがあります。
- いくつかの架空の操作が完了したかどうかを示すデータの「状態」フィールド
- 3つの関数:init()、start_operation()、wait();
- 上記を使用し、6つのアサーションを含むmain()関数(A1-A6)
さて、なぜA5とA6はWPベリファイア( "frama-c -wp file.c")でアサートできないのですか?start_operation()の最後の "ensures"句のために保持されるべきではありませんか?
私は何が間違っているのですか?
一番、
エドゥアルド
c# - 契約による設計、および一般的な例外
私は、NUnit のAssert
. 理想的には、式を渡し、それが true かどうかを確認し、そうでない場合は、パラメーターまたはエラー メッセージと共に特定の例外をスローします。理想的な世界では、私は次のようなことをしています:
さて、私の問題は、目的のタイプの新しい例外を作成するために、の制約が にAssert.True<T>
なることです。Exception, new()
私が直面している重要な問題は、まずジェネリック コンストラクターがパラメーターを許可しないことと、Exception
コンストラクターのほとんどのプロパティが GET のみであることです。
どんな助けでも大歓迎です、ありがとう。
r - Rで関数の前提条件と事後条件をチェックして文書化する慣用的な方法は何ですか?
Rで関数の前提条件と事後条件をチェックして文書化する慣用的な方法は何ですか?Eiffel
ここでは、の組み込みrequire
とensure
構築、またはD
の最先端のブロックを検討しますが、ほとんどの言語にはこれらが組み込まれていないため、それらを近似するためのベストプラクティスが開発されていin
ます。out
前提条件をチェックするということは、関数の仮定を満たさないデータが渡された場合に、ある種のランタイム例外をスローすることを意味します。現在stopifnot
、関数の開始時に考えられるすべての前提条件に対するステートメントがあります。同じことが事後条件にも当てはまりますが、パラメーターではなく戻り値に関してです。
さらに、これらの前提条件と事後条件が何であるかを文書化する標準的な方法はありますか?たとえば、JavaのJavaDocコメントでこれらを詳しく説明するのはかなり標準的です。
この点でRのベストプラクティスは何ですか?