软件构造课程心得
继续我们的总结:
第四章
1.
2.静态类型语言:在编译阶段进行类型检查并发现错误,避免将错误代入运行阶段,提高了代码的正确/健壮性。 动态类型语言:在运行阶段进行类型检查。
3.检测bug:静态类型检查>>动态>>无检查。
4.静态检查无法检查出与变量值有关的错误。可以检查出:语法错误,类名/函数名错误,参数数目错误,参数类型错误,返回值类型错误。
动态检查能检查出:非法的参数值,非法的返回值,越界,空指针。
5.final类无法派生子类。Final变量无法改变值/引用。Final方法无法被子类重写。
6. 不变对象:一旦被创建,始终指向同一个值/引用。可变对象:拥有方法可以修改自己的值/引用
7.snapshot。双圈地址里的内容不可变。
不可变的引用:用双线箭头。
8.不可变类型,在修改时会频繁发生拷贝。但是可变类型可以很好的解决这个问题。例子如下:
9. 可变还是不可变:(1)看方法是否改变参数(2)看return是否是mutable类型(3)保证所有属性都是private,尽量加final
引用不可变但是指向的值是可变的,例子:
10.Arrays和list在迭代时被修改,就会抛出异常。
11.建议用iterator自带的remove方法。如果用list.remove删除元素,那么会和iterator发生不匹配的情况。
这次内容不多,后续会进行补充。
---------------------------------------------------------------------------------------------------------------------------------
补充来了
第五章
1.参数类型是否匹配,在静态类型检查阶段完成。返回值类型是否匹配,也在静态类型检查阶段完成。
2.精确的规约有助于划分责任,规约可以扮演防火墙的角色。只讲能做什么,不讲怎么实现。
3.通过规约判断方法的等价性。
4. 静态类型声明是一种规约,可据此进行静态类型检查static checking。
5.规约的分类:确定性 ,陈述性,强度(必考)。
6. spec变强:更放松的前置条件+更严格的后置条件。一旦规约1比规约2强,那么可以用规约1替换规约2。例子:
7.
第六章
1.抽象数据型由操作定义,与内部实现无关。
2.可变与不可变数据类型。可变可变类型的对象:提供了可改变其内部数据的值的操作。不变数据类型: 其操作不改变内部值,而是构造新的对象。
3. 必考
AF:映射
RI:属性在任何时间都要满足的限制条件
4. 构造器:可能实现为构造函数或静态函数。构造器被实现为静态函数,通常被称为工厂方法。工厂方法用于创建对象,属于静态方法;实例方法在创建对象后才能调用函数并且工作。
生产器:新产生的数据与旧的数据类型一致。
观察器:数据类型不一致。
变值器:改变函数内部对象属性的方法。变值器通常返回void则必然意
味着它改变了对象的某些内部状态。也可能返回非空类型。
5. 内部属性与实现变化,但用户操作未变。表示独立性:不暴露内部属性与实现方法
6. .size()限制了内部的属性,破坏了RI Representation Independence(表示独立性),People不能换成Set或其他了。
7.Invarient(保持不变性)类的属性从public改为private。Return 和Set不能直接返回数组名称。
8. 抽象值构成的空间:client看到和使用的值
9.表示空间R与抽象空间A的映射关系。满射,未必单射,未必双射。
10.RI与AF的书写:
11.RI是一种要求,选出合法的子集,AF像是描述,描述在client层面代表了什么。Rational Number有理数。
12.设计ADT方法:(1) 选择R和A;(2) RI --- 合法的表示值;(3) 如何解释合法的表示值 ---映射AF
13.三个必考问题:问题1:
问题2:
问题3:
14.在所有可能改变rep的方法内都应该调用CheckRep来检查,如:
15.选择题:有益的可变性。只改变R值,不改变A值,因为AF是多对一的函数,所以只是把一个指向A的改成了另一个指向A的。
immutable类型的类也可以被改变,只是用户看不到
16. Safety from Rep Exposure。
Final 决定了指向不变,但被指向的内存内容可能发现变化。