spec基本概念
"spec" 表示 "Specification",即规格、规约、规范的意思。在软件构造中,Specification 是指用于描述软件系统行为和功能的形式化规范,是软件工程中非常重要的概念。
软件的功能和特性是由需求定义和规格化描述的。需求定义阶段通常由需求分析师或系统分析师开展,他们与客户/用户合作,了解他们的需求和期望。在此过程中,需要详细定义软件应该实现的具体功能,以及软件在不同情况下的行为。
spec格式:每一个类或者方法的前面
spec组成与分类
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。
行为等价性
行为等价(Behavioral equivalence),即不同的代码实现,对于用户来讲,是否是等价的,即相对于提供的同一个spec,是不是都被满足了,如果都满足那么就算做等价。所以重点就是要站在用户端看待问题,只要同一个spec被满足,则说明实现了相同的功能,即同一个spec所有实现是等价的。
行为等价性可以被视为一种黑盒测试技术,其中测试人员将计算机程序的输入和输出(包括程序的界面,数据库操作和整个程序的行为)与其他实现进行比较,以检查不同实现之间的一致性和一致性,从而找出系统中的缺陷或错误。如果两个或更多程序实现产生同样的输出,那么它们是行为等价的。
spec的强弱的判断和比较方法
前置条件越弱,一方面,对于用户更加的友好,其不用考虑太多的情况即可放心使用。另一方面,对于程序员的要求就越高,因为这意味着他需要考虑到更多的情况,使得程序员不能随便实现了。使得规约变强。
后置条件越强,对于用户来讲得到的信息越具体,这样就需要程序员使用更加具体的实现方式,限制了实现的手段,使得程序员不能随便实现了。使得规约变强。
值得一提的是一般客户不喜欢太强的前置条件,从而我们可以通过在后置条件抛出异常的方法,增强后置条件来使得spec的强度增强。
规约越强,实现的手段就越少,程序员实现的自由度就变少了,如果用椭圆来表示spec的话,那椭圆的面积就应该变小。所以我们在实现了一个规约之后,代码可以直接适用于比这个规约弱的规约,但是不再能适用于比这个强的规约了。