- 规约内容
输入/输出的数据类型
功能和正确性
性能
不包括实现细节
有时包括一些异常处理 - 行为等价性:两个方法是否可以相互替换
站在客户端视角看行为等价性
根据规约判断是否行为等价。 - 规约的前置条件和后置条件
1)前置条件输入requires:对客户端约束,使用时满足的条件
后置条件输出effects:对开发者约束,方法结束时必须满足的条件
2)如果前置条件满足了,则后置条件必须满足
如果前置条件不满足,方法可做任何事情。 - java中规约和代码分开两个文件
- 注意
1)除非规约必须如此,否则不应该修改输入参数
2)尽量避免使用mutable对象
6.如何比较两个规约,以判断是否可以用一个规约替换另一个?
前置条件更弱,后置条件更强的规约更强,可以替换另一个规约
更强的规约在diagram中表示为更小的区域
7.写规约的一些规则
1)内聚的
Spec功能单一,简单,只做一件事。两件事要分为两个方法
- 信息丰富
不能让客户端产生歧义 - 足够强
- 也要适当弱
例如打开文件,不能说一定打开文件,要说什么时候能打开,打不开会发生什么。 - 在规约里尽量使用抽象类型
如使用list不强调arraylist等具体实现。 - precondition or postcondition?
取决于
(1)检查参数合法性代价有多大
代价小就不要给precondition
(2) 方法的适用范围
只在类内部(Private) 不precondition,在使用该方法的地方check
在其他地方使用(Public) 必须precondition 不满足就抛出异常