这篇文章是对哈工大2022春软件构造课程第五讲“设计规约”的思考和总结
目录
前言
在这一讲中会说明方法的规约、前置和后置条件、非确定规约、陈述式规约、规约的强度和比较、如何写出好的规约。
一、编程语言中的函数和方法
对于同一个类中的 static和非static类型的方法和函数,static方法和属性指的是类被编译时就会自动生成,它们归属于这个类,并不单属于这个类的某个对象,即每个对象都能访问和修改,一旦有一个对象修改了static的属性,那么所有对象都能且只能读取这个修改后的属性。
非static的方法和属性是归属于某个对象的,在new每个对象时都会创建一份这些非static方法和属性。在这个类中,非static的方法可以直接调用本类中任意一个方法和属性,因为在外界调用这个非static方法时必然已经创建了一个对象,所以可以支持这个方法调用非static方法、属性,而static方法和属性在这个类编译时就已经存在,一定可以调用。
二、规约:通信编程
①这些规约可以直接反应程序员对这个方法的设计决策,便于自己和他人阅读。
规约可以明确规定方法的实现方法,便于程序员编程,同时也可以做到程序与客户端独立,还可以便于客户与程序员之间划清责任。
规约中只讲能什么,不讲怎么实现。主要说明输入、输出的数据类型,功能,程序性能。
②两个方法之间是有行为等价性的,行为等价性是从客户端的视角来看的,如果两个方法具有行为等价性,那么这两个方法是可以完全进行替换的。具体判断两个方法是否具有行为等价性的方法如下图所示:
③规约中的前置条件和后置条件
前置条件(requires)是对客户端(输入)的要求,指客户端给的输入必须要满足规约中前置条件的要求。
后置条件(effects)是程序结束后返回值(输出)的要求,指程序的输出必须要满足规约中后置条件的要求。
根据规约,如果输入满足了前置条件,则输出必须要满足后置条件。如果输入不满足前置条件,那么输出可以任意,因为是客户端违约在前。
三、设计规约
比较哪个规约更好可以从下面三个方面进行:
①规约的确定性:描述的输出是否确定
②规约的陈述性:只是描述了输出,还是描述了如何输出
③规约的强度:强的规约为弱的前置条件+强的后置条件
对于规约的强度,前置条件越弱意味着客户端的输入范围越广,后置条件越强意味着输出的范围越窄,所以要使随便的输入都统一成为差不多的输出,体现出规约强度很强,同时也说明实现的可能类型很少。
比较前置条件的强度直接比较即可,比较后置条件的强度可以选取较强的前置条件作为前提,然后基于这个前提进行后置条件强度的比较。并不是所有的规约都能比较强度的,有一些规约前置条件更弱,后置条件也弱,这样就无法比较强度。还有些是前置条件和后置条件之间根本没有交集。
还可以用图形来表示规约,使用圈表示在规约范围内实现的可能种类,对于强度更强的规约,实现的可能种类更少,圈更小,体现为圈在强度低的规约内,表示强度高的规约可以替代强度低的规约,因为能够满足强度高的规约的实现方法也能满足强度低的规约。