软件构造心得(5)spec、RI、AF、A的概念辨析之spec
1.1spec基本概念:
spec,全称为specification,即规约,其规约的是使用者(client)和实现者(implementor)之间的妥协与契约,即是一种在使用时必须要遵循的要求的说明,也是一种在在实现时需要遵循的原则。
1.2spec一般被书写在:
(1)每一个类前面,(2)每一个方法前面
1.3spec组成与分类
spec从annotation上由@parameter、@throws、@return组成。完整的spec其需要涵盖若干对于前置条件和后置条件的说明,包括基本使用方法、immutable/mutable、类型限制、实用可能出现问题的情况的描述。
书写规范举例
/**
* Get the target vertices with directed edges from a source vertex and the
* weights of those edges.
*
* @param source a label
* @return a map where the key set is the set of labels of vertices such
* that this graph includes an edge from source to that vertex, and
* the value for each key is the (nonzero) weight of the edge from
* source to the key
*/
约定俗成的规矩是使用者需要在满足前置条件的情况下,才能得到正确的结果,
所以要求使用时需要认真阅读spec。当然出于程序员的良心,可能会帮client多考虑一些事情,或者是额外处理一些情况,或者是抛出相应的异常使其fall fast。
分类有确定的规约和欠定的规约。
1.4.1行为等价性
行为等价(Behavioral equivalence)意思是,
不同的代码实现,对于用户来讲,是否是等价的,即相对于提供的同一个spec,是不是都被满足了,如果都满足那么就算做等价。
所以重点就是要站在用户端看待问题,只要同一个spec被满足,则说明实现了相同的功能,即同一个spec所有实现是等价的。
不能单看代码的结果不一样就说两个实现是不等价的。
1.4.2spec的强弱的判断和比较方法
前置条件越弱,一方面,对于用户更加的友好,其不用考虑太多的情况即可放心使用。另一方面,对于程序员的要求就越高,因为这意味着他需要考虑到更多的情况,使得程序员不能随便实现了。使得规约变强。
后置条件越强,对于用户来讲得到的信息越具体,这样就需要程序员使用更加具体的实现方式,限制了实现的手段,使得程序员不能随便实现了。使得规约变强。
这里面值得注意的是,因为前置条件必须被满足,所以后置条件的比较是在前置假设成立的条件下进行的,在很多情况下,前置条件的限制使得后置条件从不同变为相同
规约越强,实现的手段就越少。所以我们在实现了一个规约之后,代码可以直接适用于比这个规约弱的规约,但是不再能适用于比这个强的规约了。
to be continued…
不要慌张,软件构造的概念有时候就是这么让人头秃…