首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >契约库(界面)设计思想?

契约库(界面)设计思想?
EN

Stack Overflow用户
提问于 2009-03-17 15:26:45
回答 3查看 561关注 0票数 1

我正在考虑Java库的契约式设计,这就是我到目前为止在接口方面想出的方法。

用户可以调用executeContract,executeContract在调用'require‘之后调用invokeContract。确保在executeContract之后调用,以确保invokeContract返回的内容的正确性。

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

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

代码语言:javascript
复制
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;

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-03-17 16:38:51

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

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

票数 1
EN

Stack Overflow用户

发布于 2009-03-17 16:34:38

实际上,在这种情况下,您需要的是一种称为Template Method的模式。接口并不决定实现,而这正是您试图在executeContract()方法中实现的。

票数 0
EN

Stack Overflow用户

发布于 2009-03-17 17:37:43

你怎么知道实现这个方法的人会遵守你的executeContract规则(即在调用require之后再调用invokeContract )?答案是--你不需要。

最好将executeContract放在一个抽象类中,这样你就可以强制执行那个行为,如果你真的不想让人们改变那个行为,也许可以让它成为最终的。

如果executeContract只需要调用invokeContract和require,那么就没有必要公开它们。

我感到惊讶的是,要求和确保返回对象,因为它们听起来像是那种只返回布尔值的方法。事实上,除非你真的需要,否则返回对象通常是不好的。现在的情况是,实现这个的类的消费者可以得到任何东西,而不是到处做instanceof检查。

是否真的需要抛出ContractError

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/654737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档