前言:设计代码的前提是什么?自然是条件,我们只有知道了条件后,才可以着手去设计程序。那么对于我们的代码的条件,方法的规约,以及条件的强度有什么知识了?今天这篇微博就是说明我们在写代码的时候应该注意的这些说明性的东西。
目录:
1:方法的规约
2:前置/后置条件
3:欠定规约,非确定规约
4:陈述式,操作式规约
5:规约的强度及其比较
6:如何写出好的规约
方法的规约:我们先来看一段代码
public int getMax(List<Integer> list){
,,,,
return max;
}
这个代码是为了获取List 集合中最大的数,那么对于这个代码来说,需要检查的就是传入的参数是否是List集合,然后返回的参数是否是int型数据。所以我们一般需要在代码前加上一些注释的文字帮助使用者查看。针对上面的代码我们可以这么写。
/*
*Find the max number of list and return
*it
*@param list is list of number
*@return return the max number of list
*/
我们在代码中需要注明代码的各个性质,为什么要这样了,一是自己记不住自己写的东西,二是别人也看不懂你写的是什么东西。代码是你的一种设计决策,这个时编译器看的,但是这个注释就是一种决策,是给人看的。没有规约,那么就无从谈起代码了。
前置/后置条件:所谓前置条件就是对客户端的要求,使用代码的时候必须满足的要求;后置条件,对开发者的要求,在满足前置的条件下,开发者必须返回正确的结果,这里有个契约,就是如果前置条件满足了,那么后置条件就必须满足。在上面的例子中,我们就是为了在list中找到一个最大元素,那么前置条件是传入一个非空的list的集合,返回值就应该是这些数字中的最大值。对于这个问题,我们需要注意一点,就是尽量不使用可变的数据类型,避免使用可变的全局变量
规约强度及其比较:如果前置条件更弱,后置条件更强,那么说明这个条件比原来的条件更加强的,即现在的条件是原来条件的子集。例如:
static int find(int[] a,int val)
requires: val occurs at least once in a
effects :returns index i such that a[i]=val
static int find(int[]a ,int val)
requires: nothing
effects:return index i such that a[i]=val
显然第一个条件就是比第二个强的,那么我们就可以用第一个条件去替换第二个条件了。
如何写出好的规约:好的规约应该是简单的,明显的,易懂的,