首页 > 其他分享 >关于ADT的一些思考

关于ADT的一些思考

时间:2024-05-28 21:16:02浏览次数:19  
标签:ADT String 数据类型 List client 关于 思考 可变

ADT基本概念

1.什么是ADT?

抽象数据类型(Abstract Data Type,ADT)是将数据对象,数据对象之间的关系和数据对象的基本操作封装在一起的一种表达方式,是用于简化描述抽象算法,分类与评价数据结构,形式描述程序设计语言的类型系统。

在ADT设计时,首先要考虑对不可变类型的满足,虽然不可变类型在程序运行时会产生大量的重复信息复制,但能确保已经定义的变量不会被其他地方修改,在保障代码安全性的同时,也保障的线程安全性。其次,还需要ADT还需要具备表示独立性,因为要设计良好的数据结构,就需要考虑如何通过封装来避免用户端获取数据的内部表示,避免潜在的bug,即在client和implementer之间建立“防火墙”。

2.ADT的三个特性

① 表示泄露:保障了ADT内部表示不会被客户端其他代码任意篡改。

② 抽象函数AF:通过映射得到用户端希望的内容。

③ 表示不变量RI:对ADT内部表示进行限制,获取到希望表示的信息。

2.1 Abstraction and User-Defined Types(抽象和用户定义类型)

①除了编程语言所提供的基本数据类型和对象数据类型,用户可以定义自己的数据类型。

②数据抽象:由一组操作所刻画的数据类型。

③抽象类型:强调“作用于数据的操作”,程序员和client无需关心数据是如何具体存储的,秩序设计和使用即可。

 eg: An abstract data type Bool has the following operations:

2.2 Classifying Types and Operations(对类型和操作进行分类)

①可变数据类型和不可变数据类型

可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址不发生改变,对于这种数据类型,就称可变数据类型,当可变数据类型改变时它实际上是更改了内存中的内容。

不可变数据类型:当该数据类型的对应变量的值发生了改变,那么它对应的内存地址也会发生改变,对于这种数据类型,就称不可变数据类型。其中基本数据类型都是不可变数据类型,例如int,如果一个int类型的数据发生改变,那么它指向了内存中的另一个地址,但是需要注意的是java缓存了所有-128-127的值。

String & StringBuilder

String: 不可变数据类型

StringBuilder:可变数据类型

注:对于可变数据类型在非必要的情况下尽量不要重写两个函数,对于不可变数据类型,在重写equals时一定要重写hashCode,否则若hashCode不相同不会继续比较equals.

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

creator(构造器): t* → T

producer(生产器): T+, t* → T

observer(观察器): T+, t* → t

mutator(变值器): T+, t* → void | t | T

(T:抽象形本身;t: 其他类型)

例子:

构造器:String.valueOf(Object Obj)

生产器:String.concat() is a producer (concat: String * String -> String)

观察器:List.size() is an observer (size: List ->int)

变值器:Set.add() returns a boolean indicates whether the set was actually changed.

            Component.add()  returns the object itself

说明:

构造器:可能实现为构造函数或静态函数,作为静态方法实现的构造这通常被称为工厂方法。

变值器:通产返回void,如果返回值为void ,则必然意味着它改变了对象的某些内部状态。

2.3 Abstract Data Type Examples

①List: List 是Java的列表类型并且是可变的;

List也是一个接口,这意味着其他类提供数据类型的实际实现。

-------creator: ArrayList and ListedList constructors, Collections, singletonList

-------- productor: Collections.unmodifiabledList

-------- observer: size, get

-------- multator: add, remove, addAll, Collections.sort

2.4 Designing an Abstract Type

设计好的ADT,靠“经验法则”,提供一组操作,设计其行为规约spec

经验法则1:设计简洁.一致的操作

经验法则2:要足以支持client对数据所做的所有操作需要,且要用满足client需要的难度要低。

2.5 Representation Independence(表示独立性)

表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部SPEC和客户端。例如,List提供的操作与list是否表示为数组的linked list无关。

3.总结

ADT就是定义了一些操作的集合,其中对每个操作都有明确的spec,来确保用户能够正确使用这个ADT,比如RI,AF,不变量等概念都是在实现时程序员去思考的,然后以注释的形式写进去的,不会被client看到,正是这些特征才能保证ADT是真正作为一个中介在客户端和程序员之间作为桥梁,客户通过文档了解ADT的功能去使用它,程序员通过ADT的特征去用具体的实现去表示,同时遵循这些特征才能保证ADT的对于用于用户来说是完全独立于实现的,因此这些特性是必要的。

标签:ADT,String,数据类型,List,client,关于,思考,可变
From: https://www.cnblogs.com/zhh200442/p/18218888

相关文章

  • 关于Visitor模式的一些看法
    访问者模式(Visitor)1.意图表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。2.适用性在下列情况下使用Visitor模式:一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。......
  • 人生思考---公司不养闲人
    任何一家公司的辉煌不过20-30年,公司的辉煌皆存在时代属性,从公司到个人,个人的职业生涯同样如此;-------------------------------------------------------------------------------------------------------------------------------学习技术?技术的迭代是快速的,当前是以轻微的技......
  • 关于宏的理解
    关于宏的理解,用宏函数举例宏会把我们的内容编程一段代码,但是我们宏用的一切都不是变量,就是一个构建代码的符号。比如下面的例子 charstr1[]="1234"; constchar*str2="1234"; charst3[5]={'1','2','3','4','\0'}; charst4[5]={'1&#......
  • 关于neo4j的下载
    neo4j下载链接Neo4jDeploymentCenter-GraphDatabase&Analyticsjdk17下载链接JavaDownloads|Oracle打开链接之后一直下滑,找到如下所示界面  选择community和Windows下载成功后,将zip压缩包进行解压。进入E:\neo4j\neo4j-community-5.20.0\bin目录下,点击鼠标右键,......
  • 【梦想起航】关于2024年科研学术交流项目 招募计划
    科研学术交流项目招募计划书一、项目背景与愿景    随着科研学术领域的蓬勃发展,中国学生及科研工作者在学术领域的贡献日益显著。为更好地展示中国学术的繁荣与成果,我们计划搭建一个科研学术交流网站,旨在为中国学生提供一个投稿论文、交流学术思想、展示科研成果的平台......
  • 关于报错:npm下载时出现node_modules\.pnpm\[email protected]\node_modules\node-s
    关于npminstall出现Failedin911msatF:\Sert-Vue-master\vue\node_modules\.pnpm\[email protected]\node_modules\node-sass ELIFECYCLE Commandfailedwithexitcode1. 最开始从GitHub拉了一个项目,然后npmi的时候出现了报错npmERR!gypERR!stackError:`......
  • 关于Vearch在大模型中使用的一些实践
    背景这两年来大模型及其热门,不仅各大厂家的模型层出不穷,各类RGA、Agent应用也花样繁多。这也带火了一批基础设施,比如Langchain、向量数据库(也叫矢量数据库-VectorDatabase)等。现在市场上的向量库种类特别繁多,但主要还是分为两类,一类是在原有数据库基础上增加了向量相似性检索的......
  • HITSC_6_Abstract Data Type (ADT)
    AbstractionandUser-DefinedTypes......
  • 关于STM32单片机的一些事情-1.1
    1.1.1回顾:上一篇博客我们一起了解了一下:stm32工程文件的建立,以及使用hal库函数去操作单片机。本篇我们将继续探讨STM32的一些事情。1.1.2GPIO简介GPIO(GeneralPurposeInputOutput)通用输入输出口可配置为8种输入输出模式引脚电平:0V~3.3V,部分引脚可容忍5V输出模式下......
  • 关于形式化方法
    什么是形式化方法?形式化方法定义为建立在严格数学基础上的软件开发方法,它使用形式化的数学规格说明来生成计算机软件。形式化方法是一种基于严格数学基础的技术,用于计算机软件和硬件系统的描述、开发和验证。该方法通过应用数学符号和逻辑推理,以提供精确的系统规约和验证,从而确保......