·①规约怎么去写②怎么通过规约去比较方法的强弱
·规约存在于方法中(类中有属性和方法,用户只能看到方法,看不到属性),但不只给方法写,也会给属性写规约,不过这一章讲的都是给方法写的。
·方法分为方法名和方法体两部分,参数类型和返回值类型是否匹配,在静态类型检查阶段完成。
·规约包含注释和具体的方法名(函数声明)两部分。不包含方法体。
·规约中包含了方法的声明,是可以被编译器检测的(不过注释部分是编译器不能检测的)。
·规约只讲“能做什么”,不讲“怎么实现”
·行为等价性:这两个函数是否可相互替换。(站在客户端视角看行为等价性)
·规约的规范描述:
/**(注意是双星号开头)
@param:前置条件/输入
@return:后置条件/输入
规约中不应该给出数据类型、函数内部实现方法等
·mutating方法使用mutable类型的对象可能会对输入参数进行改变,此时一定要在规约中写明。
·除非后置条件里声明过,否则不要修改输入参数。
·【本章重点】设计规约,分析哪一个规约更好——规约的确定性、陈述性、强度
规约的强度:
比较两个规约,判断是否可以用一个规约替换另一个。
归约的强度S2≥S1,当且仅当:S2的前置条件比S1更弱,且S2的后置条件比S1更强。此时,就可以用S2替代S1。
如果S1的前置条件和后置条件都比S2的要强,那么这两个规约的强度是不可比较的,不可用一个去替换另一个。
越强的规约意味着:更少的实现就能满足它,更多的用户可以使用它,对程序员的要求变多,对用户的要求变少
·设计更好的规约:
规约应是内聚的——描述的功能应单一、简单、易理解
规约应该足够强——太弱的规约,客户不敢用,开发者应尽可能考虑各种情况,在pos-condition给出处理措施
规约应该足够弱——太强的规约,开发者难以实现
规约应该使用抽象类型——不要带具体的类型和参数,可以给方法的实现与客户端更大的自由度
规约应该根据代码内部check的代价大小判断是否要写前置条件