1.AF(Abstraction function)
抽象函数是表示值到其对应的抽象值的映射——AF: R->A。
对于抽象函数来说,仅仅宽泛的说抽象域表示了什么并不够。抽象函数的作用是规定合法的表示值会如何被解释到抽象域。作为一个函数,我们应该清晰的知道从一个输入到一个输入是怎么对应的。
通俗来讲,就是介绍给其他人你的每一个变量在现实生活中(或该问题中)是什么。
例:
private final Set<L> vertices = new HashSet<>();
private final List<Edge<L>> edges = new ArrayList<>();
// Abstraction function:
// vertices为顶点的集合,edges为边的集合
2.RI(Representation invariant)
注明抽象值的合法区域。
说明合法/不合法的原因。
通俗来讲,就是介绍你的变量需要在什么范围内程序才可以正常运行,在RI中注明变量范围即可。
例(续接上文代码):
// Representation invariant:
// 顶点数>0;边数>=0
3.rep(Safety from rep exposure)
注明你使用了什么方式来尽量避免其他人对你进行安全方面的攻击。
例:
// Safety from rep exposure:
// 使用private final
在初始接触java的阶段,多数代码均通过使用private和final来减少程序被攻击的可能。
4.spec
在eclipse中,只需在某一个类或函数的前一行输入/**
然后按回车键,它会自动为你生成spec的框架。
在开始表明这个类或者函数实现的功能,对于类注明是mutable还是immutable类型;param为函数输入的变量,需对其进行解释;return后写明返回值。
例:
/**
* 若weight为0,且存在以source为起点,target为终点的边,则将其删除;若weight!=0,则
* 将以source为起点,target为终点的边的边权置为0。(若无该边则创建)
* @param source 起点的名字
* @param target 终点的名字
* @param weight 边权
* @return 若原本存在以source为起点,target为终点的边,则返回其原本的权重;若不存在
* 则返回0
*/
public int Set(L source,L target,int weight);
对于函数的内容我们就不进行具体展开了。写spec可以帮助我们在未来重新需要服用此功能时不需要重写大量代码,而可通过直接看spec得到函数的实质,直接复用即可。
5.Testing strategy
在此处需要以注释的方式写明你要通过什么方法对你的代码进行测试,其中一种可以针对每一个函数,写明你是怎么进行测试的(需要考虑代码覆盖度,一些极值点等问题)。
例:(此处仅进行简单举例)
// Testing strategy
// 测试add函数
// 先添加一个点,再添加一个点,检查返回值。