软件构造系列(三)ADT规约和接口

ADT规约

规约意义

规约(specifications)写于ADT和每个方法前,我们应该写清楚每个规约,其对程序有重要意义:
1.让别人理解此ADT意义与作用,而不需要了解其内部实现
2.用于区别客户与开发者的责任
3.先写好规约有利于开发者更正确,更快速设计代码
4.可以隔离变化,无需通知客户端

行为等价性

站在客户端层面看ADT功能是否一样,无需关心内部实现,就像快排和桶排都是排序算法一样

前置条件和后置条件

前置条件(requires):对客户端的约束,在使用方法时必须满足条件
后置条件(effects):对开发者的约束,方法结束时必须满足的条件
对ADT或方法的规定是前置条件满足了,后置条件才会满足,前置条件不满足,可以任意设置返回
静态类型声明是一种规约,限制前置条件和后置条件,编译器可据此进行静态类型检查
方法前的注释也是一种规约,但需人工判定其是否满足。
前置条件用@param
后置条件用@return 和@throws

/**
 * Add a vertex to this graph.
 * 
 * @param vertex label for the new vertex
 * @return true if this graph did not already include a vertex with the
 *         given label; otherwise false (and this graph is not modified)
 */
public boolean add(L vertex);

规约确定性

确定的规约:输入满足前置条件,其输出是唯一的、明确的
欠定的规约:同一个输入可以有多个输出
非确定的规约:同一个输入, 多次执行时得到的输出可能不同

规约的强度

对于一个规约来说,前置条件弱,后置条件强,那么强度也就越强,这也很好理解,一个可以容纳多个输入且不出错的程序肯定更强。
强的规约可以代替弱的规约

规约的陈述性

操作式规约:解释具体操作,例如伪代码
声明式规约:没有内部实现的描述,只有 “初-终”状态
这里一般使用声明式规约,要说清操作应该在代码内部写注释

接口

接口作用

接口就是一个特殊的类,有方法,但是没有具体实现这些方法,需要其他具体类去实现这个接口,总的来说,接口就是同一类型的类的蓝图,规定了具体类要实现些什么,然后具体的类就去实现其中的方法,以到达需求的功能。
就比如CPU就是一个接口,Intel的CPU就是个具体实现类,能实现CPU的功能。并且我们平时用的List,Set等数据结构也是接口,ArrayList,HashSet就是具体实现类。

接口实现

用interface和implements来实现,注意一个类可以实现多个接口,一个接口也可以继承多个接口,然后具体实现类的子类也具有实现接口的功能,如下例子:

public interface Read{
}
public interface Write{
}
public interface CPU extends Read,Write{//CPU同时具备读和写的功能
}
public class Intel implements CPU{//Intel公司的CPU作为具体实现类来实现CPU功能
}
public class Intel2020 extends Intel{//自然2020年intelCPU也能实现CPU功能
}

泛型

泛型在接口里用得很多,尤其接口是抽象的,泛型也是抽象的,就很契合。
泛型通常用一个大写字母来代表所有的类型,放在接口里,在具体实现里就可以根据需要选择不同的类型来替代泛型。
比如下面有个计算器的接口,有个加法的方法须要实现,但是加法的参数可以是多种类型,用泛型来表示,实现时具体化。

public interface Computer<R>  {
	public R add(R a,R b); 
}
public class hp implements Computer<Double>{
	@Override
 	public Double add(Double a, Double b) {
  		return a+b;
 	}
}

这里还有个介绍泛型非常详细的博客:
https://www.cnblogs.com/coprince/p/8603492.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值