什么是规约
规约是团队合作的关键。它就像一个合同:实现者负责满足合同的要求,使用该方法的客户端就可以依靠这个合同。事实上,就像真正的法律合同一样,规约对双方都有要求:当一个规约具有前提条件时,客户端需要满足这个前提条件;当客户端满足这个前提条件时,我们的方法需要满足合同中提出的要求。
为什么需要规约
在程序中最严重的bug产生于两个代码块之间交互时不同的行为之间的误解。虽然每个每个程序员心里都记着一个规约,但不是所有的程序员都把它写了下来。如果在一个团队里,不同的程序员心里有不同的规约,但都没有把它写下来时,当程序崩溃的时候,我们很难发现错误出现在哪里。而代码中的精确规约可以避免这一问题,从而免去我们不知道去哪里修改程序的痛苦。此外,规约对使用该方法的客户端是有好处的,因为他们省去了我们去读代码的任务,就可以知道这个方法要实现什么样的功能。
![](https://i-blog.csdnimg.cn/blog_migrate/545873d5c90aab9e484542f918cfcd56.png)
客户很容易读懂BigInteger.add这个方法的规约,它将两个BigInteger类型的数据进行相加。如果我们有的只有这些代码,我们要从头开始阅读BigInteger类中的构造函数,subtract函数,compareMagnitute函数才能明白这个函数要实现什么功能。
规约对一个方法的实现者有很多好处。因为它给了实现者改变方法内部的具体实现方法并且不用告知客户的自由。同时它也可以使编程变得更快,使用较弱的规约可以排除某个方法可能被调用的某些状态,这些在输入上的限制可以允许方法的实现者跳过代价昂贵并且不必要的检查,并且实现更加有效。
规约的行为就像是客户端和实现者之间的防火墙。它允许客户机不受该单元工作细节的影响——如果在一个方法之前有一个规约,我们就不需要读取这个方法的源代码来明白这个方法需要实现的功能。它也允许实现者不需要考虑客户端使用这个方法的细节 ——该方法的实现者不需要问客户他们准备怎么使用这个方法。