软件构造复习第六章

1 ADT

1 抽象类型

数据包括基本类型和对象类型

我们还可以自己定义抽象类型

一个抽象类是由规约和内部的操作刻画的,对数据的操作是它的本质特征

2 可变与不可变类型

2.1可变与不可变:可变对象提供了改变内部值的操作,比如Date可以setmonth,String 不可变只能创建新的对象,但是stringbuilder是不可变类型的可变形式

2.2对抽象类型的操作进行分类

Creators

构造器(从无到有)
Producers生产器:产生新的串

The concat() method of String , for example, is a producer: it takes two
strings and produces a new one representing their concatenation.

Observers观察器   判断类,boolen,大小
The size() method of List , for example, returns an int
 
Mutators change objects. 变值器,改变对象属性的方法
– The add() method of List , for example, mutates a list by adding an
element to the end.
 
构造器也可以是静态的,一些可以直接用的String.valueof(),List.of()都是直接构造了一个对象,而这种方法的
实现也叫做工厂方法,工厂模式:不用new+类,换成接口+实现类,调用实现类的方法创建。
 
变值器通常返回void,但是也肯返回非空比如set.add()会ture
3 ADT的例子
3.1 int和string 构造就是赋值,生产就是改变值,观察就是看是不是相等,长度,没有变值器,不可变
List 可变    构造器 Arraylist linklist,生产器:
Collections.unmodifiableList只读一个链表,观察器:大小某个元素  。变值器:加减排序

 

 总结:不同类型转化的产生叫构造,同一个类型产生叫生产,比如1和2.

观察器:类中的内部属性查看也是,比如map的keyset

最后一个:指针可变,指向新的行

 

4 设计ADT

4.1原则:要么通用,要么具体分别对应抽象和具体

 

5  表示独立性:RI

5.1 不管内部如何实现,只要完成操作即可

 

RI的例子???没有明白目的是什么

目的:是举例子实现MyString 用两种不同 的ADT实现

 

例子2:ADT设计原则:保持独立性,主函数不应该依赖具体的方法(已知数据类型进行操作),只需要调用子类方法,和实现方式无关

 

 

 规约:/**和方法的签名都是规约

Representation:Rep,叫做表示,指用到的R空间

实现:具体实现

 

6 测试ADT

 

 

 

7 不变量

7.1保持不变量:每次使用到之后都要检查用户是否恶意修改

保持不变量的方法:

 

 private和final

 

缩放三角形的例子?

 

 

 有很多问题:

1 public改成final

7.2  避免表示泄露的方法:

返回一个新的实例内容一样

返回一个当前变量的不可变版本

 

8 RI表示不变量和AF抽象函数

8.1 AF就是从R->A的映射,一定满射

 

 

8.2 RI的定义:

 

 8.3:

rep不变量和抽象函数都应该记录在代码中,就在代表声明旁边自身:

 

 

理解:R就是自己定义的String s可以随意取值,

RI是真正合法的s,一些符合特殊条件的s就是RI,说明范围。

AF是具体如何映射的

 

同样的表示空间R,可以有不同的RI(一样的s,不一样的规定)
 
RI是R的子集,映射到A的那一部分
 
 
即使是同样的R、同样的RI,也可能有不同的AF,即“解释不同”。(一样的s,一样的要的s,但是解释不同)
AF是对从RI到到A的解释

 

 

 
总结:RI和AF都是对R进行修饰的,你定义的抽象的属性,都需要RI来约定范围,需要AF来说明为什么范围是这样,需要具体解释每个RI的原因
比如:

 

 

 

 就像:R是一个广阔的空间,我们只是用了一点点的RI约束的空间也就是面积,建造的栅栏就是AF,因为我们用到的数据是有限的只要说明每一个映射关系(R的一小部分对应到A中,是如何对应的,用到的一定对应,圈外面就不对应)就ok

 

 

 

8.3.2举例子的problems?????rep的题目

 

 RI:偶数,按照从小到大

AF:两个一组,前一个字母到后一个字母的所有字母集合的和

如 acgg ,a-c为abc ,g-g为g,映射的A空间为a,b,c,g

map to就是映射的意思

 

ADT的一些题和例子

 

必须写到文档中

questions:


 

 第一个需要知道,要使用,第二个和第五个第六个不需要知道,客户只需要使用得到值就可以,构造和查看需要,使用的值需要知道。

 

2 哪个是可能的RI?

 

 画圈的可能是,因为RI一定是逻辑值

 

 

 

 

 

 选择合适的RI:包括两方面要求:

1 适合方法的功能,保证满足条件的串一定实现想要的功能:

在删除c的功能中,第四个RI不能保证重复出现的c被删除,不可以

而在1 和 3 中保证了不会有重复的,可以实现

2 在满足条件的RI下操作后的结果也是符合RI的

第一个添加功能之后不能保证字符的顺序,

 

 

 

 两个一块查找的只有第二个能保证功能确保串是偶数长度

 

检查不变性:Checkrep()检查是否RI发生了改变,破坏了不变性

 

 在所有return 前都要检查

 

 

 9 有益的可变性
改变R可能更好
 
10记录AF、RI和Rep暴露安全
 

 

 一个写好的例子:

RI,AF,保持不变性

细节:名字规定了string 形式,保持不变性:还有string本身就是不可变类型。再加所有的都防御式拷贝再返回

 

注意:规约时写的值只能时A空间的

 

 

 

表示泄露
违背RI不能保证输入数据符合条件
 
12:

ADT不变量替换前提条件

 

自己多写一个sortedSet的ADT,保证输入的正确性,简化规约了

具体的条件在sortedset里面

不用对两个一样参数都进行判断

 

总结:1 ADT主要由操作决定性质

2 4种操作方法

3 规约

4 好的ADT的原则

5 用4种方法测试ADT

posted @   dawang3  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示