软件构造-02

(一)数据类型与类型检查
基本数据类型:有值无ID,栈
抽象数据类型:有值和ID,堆
静态类型检查:类型检查
动态类型检查:值的检查(空指针引用,越界访问、整数除0)
不检查但会出现错误结果(避免):(浮点数除0、整数溢出)
(二)immutable 与 mutable
不可变数据类型:内部无mutator,每次改变都会产生新的副本
可变数据类型:内部有mutator,可以改变类的值
final的使用:

final表明了程序员的一种“设计决策”
final类无法派生子类
final变量无法改变值/引用

immutable变量被final修饰后无法改变
                   mutable变量被final修饰后引用不可改变

final方法无法被子类重写

集合类的使用:

集合类均为mutable变量,可以包装为UnmodifiableCollections作为immutable类型
mutable存在多引用时修改容易出现风险

(三)画snapshot图
(四)设计规约

  1. 前置条件与后置条件:
    前置条件满足了,后置条件必须满足;

前置条件不满足,后置条件不一定满足(输入错误,可以抛出异常)

  1. 规约的书写:

作为方法的注释书
@param
@return
@throws

  1. 规约的强度:
    前置条件越弱,规约越强。
    后置条件越强,规约越强
    (五)ADT的设计
  2. 四种操作:
    creator:可以是构造器或者工厂方法
    producer:
    mutator:
    observer:
  3. 表示独立性 与 表示泄露:
    (1)类内部的rep不应该泄露给外部
    例如:rep改成final + private  ;规约中不包含rep信息,只提供抽象空间的信息 ; mutable类型在返回和入口处需要防御性复制
    (2)信息封装,rep的性质由类自身保证,不依赖客户端
    例如:checkRep
  4. RI 与 AF
    (1)RI:类自身需要保证的rep的性质
    (2)AF:开发者的表示空间 到 客户端的抽象空间 的映射(满射)
    (3)RI 与 AF以注释书写,类层面
    (六)OOP的设计
  5. 抽象到具体的设计特点
    接口  抽象类  具体类
    (1)继承 和 重写
  6. 多态的特性
    (1)子类型多态(运行时确定)
    (2)重载多态(编译时确定)
    重载:方法参数列表必须改变,只有返回值改变会报错。
    (3)泛型多态
  7. 重写 与 重载 的区别

重写:运行时确定、动态类型检查、满足LSP原则
重载:编译时确定、静态类型检查
(七)等价性

  1. 等价性:
    对于immutable类型:一般采取对象等价性
    (1)引用等价性:对象ID相同
    (2)对象等价性:a。规约一致变量相同 ; b。自反、对称、传递 ;c。客户端观察行为一致
    对于mutable类型:根据情况而定
    (1)行为等价性:调用各种方法后依旧保持等价
    (2)观察等价性:客户端角度观察行为一致
  2. 等价性在equals中的具体应用
    (1)immutable变量:
     不重写equals:Object中默认实现的equals,即判断引用是否相同。
    重写equals方法和hashcode方法:判断对象等价性
    (2)mutable变量:
    重写equals 和 hashcode方法:实现观察等价性,但类发生变化后在hash容器中出现错误
    不重写equals:判断引用是否相同