[HIT软件构造Blog008]期末复习

这篇文章就作为本学期软构学习的最后一篇博客吧,对于一些本人认为很重要的知识点进行总结

Immutable & mutable

immutable

  • String
  • 基本类型及其包装类型
  • LocalDate

mutable

  • List
  • Set
  • Map
  • Date
  • Arrays
  • 迭代器 Iterator

判断类是immutable还是mutable可参见下文---------》怎么设计一个immutable的类

ADT设计和spec设计之间的区别

以下的例子选自我们老师提供的习题课代码

这个例子说明了spec要怎么写
最开始说明这个类要实现什么功能
@param 说明了前置条件
@return 说明了后置条件
@throws 说明了需要抛出的异常
在这里插入图片描述

这个例子说明了ADT要怎么写
Rep Invariants (RI) 说明了每个不变量所要满足的条件
Abstraction function(AF) 说明每个不变量所代表的含义
在这里插入图片描述

如何判断表示泄露(rep exposure)

主要就3点吧:

  • 所有属性都是private
  • 不提供mutator方法
  • 返回值不能是mutable的

Snapshot图画法

可以参见这位学长的,讲解的非常详细 :
Snapshot图的最全画法、符号原理详解

我还想补充一点就是对于函数的画法:
比如对于以下代码:

/** @return the sum of the numbers in the list */
public static int sum(List<Integer> list) {
    int sum = 0;
    for (int x : list)
        sum += x;
    return sum;
}
/** @return the sum of the absolute values of the numbers in the list */
public static int sumAbsolute(List<Integer> list) {
    // let's reuse sum(), because DRY, so first we take absolute values
    for (int i = 0; i < list.size(); ++i)
        list.set(i, Math.abs(list.get(i)));
    return sum(list);
}
// meanwhile, somewhere else in the code...
public static void main(String[] args) {
    // ...
    List<Integer> myData = Arrays.asList(-5, -3, -2);
    System.out.println(sumAbsolute(myData));
    System.out.println(sum(myData));
}

Snapshot图画法:
在这里插入图片描述

函数用方框框起来,函数名写左边,参数写右边

Overload & Override

在这里插入图片描述

怎么设计一个immutable的类

  • 不提供 mutators方法
  • 确保不会有方法被Override
  • 所有字段均为final
  • 所有字段均为private
  • 避免表示泄露
  • 实现 toString、hashCode、clone、equals

判断前置条件和后置条件

变弱,说明表示的范围变大了
变强,说明表示的范围变小了
如果抛出了异常,说明后置条件变弱了
程序员喜欢spec弱一点(好实现)
用户喜欢spec强一点(功能全面)

hashCode 和 equals 关系

两对象equals,hashCode一定等
两对象不equals,hashCode可能等
两对象hashCode等,不一定equals
两对象hashCode不等,一定不equals

mutable类型的类不一定要重写equals和hashCode方法

类的行为等价性、观察等价性划分

注意:等价一定是建立在A空间内的

对于mutable才有行为等价性和观察等价性划分的意义

  • 集合类(Collections类)、Date的.equals()方法提供的相等方式是:观察等价性
  • StringBuilder的.equals()方法提供的判相等的方式是:行为等价性

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

关于黑盒和白盒的几组概念

  • 黑盒测试 & 白盒测试
    – 黑盒测试:只依据函数的spec来选择测试样例
    – 白盒测试:考虑函数具体实现方法的前提下选择测试样例
  • 黑盒复用 & 白盒复用
    – 黑盒复用:源代码不可见,不能修改,只能通过API来使用,无法修改代码
    – 白盒复用:源代码可见,可修改和扩展,复制已有代码到正在开发的系统,进行修改
  • 黑盒框架 & 白盒框架
    – 黑盒框架:通过实现特定接口delegation进行框架扩展
    – 白盒框架:通过代码层面的继承进行框架扩展

关于静态和动态的几组概念

  • 静态测试 & 动态测试
    – 静态测试:靠眼睛看,不执行程序,在源代码上进行
    – 动态测试:撸起袖子使劲干,通过一组给定的测试样例执行程序
  • 动态类型检查 & 静态类型检查
    – 动态类型检查:运行时检查
    – 静态类型检查:编译时检查
  • 动态类型语言 & 静态类型语言
    – 动态类型语言:在编程阶段不需要明确指出变量的类型(python)
    – 静态类型语言:在编程阶段需要明确指出变量的类型(java,C,C++)

委托分类

在这里插入图片描述

最后

这门课确实是好课,但是课程时间安排实在让人无语,希望以后可以合理安排吧
(Lab3的噩梦~)

最后老师说今年8道大题,盲猜一手🐕

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值