Software Construction之ADT

 

Mutable和Immutable

Primitive:int,Integer,String…为Immutable,在 stack中分配内存
Object:Immutable/Mutable,heap中分配内存 防御式拷贝

check

静态类型检查:可在编译阶段发现错误,是关于“类型”的检查,不考虑值

  • 语法错误
  • 类名/函数名错误
  • 参数数目错误
  • 参数类型错误
  • 返回值类型错误
    int a = 5;
    if (a > 10) {
    int b = 2;
    } else {
    int b = 4;
    }
    b *= 3;
    // b cannot be resolved to a variable
    ---------------
    int a = 5;
    int b;
    if (a > 10) {
      b = 1;
    }
    b *= 3;
    // The local variable b may not have been initialized
    

动态检查:关于“值”的检查

  • 非法的参数值(int=int/0会error,double=int/double(0)等返回Infinity不会error)
  • 非法的返回值
  • 越界
  • 空指针

Snapshot diagram

  • 基本类型的值
  • 对象类型的值
  • Immutable的值用双线椭圆
  • 值的改变
  • final值使用双线箭头

Exception

checked exception:要handle的exception,如:找不到xxx
unchecked exception:不handle,直接退出的exception,如Null­Pointer­Exception
不用handle的是unchecked,用handle的是checked

Exception类是checked exception
RuntimeException和Error类是unchecked exception

Spec

  • spec里不需要解释参数的类型
  • 若spec:A>=spec:B,那么满足A的precondition<=B的precondition,且对于满足B的precondition来说,A的postcondition>=B的postcondition。
    也就是更弱的precondition或更强的postcondition,意味着更少的实现方式,和更多的用户使用。
    两个不可比较的spec也可能有交集。
  • 好的spec应该是倾向于陈述性,而不是具体的实现。
    好的spec应该既不强也不弱,强会给实现带来负担,弱会给client的使用带来限制。
    好的spec应该是解耦的。

Abstract type

  • 区分Creator和Producer:A的Creater是用非A的参数来构造一个A并返回,A的Producer是用一个A来构造一个A并返回。
  • 区分Creator/Producer和Observor:A的Observor是返回一个非A的对象,A的Creator/Producer是返回一个A的对象。

Spec和Rep

Spec包括函数名,包括类名。
Rep包括field和field的注释。

Representation independence

表示独立性:Client不需要考虑ADT中的具体实现。