2019春Software-construction复习笔记(2)

Chapter 3: Abstract Data Type (ADT) and Object Oriented Programming (OOP) 3.1 Data Type and Type Checking
数据类型与类型检验

1.静态/动态类型检查
静态类型检查常见对象:语法错误、类名/函数名错误、参数数目错误、返回值类型错误。
——关于类型的检查
动态类型检查常见对象:非法的参数值、非法的返回值、越界、空指针。
——关于值的检查
一些例子:
在这里插入图片描述
第一个n不能强转为布尔型,静态类型错误
第二个越界,不会有错误但是与期望结果不符。
第三个先计算1/5的整型除法为0,在转换为double,与期望不符。
第四个除0异常,动态错误。
第五个除以浮点数0,不报错,值不符期望。
2. 可变/不变的数据类型
Java中的类型:

不变数据类型:一旦被创建,值不能被改变;若为引用类型,其指向的对象不能被改变。优势是安全,劣势是性能,如大量的内存浪费。
可变数据类型: 拥有方法可以修改自己的值/引用。优势是性能,并且可以作为多个模块间的数据共享,劣势是安全性,特别是在多个引用时。
3. 用snapshot图理解数据
用于描述程序运行时的内部状态。
基本类型
在这里插入图片描述
对象类型
在这里插入图片描述

不可变类型:双线椭圆
在这里插入图片描述
不可变的引用:
在这里插入图片描述
引用不可变,指向的值可以变。

一个例子:
在这里插入图片描述

4.用集合类表达复杂数据类型
iterator暗中破坏:
在这里插入图片描述
结果还有一个未删除,为什么?
用snapshot分析:
在这里插入图片描述
删掉第一个,index++变为1
在这里插入图片描述
同时list里的0和1的指向也发生变化,指向原先后一位指向的字符串。
正确的方法:用iterator.remove(),iterator将会自己调整index。

不可变类型包装器的不可变性是在运行阶段获得的,静态类型检查无法检查出来。
3.2 Designing Specification 设计规约
1.方法的规约
final的关键字定义了设计决策:“不可改变”。
spec作为程序与客户端达成一致的契约,给供给双方都确定了责任,在调用的时候双方都要遵守。
规约可以隔离变化,无需通知客户端。
只讲能做什么,不讲怎么实现。
行为等价性:
根据规约判断是否行为等价。
2. 前置/后置条件
前置条件:对客户端的约束,在使用方法时必须满足的条件。
后置条件:对开发者的约束,方法结束时必须满足的条件。
契约:前置条件满足,则后置条件必须满足。前置条件不满足,则方法可以做任何事情。
静态类型声明是一种规约,可据此进行静态类型检查。方法前的注释也是一种规约,但需要人工判定是否满足。

spec for mutating methods:
除非在后置条件里声明过,否则方法内部不应该改变输入参数。应该尽量遵循此规则,尽量不设计mutating的spec,否则就容易引发bug。
3. 欠定规约、非确定规约。
同一个输入,多次执行时得到的使出结果可能不同。欠定的规约通常有确定的实现。
4. 陈述式、操作式规约。
操作式规约:例如伪代码。
声明式规约:没有内部实现的描述,只有初始状态和最终状态,不呈现内部实现过程。
5. 规约的强度及其比较。
规约S2强度大于等于S1,当且仅当S2的前置条件更弱,后置条件更强。
在这里插入图片描述
6.如何写出好的规约。
内聚的——单一、简单、容易理解。
信息丰富而无歧义
spec太弱——客户端不放心
spec太强——开发难度大
使用抽象类型
是否使用前置条件取决于
(1) check的代价;(2) 方法的使用范围
– 如果只在类的内部使用该方法(private),那么可以不使用前置条件,在使用
该方法的各个位置进行check——责任交给内部client;
– 如果在其他地方使用该方法(public),那么必须要使用前置条件,若client端
不满足则方法抛出异常。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值