Spec概念
specification是用来描述一份代码的方法的一些具体信息的,有了这些信息才能更有利于团队成员合作构建代码。团队成员相互之间了解彼此代码的信息才能更好的相互利用。specification
不仅给我们程序确定了责任(我们需要编写怎样的程序),也同样给客户端确定了责任(他们需要遵守怎样的输入原则,输入怎么样的数据等等)。
如何写Spec
- pre-condition and post-condition:前置条件通过“requires”描述,前置条件是对客户端的约束,在使用方法是必须满足的条件。后置条件通过“effects”描述,后置条件是对开发者的约束,方法结束时必须满足的条件。如果前置条件满足,则后置条件必须满足。如果前置条件不满足,则方法可做任何事情。
- Document:这部分为当前方法的注释:
- 方法的目的,是用来做什么的
- @param:输入的参数
- @return:方法的返回值
- @throws:这个方法中可能抛出的异常(checked and unchecked)
- thread safety issues:线程安全的策略。
Spec的强度比较
- 前置条件越弱,规约强度越强;
- 后置条件越强,规约强度越强;
- 规约越强,开发者责任越重,客户端责任越轻;
- 某个具体实现,若满足规约,则落在其范围内;否则,在其之外。
- 程序员可以在规约的范围内自由选择实现方式;
- 更强的规约,表达为更小的区域;
一个好的Spec应该是:
- 内聚的:Spec描述的功能应单一、简单、易理解。规约做了两件事,所以要分离开形成两个方法。
- 信息丰富的:不能让客户端产生理解歧义。
- 足够“强”:太弱的spec,客户不放心。开发者应尽可能考虑特殊情况,在post-condition给出处理措施。
- 足够“弱”:太强的spec,在很多特殊情况下难以达到,给开发者增加了实现的难度。