我正在考虑Java库的契约式设计,这就是我到目前为止在接口方面想出的方法。
用户可以调用executeContract,executeContract在调用'require‘之后调用invokeContract。确保在executeContract之后调用,以确保invokeContract返回的内容的正确性。
此代码也可用作回调方法(匿名内部类调用)。
你的想法是什么?这种设计是契约式的吗?,到目前为止,这有助于我编写可测试的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;
}发布于 2009-03-17 16:38:51
如果你正在寻找一个通用的解决方案,我推荐你使用。所有的前置/后置条件(@requires/@ensures)都可以在上面的注释中指定您希望检查的方法。据我所知,JML编译器(jmlc)将运行时断言插入字节码。
我相信ESC/Java2也有类似的功能,但我以前从未用过它。
发布于 2009-03-17 16:34:38
实际上,在这种情况下,您需要的是一种称为Template Method的模式。接口并不决定实现,而这正是您试图在executeContract()方法中实现的。
发布于 2009-03-17 17:37:43
你怎么知道实现这个方法的人会遵守你的executeContract规则(即在调用require之后再调用invokeContract )?答案是--你不需要。
最好将executeContract放在一个抽象类中,这样你就可以强制执行那个行为,如果你真的不想让人们改变那个行为,也许可以让它成为最终的。
如果executeContract只需要调用invokeContract和require,那么就没有必要公开它们。
我感到惊讶的是,要求和确保返回对象,因为它们听起来像是那种只返回布尔值的方法。事实上,除非你真的需要,否则返回对象通常是不好的。现在的情况是,实现这个的类的消费者可以得到任何东西,而不是到处做instanceof检查。
是否真的需要抛出ContractError
希望这能有所帮助。
https://stackoverflow.com/questions/654737
复制相似问题