【软件构造】第三章知识整理(上)
基本数据类型 对象数据类型
静态类型检查 动态类型检查
- 静态类型语言:在编译阶段进行类型检查
- 动态类型语言:在运行阶段进行类型检查
- ·静态类型检查:在编译阶段发现错误,避免将错误带入到运行阶段,可以提 高正确性、健壮性(e.g:语法检查、类名/函数名错误、参数数目错误、参数类型错误、返回值类型错误)
- 动态类型检查:在运行阶段发现错误,检查非法的参数值、非法的返回值、越界、空指针……
- ·总而言之,静态类型检查是关于“类型”的检查,不关心值;而动态类型检查是关于“值”的检查。
- ·静态类型检查>>动态类型检查>>无检查
Mutable/Immutable
- immutable:不可变数据类型:一旦被创建,其值不可变,始终指向同一个值/引用,因此更加安全。
例:基本数据类型
mutable:可变数据类型:拥有方法可以修改自己的值/引用
- 可变-->不可变:使用final关键字。
***final类无法派生子类
***final变量无法改变值/引用
***final方法无法被子类重写
值的改变 引用的改变
由于String为不可变类型,因此若想对一个String类型的变量的值进行改变,就是将该变量指向一个新的地址。StringBuilder为可变类型,因此若想对一个StringBuilder类型的变量的值进行改变,直接改变即可。
Snapshot diagram
用于描述程序运行时的内部状态
便于程序员之间的交流,刻画类变量随时间的变化,便于设计思路
不可变对象:用双线椭圆;不可变的引用:用双线箭头
基本类型的snapshot diagram
***可变的引用可以指向不可变的值
Specification 前置/后置条件
specification需要包含:输入/输出的数据类型、功能和正确性、性能;只讲“能做什么”,不讲“怎么实现”
前置条件:对客户端的约束,在使用方法时必须满足的条件
后置条件:对开发者的约束,方法结束时必须满足的条件
在写前置条件时,使用@param关键字声明对变量的要求,在写后置条件时,使用@return关键字和@throws关键字
***除非在后置条件里声明过,否则方法内部不应该改变输入参数
***尽量避免使用mutable的对象
例:
行为等价性
由于这两个函数都符合这个规约,因此等价。
规约的强度
spec变强 = 更放松的前置条件+ 更严格的后置条件
***越强的规约,意味着implementor的自由度和责任越强,而client的责任越轻
确定(Deterministic)的规约:给定一个满足precondition的输入,其输出是唯一的、明确的
欠定(Under-deterministic)的规约:同一个输入可以有多个输出
非确定(Nonedeterministic)的规约:同一个输入,多次执行时得到的输出可能不同
若用图来表示规约的强度,面积越小说明规约越强