【软件构造】软件构造知识点总结—第三章

文章探讨了基本和对象数据类型的区别,包括它们在内存中的分配以及静态和动态类型检查的概念。重点讨论了不可变性和可变性,举例说明如String和StringBuilder。此外,提到了ADT的设计规约,如前置和后置条件,以及不变性的重要性。文章还涉及ADT的构造器、生产器、观察器和变值器角色,以及如何测试ADT。最后,文章讨论了在OOP中引用等价性和对象等价性的区别,以及它们与hashCode的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第三章:
一、数据类型与类型检验
1.基本数据类型(小写开头如int)和对象数据类型(大写开头如String):
基本数据类型为immutable,在栈中分配内存

对象数据类型在堆中分配内存。
基本数据类型可以包装成对象数据类型

2.静态类型检查和动态类型检查:
静态(主要关于类型):语法,类/函数名,参数数目,参数类型,返回值类型。
动态(主要关于值):非法参数值,非法返回值,越界,空指针。

3.Mutability and Immutability:

Immutability:一旦创建,其值不变,可以用final声明。引用类型,也可以是不变的:一旦确定其指向的对象,不能再被改变

对于final:final类无法派生子类;final方法无法被子类override;final变量无法改变值/引用。

Mutability:可以用方法改变其值/引用。

eg:String:String是一个不可变的数据类型。

StringBuilder: StringBuilder是一个可变的数据类型。

可变存在的风险:客户端可能修改数据。
可以使用防御式拷贝进行返回。即创建一个新的返回对象返回。即使修改也不会对原有数据造成影响。

4.快照图:描述程序运行时的内部状态。
不可变对象:双线椭圆。
不可变引用:双线箭头。

 

5.Iterator:迭代器(mutable)

6.常用不可变与可变:

基本类型及其封装类不可变。

List,Set,Map是可变的,可以用Collections.unmodifiedList()等防止修改

可以用List.of创建不可变集合,如:

List a = List.of(“lion”, “tiger”, “bear”);

二、设计规约

1.前置条件:客户端需要满足的条件。

2.后置条件:开发者必须满足的条件。

3.spec格式

4.除非后置条件声明过,否则方法尽量不改变传入参数。

5.更强的spec:更弱的前置条件(要求的更少),更强的后置条件(承诺的更多)。

后置条件比较时,要以同一强的前置条件为前提,进行比较

三、抽象数据类型 (ADT)

1.可变数据类型:提供了可改变其内部数据的值的操作。

2.不变数据类型: 其操作不改变内部值,而是构造新的对象。

3.Creators(构造器),Producers(生产器),Observers(观察器),Mutators(变值器)。

Creators(构造器):构造器将某一个(某一些)与被构造数据类型不同的数据类型的对象作为参数,构造某个数据类型的具体对象。

Producers(生产器):生产器利用某一类型的数据对象构造出该类型的新的数据对象

Mutator(变值器):一般返回void,也有可能其他。

4.表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。

5.ADT的测试:

测试creators, producers, and mutators:调用observers来观察这些 operations的结果是否满足spec; §

测试observers:调用creators, producers, and mutators等方法产生或改变对象,来看结果是否正确。

6.保持不变性和避免表示泄漏,是ADT最重要的一个Invariant。

7.RI/AF/Safety from rep exposure:

RI:规定合法值

AF:解释合法值(映射)

Safety from rep exposure:如何防止表示泄露的问题。

checkrep():根据RI写,在所有可能改变rep的方法上都要加上。

四、ADT和OOP中的“等价性”
1.==与.equals():==是引用等价性,.equals是对象等价性。一般在immutable中区分,引用等价性即在内存中的引用是否相同,.equals即根据AF映射关系是否映射相同。
2.若两个对象.equals判断相等,则必须有相同的hashCode。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值