2009-07-02 9 views
45

数年前、私はJava向けのDbCパッケージの調査を行いましたが、私はそれに完全に満足していませんでした。残念ながら、私は自分の所見に良いメモを残さなかったし、物事が変わったと思う。誰もJava用の異なるDbCパッケージを比較し対比することに気を配っていますか?私は多くのDBCライブラリはJava 1.4以降に導入組み込みアサートキーワードでsurclassedたと思いJava用の優れたDesign-by-Contractライブラリですか?

答えて

22

WikiPedia about Design by Contractの概要があり、末尾にはlanguages with third party support librariesに関するセクションがあり、これにはJavaライブラリの素敵なシリーズが含まれています。これらのJavaライブラリのほとんどは、Javaアサーションに基づいています。

Precondition Checkingのみが必要な場合は、(Plain Javaの実装)のSourceForgeでは、軽量のソリューションもあります。

問題に応じて、フィールド/プロパティの制約の検証のためにおそらくOValフレームワークが適しています。このフレームワークでは、すべての種類の異なるフォーム(注釈、POJO、XML)で制約を配置できます。 POJOまたはスクリプト言語(JavaScript、Groovy、BeanShell、OGNL、MVEL)を使用して顧客の制約を作成します。また、パーティーにはProgramming by Contractが実装されています。

+0

私は、JavaのDbCが得ることができるほど良いと言っています。 –

+8

私はここのコメントが最良の場所/方法だとは思っていませんが、次のものについて読むだけです:[Contracts for Java - cofoja](http://code.google.com/p/cofoja/)は最近のGoogleの20%の時間の研究から直接追加。 – superjos

0

  • が、それは組み込みで、他のライブラリが
  • を必要としない、それは継承で動作します
  • ます(コメント欄に例えば何のアサーション)パッケージごとに無効/
をリファクタリングに簡単に
  • を活性化させることはできません
  • +4

    のコンパイル時注釈処理ツールに依存するが、日がHTTPで「publicメソッドのパラメータをチェックするアサーションを使用しないでください」書き込みGoogle's Cofojaのようなツールを、検討すべきです://java.sun.com/javase/6/docs/technotes/guides/language/assert.html –

    +4

    さらに、DbCは契約にコードを簡単に追加できるようにする必要があります。簡単ではない場合、ほとんどの開発者はそれをしません。アサーションとクラス不変メソッドの呼び出しを使用してクラス不変式を実装することは可能ですが、不器用です。 –

    2

    私はcontract4Jを一度テストし、それが使用可能だが完全ではないことを発見しました。 forメソッド呼び出しとafterメソッド呼び出しのためのコントラクトを作成し、クラス全体のinvarsを作成しています。

    契約は、メソッドのアサーションとして作成されます。問題は、契約自体が文字列で書かれているため、契約のIDEサポートを受けていないか、または契約がまだ機能していればコンパイル時の嫌なことです。

    library

    2

    へのリンク私はこれらを見てきましたので、長い時間があったが、いくつかの古いリンクを見つけています。 1つはJASSです。

    私が使用した(そして好きだった)もう1つは、Reliable SystemsのiContractでした。これは、あなたがプリプロセッサとして実行するantタスクを持っていました。しかし、私はいくつかのGoogleの検索でそれを見つけることができない、それは消えたように見えます。元のサイトは現在、リンクファームです。いくつかの可能な方法については、this linkをご覧ください。

    +0

    JASSの最新版は2005年7月からのものです。サポートしているJDKのバージョンについては推測しません。 JASSはJMLへのリンクを持っていますが、これは積極的な開発の下にあるように見えます。 –

    1

    Javaモデリング言語(JML)を検討することを強くお勧めします。

    2

    Groovy/JavaコードでDesign by Contract(tm)を有効にするGroovy拡張機能があります - GContracts。これは、いわゆるクロージャーアノテーションを使用して、クラス不変量、事前条件および事後条件を指定します。例はプロジェクトのgithub wikiにあります。

    主な利点:外部依存関係のない単一のjarだけで、the central Maven repoに配置されているため、Maven準拠のリポジトリで解決できます。

    +0

    GContractsはGroovy Closuresを大量に使用しているので、私はJavaプロジェクトでGContractsを使用することはできません。 – Sudarshan

    +0

    それはGroovyのみのライブラリです。 –

    6

    Googleには、contracts for javaというオープンソースライブラリがあります。

    契約は、私たちの新しいオープンソースツールです。前提条件、 事後条件、および不変条件は、アノテーション内にJavaブール式 として追加されます。デフォルトでは何もしませんが、JVM 引数で有効になり、実行時にチェックされます。

    • @Requires, @Ensures, @ThrowEnsures and @Invariant specify contracts as Java boolean expressions 
    • Contracts are inherited from both interfaces and classes and can be selectively enabled at runtime 
    

    contracts for java

    0

    私は個人的には現在利用可能なDbCライブラリがたくさん残っていると思っています。見たライブラリのどれもがBean Validation APIでうまくいっていません。私が見

    ライブラリがhere

    を文書化されているビーン検証APIは、DbCのからの概念をラップの上にたくさん持っています。場合によっては、単純なPOJO(非CDI管理コード)のようにBean検証APIを使用することはできません。 IMOでは、Bean Validation APIに関する考え方のラッパーで十分です。

    既存のライブラリは、AOPまたはバイトコードのいずれかのインスツルメンテーションで実装されているため、既存のWebプロジェクトに追加するのはややこしいことがわかりました。たぶん、Bean Validation APIの出現により、DbCを実装するためのこのような複雑さは不当です。

    私はあなたの契約を表現するための無地でシンプルな基本的なサポートが必要な場合は、valid4jに見ても、このpostで私の暴言を文書化し、ビーン検証APIに

    0

    を活用小さなライブラリを構築したいと考えています(org.valid4j:valid4jとしてMaven Centralにあります)。通常のhamcrest-matchersをプレーンコード(注釈やコメントなし)で使用して契約書を表現することができます。事前条件と事後条件については

    (基本的に表明 - >投げてAssertionError):

    import static org.valid4j.Assertive.*; 
    
    require(inputList, hasSize(greaterThan(0))); 
    ... 
    ensure(result, lessThan(4.0)); 
    

    デフォルトグローバルポリシー(AssertionErrorがを投げる)に満足できない場合は、valid4jはあなたがあなた自身を提供しましょうカスタマイズメカニズムを提供しますorg.valid4j.AssertiveProviderの実装です。

    リンク:

    +0

    誰かがこれについての比較のスプレッドシートを手に入れましたか?フィーチャマトリックスは素晴らしいでしょう。 –

    +0

    valid4jは、完全なDBCツール(OValやCofojaのような)ではなく、(Javaの普及しているAssertJやGroovyの先進的なアサートのように)アサーションライブラリに似ています。 – iirekm

    1

    私はいくつかのツールの組み合わせをお勧めします:

    • Javaのassert condition...またはそれは、より高度なGroovyのいとこだ、グアバのPreconditions.checkXXXX(condition...)およびVerify.verify(condition...)のようなライブラリやAssertJのようなライブラリの場合は、「メイン」コードまたは「テスト」コードで単純なチェックをするだけでよい場合は、OValのようなツールを使用して多くの機能を利用できます。メソッドの引数と結果の両方と同様にオブジェクトをチェックできます。手動でチェックを開始することもできます(メソッドが呼び出される前にUIで検証エラーを表示するなど)。 JPAやjavax.validation@NotNull@Pattern@Columnなど)などの既存のアノテーションを理解したり、@Pre(expr="x >= 0 && x <= y")のようなインライン制約を記述することができます。アノテーションが@Documentedの場合、チェックはJavadocsでも表示されます(あなたもそこに記述する必要はありません)。

    • OValはリフレクションを使用するため、Androidなどの一部の環境でパフォーマンスの問題やその他の問題が発生する可能性があります。あなたは以下の機能を持っているが、その代わりに反射

    関連する問題