软构课堂笔记

本文主要包含第四章到第七章的课堂笔记。

第四章 datatype and type checking数据类型与类型检验

一、datatype
基本数据类型 对象数据类型
考试考表格(性质)在这里插入图片描述

二、静态&动态类型检测
静态:编译时进行类型检查
动态:运行时进行类型检查
动态>>静态>>无检查
可能会问:静/动态类型检测会出现什么错误?
Static类型的检查/dynamic值的检查
在这里插入图片描述在这里插入图片描述

三、mutability and immutability(必考)
Mutability 多个引用指向一个变量,传参数可能会出现错误(多份拷贝 需垃圾回收)
Immutability 最少化拷贝以提高效率 获得更好性能 适合多模块之间共享数据
Immu与mu的差别:当有多个引用时不同
eg:
在这里插入图片描述

考法:分析/设计类是m/immu
Final方法无法被子类重写 只能继承

In snapshot:
双线圈表示immutable
单线圈mutable
想改变mutable的类而不发生错误 先copy再改变
考点:防御性copy:
通过方法来对属性进行改变

四、snapshot
区分单线双线 单圈双圈

五、arrays and collection
List set & arrays抽象接口
迭代器:p58
考:给定具体需求,把类写出来
在这里插入图片描述

为什么是mutable的:
Snapshot区分双箭头单箭头
在这里插入图片描述

可能考:为什么会出现p61的情况并修改
List和迭代器都是mutable,不可以一起用到修改中?p64

六、useful immutable types
用 collections.unmodifiableSet/list/Map转换->结果不可变:只能看 //包装器的设计模式
“不可变性”是在运行阶段获得,编译阶段无法进行静态检查

第五章 设计规约specification

规约能被程序自动检测:方法描述可被检测,方法注释不可被检测

(3)behavioral equivalence
行为不同但结果相同的函数拥有行为等价性(在用户看起来是一样的)
(4)规约模型:前置条件与后置条件(客户端VS.开发端)
契约:前置条件满足后置条件必须满足;前置条件不满足则方法可做任何事情

考:考一个类判断是Mutable还是immutable

3、规约如何分类
(1)规约分类
规约的强度:前置条件(前提)后置条件(返回值);规约越强,前置条件(对用户的要求)变弱,后置条件(完成成就更多)越强


考:类似p52的例题
(2)画出规约
规约越强,画出的圈越小,若规约无法比较,则不互相包含,但相交
(3)设计好的规约
用户和开发者都用/编着舒服
内聚化(coherent):功能单一、简单、易理解
Spec需要足够强大,but should also be weak enough
尽量使用抽象类型,少暴露具体实现

Precondition & postcondition(折中)

衡量标准:检查参数合法性的代价高低,高则加precondition,否则不加

第六章 abstract Data Type


AF:程序员所能看到的数据与用户所用的数据的对应关系
RI:程序在执行的任何时间点都要满足条件
常考:写AF

  1. 抽象和自定义类型
    ADT强调操作,对数据具体如何存储并不关心,只需设计/使用(独立性的体现之一)
    数据抽象:只需保证功能不变,任何方式都可实现
    Public->private

  2. 分类和操作(结合例子了解)
    Creator 一个类型到其他类型
    特点:可能实现为构造函数或者静态函数(static),工厂方法(通常是静态的),静态方法通常可存在于接口中

Producer 相同类型 但是产生新的
Observer 观察对象的属性etc…
Mutators 通常返回void 也可能返非空 Immutable不可能是变值器
考:给具体方法判断是哪个类型的(构造器/生产器/观察器/变值器)

  1. ADT examples
    Eg:substring(int,int)creator/producer

  2. 设计ADT
    Rule1:设计简洁一致的操作
    Rule2:足以支持client对数据的所有操作需要,难度越低越好

  3. 表示独立性(考大题)
    在这里插入图片描述

保证输入输出不变,内部设计怎么变都可以
//用看不到的类型表示即可,只能调用方法来测试
给一个类判断是否满足表示独立性。

规约(要求) 表示(属性) 执行
6. 测试ADT
7. 不变量
考:测试代码是否合理(保证immutable)p48-49
final-定义immutable的,但是对于mutable的类型需要做一次copy(new一个对象//复制代价低的时候使用)
//把mutable的类型改成immutable的类型,eg:data改成log

表示泄露:rep exposure 外部的引用可以直接改变本需通过函数才可以改变的值

类的属性不可被改变

考:样本分析代码是否符合要求p53
Rep:Public改成private,注意set和return 左下有问题

如何检查类满足某些约束? //任意类都应该保证表示独立性
1. 检查不变量
2. 检查rep exposure
3. 检查是否有mutable的方法
//约必要时,束强加给用户:注释?

  1. AF & RI//写成注释
    表示空间:属性,在机器里如何表示
    抽象空间:用户看到的数据

Eg:p57 不可以用set表示//set中元素顺序无法表示,而string的字符有顺序

Mapping between R&A 一定满射未必单射未必双射

AF(abstraction function):R空间A空间之间的对应关系
RI(rep invariant):校验规则,确定具体某一个R空间中的个体是否合法

如何设AF RI?
P62 无具体规则,先确定内部表示,再设计

考:p65判断的问题 左下??p67-70用户应该只能看到规约 1 3 4(observer)
9. 有益可变性

Immutable的类的属性可以改变,只要不改变A空间的表示就行(必考:选择题)
10.编写the AF,RI,and safety from rep Exposure

表示暴露 不出现public+final, make defensive copies
P84 eg3??直接copy or 将 return set要注意

针对属性的数据用户看不见,针对方法的数据用户看得见(显示A空间数据)

P89 问题:未保证输入的边一定满足直角三角形的条件
增加RI判定 or 在函数前增加对用户的要求

11. Precondition -> RI
12. ADT == 设计方法和属性

第七章

  1. 接口 就是一个父类可以创建多个子类,父类什么属性,子类必须继承
    考:类似p11 找错(4个)
    A.父类immutable 子类也必须immutable(add()//检测不出来)
    B.接口只有注释和方法,但不能有body实现
    C.子类型不能暴露?

D.接口中所有方法都应该进行后续实现(.contains)

接口中可实现的方法:

  1. 静态方法:目的:创建一个对象//返回父类型或者?? Gragh e…
  2. Default
    P83 c是子类,调用父类(example)的所有方法(method1、2)
    5.继承和重写overriding
    1)严格继承:子类中只能增加新方法,不能重写(final)

继承父类时使用creator一定放在前面

抽象类

  1. 多态、子类型、重载
    1)多态:
    A.重载 共享不同的方法p35 方法名字相同但参数or返回不同
    在编译阶段解析,找到最佳匹配//找到某一个方法是否应用
    静态多态
    B.

P43
重写与重载(考)

泛型:
两个实现:
1) 具体的类实现
2) 泛型实现

不能存在泛型数组

继承和子类型
可替换原则:父类型能干的子类型也能干//重写可能出问题
子类的规约强于父类的规约
可接性
子类需抛出比父类少的异常
P61-p62
少用instanceof()判断一个对象在运行时是否是某一个类型
Getdass()
Eg://其中A是B的父类,Object是所有对象的父类
A a;
a = new B;
a instanceof B; //正确
a instanceof A; //正确
a instanceof Object;// 正确
不可以向下转(父->子),但可以向上转(子类使用父类的功能)

List不是List的子类型 //一般来说,相同泛型,类型不同一定没有父子关系
List和array.list具有父子关系
通配符‘?’List<?>可以是任何List//eg. List的子类

Object method
调用equals
P69 choose (b)调用的是equals(Object)而非所设想的equals(Name)//修改见p70
contains方法被set所包含

设计一个好类
考试考选择或者代码修改题

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值