在学习软件构造课之前,上的专业课例如高级语言程序设计和数据结构无一例外是在传授专业技巧的。怎样把程序编写的更好,时间空间复杂度更高似乎是之前我对代码的唯一追求。在学习设计规约之后,我的想法发生了改变,因为,程序是给客户使用来实现相应的功能的。而客户是不会关心内部实现情况,他能看到的只有自己的输入和程序员的代码给这个输入的反馈与自己想象中的是否合理,和自己的满意度是否契合来判断程序的好坏。
当然这不是说程序的性能不重要,而是我的思想观念从怎样疯狂用精妙的方式来提高一小段代码的性能变为了怎么样完成用户需求代码,提高他的满意度。
规约无疑是我思想迈进的助燃剂。
首先,程序从面向自己到面向客户,要体现自己的设计决策。规约(Spec)则是体现自己设计决策的良好方式。正如老师说的,这就像客户和程序员之间签下的契约,彼此尊重,互相满足。
从使用的场景来看,客户希望自己使用方便,代码正确率回报率高;而程序员希望自己写的代码受约束性低,二者本就是互相矛盾的。那么签署的契约就是给双方定下了责任,所以十分必要。规约的形成决定了一系列良性循环的发生。
例如行为等价性,由于根据用户端需要实现的方法本就是相当于被抽象只留下接口的,所以行为等价性的判断是以函数规约是否相等为相关依据的。
例如前置条件和后置条件的相关情况。正如我上面所说,客户希望自己使用方便,代码正确率回报率高;而程序员希望自己写的代码受约束性低,设置的规约就可以被设计从而解决这些矛盾。前置条件是对用户端的约束,约束客户端的合法输入否则可以随意输出;后置条件则是对程序员的约束,客户端给你什么样的合法输入,就要给予相应的客户想要的输出情况。这就是契约精神的一种体现。
那么如何设计一个好的规约呢?首先,需要了解规约的一个衡量标准:规约强度。
规约强度更强意味着这个规约的前置条件更弱,后置条件更强,也就是说,用户可以输入更多的可以被解决的数据,程序员需要对数据的处理更加严格。
以规约为代表着的契约精神的成立,标志着程序员与客户之间达成协议:客户输入需要被允许的合法输入,程序员给予输入正确的输出。