这一节咱们转向关注“方法/函数/操做”是如何定义的,即讨论编程中的动词,规约。html
行为等价性就是站在客户端的角度考量两个方法是否能够互换java
参考下述两个函数:程序员
1 static int findFirst(int[] arr, int val) { 2 for (int i = 0; i < arr.length; i++) { 3 if (arr[i] == val) return i; 4 } 5 return arr.length; 6 } 7
8 static int findLast(int[] arr, int val) { 9 for (int i = arr.length - 1 ; i >= 0; i--) { 10 if (arr[i] == val) return i; 11 } 12 return -1; 13 }
findFirst
返回arr的长度,findLast
返回-1; findFirst
返回较低的索引,findLast
返回较高的索引。 static int findExactlyOne(int[] arr, int val) requires: val occurs exactly once in arr effects: returns index i such that arr[i] = val
两个函数附和同一个规约,故两者等价编程
【规约的结构】数组
【mutating methods(可变方法)的规约】app
规约评价的三个标准函数
【规约的肯定性】oop
肯定的规约:给定一个知足前置条件的输入,其输出是惟一的、明确的post
1 static int findExactlyOne(int[] arr, int val) 2 requires: val occurs exactly once in arr 3 effects: returns index i such that arr[i] = val
欠定的规约:同一个输入能够有多个输出测试
1 static int findOneOrMore,AnyIndex(int[] arr, int val) 2 requires: val occurs in arr 3 effects: returns index i such that arr[i] = val
未肯定的规约:同一个输入,屡次执行时获得的输出可能不一样;但为了不分歧,咱们一般将不是肯定的spec统必定义为欠定的规约。
【规约的陈述性】
举一个栗子:
static String join(String delimiter, String[] elements) effects : returns the result of adding all elements to a new : StringJoiner(delimiter) // Operational specs
effects:returns the result of looping through elements and alternately appending an element and the delimiter // Operational specs
effects: returns concatenation of elements in order, with delimiter inserted between each pair of adjacent elements // Declarative specs
【规约的强度】
举一个栗子:
1 static int findExactlyOne(int[] a, int val) 2 requires: val occurs exactly once in a 3 effects: returns index i such that a[i] = val
1 static int findOneOrMore,AnyIndex(int[] a, int val) 2 requires: val occurs at least once in a 3 effects: returns index i such that a[i] = val
1 static int findOneOrMore,FirstIndex(int[] a, int val) 2 requires: val occurs at least once in a 3 effects: returns lowest index i such that a[i] = val
【如何设计一个好的规约】
【是否使用前置条件】