【软件构造】第三章知识整理(上)

基本数据类型 对象数据类型

【软件构造】第三章知识整理(上)

 

 

静态类型检查 动态类型检查

  • 静态类型语言:在编译阶段进行类型检查

  • 动态类型语言:在运行阶段进行类型检查


  • ·静态类型检查:在编译阶段发现错误,避免将错误带入到运行阶段,可以提   高正确性、健壮性(e.g:语法检查、类名/函数名错误、参数数目错误、参数类型错误、返回值类型错误)

  • 动态类型检查:在运行阶段发现错误,检查非法的参数值、非法的返回值、越界、空指针……

 

  • ·总而言之,静态类型检查是关于“类型”的检查,不关心值;而动态类型检查是关于“值”的检查。

 

  • ·静态类型检查>>动态类型检查>>无检查

 

 

 

 

Mutable/Immutable

  • immutable:不可变数据类型:一旦被创建,其值不可变,始终指向同一个值/引用,因此更加安全。

       例:基本数据类型

      mutable:可变数据类型:拥有方法可以修改自己的值/引用

  • 可变-->不可变:使用final关键字。

  ***final类无法派生子类

  ***final变量无法改变值/引用

  ***final方法无法被子类重写

 

 

 

 

值的改变 引用的改变

用String和StringBuilder作为例子
【软件构造】第三章知识整理(上)

由于String为不可变类型,因此若想对一个String类型的变量的值进行改变,就是将该变量指向一个新的地址。StringBuilder为可变类型,因此若想对一个StringBuilder类型的变量的值进行改变,直接改变即可。

 

 

 

 

Snapshot diagram

用于描述程序运行时的内部状态

便于程序员之间的交流,刻画类变量随时间的变化,便于设计思路


不可变对象:用双线椭圆;不可变的引用:用双线箭头


基本类型的snapshot diagram

 【软件构造】第三章知识整理(上)

对象类型的snapshot diagram
【软件构造】第三章知识整理(上)

***可变的引用可以指向不可变的值

   例:
【软件构造】第三章知识整理(上)

 

 

 

 

Specification 前置/后置条件

specification需要包含:输入/输出的数据类型、功能和正确性、性能;只讲“能做什么”,不讲“怎么实现”

 

前置条件:对客户端的约束,在使用方法时必须满足的条件

后置条件:对开发者的约束,方法结束时必须满足的条件

契约:如果前置条件满足了,后置条件必须满足;若前置条件不满足,则方法可以做任何事情。用图如下表示:
【软件构造】第三章知识整理(上)【软件构造】第三章知识整理(上)

 

在写前置条件时,使用@param关键字声明对变量的要求,在写后置条件时,使用@return关键字和@throws关键字

***除非在后置条件里声明过,否则方法内部不应该改变输入参数

***尽量避免使用mutable的对象

例:

【软件构造】第三章知识整理(上) 

 

 

 

行为等价性

***要站在客户端视角看行为等价性:即根据规约判断是否行为等价,若两个函数都符合同一个规约,那它们等价

e.g:判断下列两个函数是否等价
【软件构造】第三章知识整理(上)
根据规约:

 【软件构造】第三章知识整理(上)

由于这两个函数都符合这个规约,因此等价。

 

 

 

规约的强度

spec变强 = 更放松的前置条件+ 更严格的后置条件

例:
【软件构造】第三章知识整理(上)

***越强的规约,意味着implementor的*度和责任越强,而client的责任越轻

 

确定(Deterministic)的规约:给定一个满足precondition的输入,其输出是唯一的、明确的

欠定(Under-deterministic)的规约:同一个输入可以有多个输出

非确定(Nonedeterministic)的规约:同一个输入,多次执行时得到的输出可能不同

 

若用图来表示规约的强度,面积越小说明规约越强

例:
【软件构造】第三章知识整理(上)