-->

一个好的设计按合同库的Java? [关闭](A good Design-by-Contract

2019-06-24 19:04发布

几年前,我做了DbC的包的调查为Java,和我完全没有对任何人满意。 不幸的是我没有一直在我的调查结果做好笔记,我认为事情已经改变。 会有人照顾,比较和Java对比不同DbC的包?

Answer 1:

有一个很好的概述维基百科有关契约式设计 ,在最后有关于部分与第三方支持库语言 ,其中包括Java库的一个很好的系列。 大多数这些Java库都是基于Java的断言。

在这种情况下,你只需要前提条件检查也有一个轻量级的验证方法参数的解决方案,在SourceForge下的Java参数验证 (纯Java实现)。

根据您的问题,也许是椭圆形框架,为字段/属性约束验证是一个不错的选择。 该框架允许您将限制在所有种类的不同形式(注解,POJO,XML)。 通过创建POJO或脚本语言(JavaScript的,Groovy中,BeanShell中,OGNL,MVEL)客户限制。 它也实现了党的契约式编程 。



Answer 2:

谷歌有一个叫做开源库为Java合同 。

对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 

合同为Java 。



Answer 3:

我测试了Contract4J的一个时间,发现它可以使用,但并不完美。 您正在创建并后的方法调用和invars在全班合同。

该合同作为用于该方法的断言创建。 问题是,合同本身是写在一个字符串,所以你不要有合同支持IDE或编译时cheching如果合同仍然有效。

的链接库



Answer 4:

它是因为我已经看了这些很长一段时间,但发现了一些旧的链接。 一个是为JASS 。

我已经使用(喜欢)另一种是通过iContract可靠的系统。 它有,你会运行预处理器的Ant任务。 不过,我似乎无法与一些谷歌搜索找到它,它看起来像它已经消失了。 原来的网站现在是一个链接农场。 看看这个链接了一些可能的方法来得到它。



Answer 5:

有使在Groovy / Java代码通过合同(TM)设计了一个Groovy扩展- GContracts 。 它采用所谓的封批注指定类不变量,前置和后置条件。 例如可以在项目的GitHub的wiki上找到。

主要优点:它是唯一没有外部依赖单一的罐子,它可以通过兼容的Maven仓库自被放置在解决中央Maven回购 。



Answer 6:

我强烈建议你考虑了Java建模语言( JML )。



Answer 7:

如果你想为你的表达合约简简单单的基本支持,对valid4j看看(Maven的中央发现的org.valid4j:valid4j)。 它可以让你表达使用常规hamcrest,匹配器在明码您的合同(没有注释,也没有评论)。

对于条件和结束条件(基本上断言 - >投掷的AssertionError):

import static org.valid4j.Assertive.*;

require(inputList, hasSize(greaterThan(0)));
...
ensure(result, lessThan(4.0));

如果你不喜欢默认的全球政策(投掷的AssertionError),valid4j提供了一个定制的机制,它可以让你提供自己的org.valid4j.AssertiveProvider的。

链接:

  • http://www.valid4j.org/
  • https://github.com/helsing/valid4j


Answer 8:

我建议的一些工具的组合:

  • Java的assert condition...或者是更高级的Groovy的表弟,番石榴的Preconditions.checkXXXX(condition...)Verify.verify(condition...)或者就像一个图书馆AssertJ ,如果你需要的仅仅是做简单的检查在你的“主”或“测试”代码

  • 你会得到更多的功能与类似的工具椭圆形 ; 它可以检查两个对象以及方法的参数和结果,你也可以手动触发检查(如对UI显示验证错误被称为方法之前)。 它可以理解,例如从JPA或现有注释javax.validation (如@NotNull@Pattern@Column ),也可以编写内联的约束等@Pre(expr="x >= 0 && x <= y") 。 如果注释@Documented ,支票也将在Javadoc中可见(你不必有形容他们为好)。

  • 椭圆使用反射,它可以使性能问题,并在Android这样一些环境等问题; 那么你应该考虑像工具谷歌的Cofoja ,具有较少的功能,而是取决于反射在编译时注释处理工具



Answer 9:

我认为很多DbC的文库通过内置的断言关键字,因为Java 1.4中引入了surclassed:

  • 它是一个内置的,不需要其他图书馆
  • 它的工作原理与传承
  • 你可以激活/停用包的基础上
  • 易重构(例如没有在评论断言)


Answer 10:

我个人认为,目前可用在DBC库都留下了很多有待改进,没有我看着与Bean验证API发挥出色的库。

我看了看已经被记录在案的图书馆这里

Bean验证API有很多来自DbC的概念了一圈。 在某些情况下,Bean验证API不能像简单的POJO的(非CDI托管代码)可以使用。 IMO周围的Bean验证API一个想到的包装应该足够了。

我发现,现有的图书馆是一个有点棘手加入到给定的,他们要么通过AOP或字节码仪器仪表实现现有的Web项目。 可能与Bean验证API的出现,这种复杂性来实现DbC的是没有根据的。

我也记录了我的咆哮在这个职位 ,并希望建立它利用在Bean验证API一个小型图书馆



文章来源: A good Design-by-Contract library for Java? [closed]