1.设计规约
*1.1specification 前置、后置条件
在团队合作的程序中,规约是团队工作的关键。因为如果没有规约就没法分派任务,就没法进行编程;即使将代码写出来了,也不知道代码运行是否按照要求了。规约以一种类似于合同的方式进行工作。即方法的实现者负责满足这份合同的要求,使用这个方法的客户可以依赖这份合同。Spec给“供需双方”都确定了责任,在调用和实现的过程中双方都要遵守。
规约是客户端与实现者之间签订的“契约”,客户端的输入应当满足前置条件,实现者编写的程序应当给出满足后置条件的结果。
规约描述了方法的功能以及接口(“能做什么”),
不需要依赖(也不应该透露)方法的具体实现。
/**
*
*@param x要加入集合的字符 (对参数的要求)
*@return操作后集合的大小
*/
public int add(char x)
前置条件(参数要求)
后置条件(返回值要求,或者throws抛出的异常)
*1.2 规约的强度
更强的规约:前置条件更弱,后置条件更强。可输入范围变大,抛出异常更少。
换句话说,规约越强程序员越痛苦。
*1.3 行为等价性
去判断行为等价性,问题的关键就在于两种实现方法能否相互替代。
两种行为等价的方法可以相互替代,主要看用户需求。
2. ADT
2.1 ADT操作的四种类型
举个例子
*2.2 AF/RI/rep
2.2.1 R/A/rep
R 表示空间 程序员看到的
A 抽象空间 用户能看到的内容
rep 内部表示属性
2.2.2 AF/RI
AF(抽象函数)即是描述从R到A的映射关系的函数,即如何将表示空间中的一个值解释为抽象空间中的一个值。
AF必然是一个满射,同时它不一定是单射(必须没有非法的表示值才能说是必定满射)。
表示方法:
AF(rep)=rep在类中的含义。
RI(表示不变量)告诉了我们表示空间R中的值是否能被映射到抽象空间A中,也可以认为RI构成了表示空间R的一个子集,该子集中的值能够被映射到抽象空间A中。
简单来说,表示不变量告诉了我们变量是否合法。
写RI=写rep满足的规则=“阅读理解”
2.2.3 用注释写AF/RI![在这里插入图片描述](https://img-blog.csdnimg.cn/351a1cf1d18f420981bd7cbf8e64475c.png)
*2.3 表示独立性、表示泄露
表示独立性是指,客户端使用ADT时无需考虑(也不应该知道,更不应该直接访问到)其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。
如果ADT不幸地让客户端得到了自己内部表示(可变对象)的引用,那么客户端就可以不通过ADT的操作,而可以通过非法后门修改ADT的内部表示,产生表示泄露。
1.使用private和final关键词对域进行修饰。
2.使用防御性拷贝,需要注意的是,防御性拷贝可以发生在传入和传出数据时。
3.通过规约对用户的行为进行限制。
4.使用不可变类型的数据构建ADT。