Java 合同设计库(接口)思想?
我正在研究Java库的契约式设计,这是我迄今为止在接口方面提出的 用户可以调用executeContract,executeContract在调用“require”后调用invokeContract。在ExecuteContact之后调用Sure,以确保InvokeContact返回的内容的正确性 此代码还用作回调方法(匿名内部类调用) 你的想法是什么?这是契约式设计吗?到目前为止,这有助于我编写可测试的Java代码Java 合同设计库(接口)思想?,java,design-by-contract,contract,Java,Design By Contract,Contract,我正在研究Java库的契约式设计,这是我迄今为止在接口方面提出的 用户可以调用executeContract,executeContract在调用“require”后调用invokeContract。在ExecuteContact之后调用Sure,以确保InvokeContact返回的内容的正确性 此代码还用作回调方法(匿名内部类调用) 你的想法是什么?这是契约式设计吗?到目前为止,这有助于我编写可测试的Java代码 public interface IContractHandler {
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;
}
实际上,在这种情况下,您需要的是一种称为a的模式。接口不确定实现,这是您在executeContract()方法中尝试执行的操作。实际上,在这种情况下,您需要的是一种称为a的模式。接口不决定实现,这是您在executeContract()方法中尝试执行的操作。如果您正在寻找通用的解决方案,我建议使用。所有前置/后置条件(
@requires/@requires
)都可以在要检查的方法上方的注释中指定。据我所知,JML编译器(jmlc
)将运行时断言插入字节码
我相信ESC/Java2具有类似的功能,但我以前从未使用过它。如果您正在寻找一个通用的解决方案,我建议您使用。所有前置/后置条件(
@requires/@requires
)都可以在要检查的方法上方的注释中指定。据我所知,JML编译器(jmlc
)将运行时断言插入字节码
我相信ESC/Java2具有类似类型的功能,但我以前从未使用过它。您如何知道实现此方法的人会遵守您的executeContract规则(即,它在调用require之后调用invokeContract)?回答-你没有 最好将executeContract放在一个抽象类中,这样您就可以强制执行该行为,如果您真的不希望人们改变该行为,可以将其设置为最终行为 如果invokeContract和require只需要由executeContract调用,则无需将它们公开 我很惊讶需要并确保返回对象,因为它们听起来像是只返回布尔值的那种方法。事实上,返回对象通常是不好的,除非您真的需要。现在的情况是,实现此功能的类的使用者可以得到任何东西,并且不想到处进行instanceof检查 真的需要抛出所有错误吗
希望这能有所帮助。您如何知道实现此方法的人会遵守您的executeContract规则(即在调用require之后调用invokeContract)?回答-你没有 最好将executeContract放在一个抽象类中,这样您就可以强制执行该行为,如果您真的不希望人们改变该行为,可以将其设置为最终行为 如果invokeContract和require只需要由executeContract调用,则无需将它们公开 我很惊讶需要并确保返回对象,因为它们听起来像是只返回布尔值的那种方法。事实上,返回对象通常是不好的,除非您真的需要。现在的情况是,实现此功能的类的使用者可以得到任何东西,并且不想到处进行instanceof检查 真的需要抛出所有错误吗 希望这有帮助