Spec概念

specification是用来描述一份代码的方法的一些具体信息的,有了这些信息才能更有利于团队成员合作构建代码。团队成员相互之间了解彼此代码的信息才能更好的相互利用。specification不仅给我们程序确定了责任(我们需要编写怎样的程序),也同样给客户端确定了责任(他们需要遵守怎样的输入原则,输入怎么样的数据等等)。

如何写Spec

  1. pre-condition and post-condition:前置条件通过“requires”描述,前置条件是对客户端的约束,在使用方法是必须满足的条件。后置条件通过“effects”描述,后置条件是对开发者的约束,方法结束时必须满足的条件。如果前置条件满足,则后置条件必须满足。如果前置条件不满足,则方法可做任何事情。
  2. Document:这部分为当前方法的注释:
    • 方法的目的,是用来做什么的
    • @param:输入的参数
    • @return:方法的返回值
    • @throws:这个方法中可能抛出的异常(checked and unchecked)
    • thread safety issues:线程安全的策略。

Spec的强度比较

  • 前置条件越弱,规约强度越强;
  • 后置条件越强,规约强度越强;
  • 规约越强,开发者责任越重,客户端责任越轻;
  • 某个具体实现,若满足规约,则落在其范围内;否则,在其之外。
  • 程序员可以在规约的范围内自由选择实现方式;
  • 更强的规约,表达为更小的区域;

一个好的Spec应该是:

  • 内聚的:Spec描述的功能应单一、简单、易理解。规约做了两件事,所以要分离开形成两个方法。
  • 信息丰富的:不能让客户端产生理解歧义。
  • 足够“强”:太弱的spec,客户不放心。开发者应尽可能考虑特殊情况,在post-condition给出处理措施。
  • 足够“弱”:太强的spec,在很多特殊情况下难以达到,给开发者增加了实现的难度。