java - 按契约(Contract)库(界面)设计的想法?

标签 java design-by-contract contract

我正在研究 Java 库的契约(Contract)设计,这是我迄今为止在界面方面提出的想法。

用户可以调用executeContract,并且executeContract在调用“require”后调用invokeContract。 Ensure 在executeContract之后调用,以确保invokeContract返回的正确性。

此代码还可以用作回调方法(匿名内部类调用)。

你有什么想法?这是按契约(Contract)设计的吗?到目前为止,这有助于我编写可测试的 Java 代码。

public interface IContractHandler {

    /**
     * Execute contract will invoke the #invokeContract method.  In the execute method, 
     * check for the validity of the preconditions and the post conditions.
     * 
     * The precondition can be null.
     * 
     * @param    precondInput -  Precondition Input Data, can be null.
     * @return                   Post condition output
     */
    public Object executeContract(final Object precondInput) throws ContractError;

    /**
     * Require that the preconditions are met.
     */
    public Object require(final Object precondInput) throws ContractError;

    /**
     * Ensure that the postconditions are met.
     */
    public Object ensure(final Object precondInput) throws ContractError;

    /**
     * The precondition can be null if the contract allows for that.
     * 
     * @param    precondInput -  Precondition Input Data, can be null.
     * @return                   Post condition output
     */
    public Object invokeContract(final Object precondInput) throws ContractError;

}

最佳答案

如果您正在寻找通用解决方案,我会推荐 Java Modelling Language 。所有前置/后置条件 (@requires/@ensures) 都可以在您要检查的方法上方的注释中指定。据我了解,JML 编译器 (jmlc) 将运行时断言插入字节码中。

我相信 ESC/Java2 具有类似的功能,但我以前从未使用过它。

关于java - 按契约(Contract)库(界面)设计的想法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/654737/

相关文章:

java - 实现颜色循环背景的最佳方式是什么?

java - Apache Camel 中 Camel Context 之间的同步通信

python - 在 Python 中使用契约式设计

racket - Racket 契约(Contract)依赖性评估两次?

c++ - 什么时候故意造成未定义的行为是公平的?

.net - 契约(Contract)要求与契约(Contract)要求

java - 使用 Java 进行面向对象设计 - 强制转换和比基类具有更多成员变量的派生类

language-agnostic - 我需要一个基本的具体示例来说明如何将 TDD 与按契约(Contract)设计一起使用

java - java 中的参数检查或契约设计 (GWT)。从哪儿开始?

Java使用正确对象的方法