首页 > 其他分享 >06-ADT

06-ADT

时间:2024-05-28 21:35:27浏览次数:15  
标签:表示 ADT 06 数据类型 client 抽象 RI

抽象数据类型ADT

抽象数据类型与表示独立性: 如何设计良好的抽象数据结构,通过封装来避免客户端获取数据的内部表示(即“表示泄露”),避免潜在的bug——在client和implementer之间建立“防火墙”

ADT特性:表示泄露、抽象函数、表示不变量Representation Invariance 数学形式描述设计

目录

抽象与用户定义的数据类型

数据抽象:不在乎它本来是什么,而是“我们能如何操作它”。

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

例如我们对布尔值抽象地定义:

img

对数据类型与运算分类

数据类型:可变/不可变

运算类型:构造器/生产器/观察器/变值器

img

  • 构造器:通常以构造方法/静态方法实现,静态实现——工厂方法Factory Method
  • 变值器:大多返回void,意味改变了对象内部状态

实例

img

img

ADT设计

提供一组操作,设计这些操作的spec
准则:

  • 设计简洁、一致的操作
  • 要足以支持client对数据所做的所有操作需要,且用操作满足client需要的难度要低
  • 要么抽象、要么具体,不要混合 --- 要么针对抽象设计,要么针对具体应用的设计(数据类型要么用泛型L,要么针对具体情境设计,不能混合使用)

表示独立性 (重点)

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

除非ADT的操作指明了具体的pre-和post-condition,否则不能改变ADT的内部表示——spec规定了client和implementer之间的契约。

img

客户端使用了List的方法——一旦内部peopel数据结构不采用List实现,客户端需要做代码修改,考虑内部实现。不满足表示独立性。

ADT测试

  • 测试creators, producers, 和 mutators:调用observers来观察这些operations的结果是否满足spec;
  • 测试observers:调用creators, producers, 和 mutators等方法产生或改变对象,来看结果是否正确。
  • 风险:如果被依赖的其他方法有错误,可能导致被测试方法的测试结果失效。“方法测试之间的相互依赖性”
  • 按等价类划分编写测试用例测试

不变量

保持不变量:任何时候均为True 由ADT负责 与客户端行为无关

用来保持程序的“正确性”

总是要假设有程序恶意破坏不变量——防御式编程

mutable->表示泄露:不仅影响不变性,也影响了表示独立性:无法在不影响客户端的情况下改变其内部表示

保护方法:

  • final关键字
  • private属性
  • 返回mutable时的防御式拷贝
  • 最好还是使用Immutable类型数据

表示独立性与抽象函数

ADT开发者关注表示空间R, client关注抽象空间A

抽象函数AF:R->A 映射 可多对一 满射(R中部分值不一定合法)

表示不变性RI:RI : R → boolean

  • 表示不变性RI:某个具体的“表示”是否是“合法的”
  • 也可将RI看作:所有表示值的一个子集,包含了所有合法表示值
  • 也可将RI看作:一个条件,描述了什么是“合法”的表示值

AF与RI根据不同的内部表示有不同的设计形式

RI(子集合法标准) R(表示方式)一样 AF可能不同(解释不同)

设计ADT

  1. 选择R和A
  2. RI --- 合法的表示值
  3. 如何解释合法的表示值 ---映射AF(做出具体的解释:每个rep value如何映射到abstract value)

设计的思路 选择和解释要写入代码

  1. 注意写checkRep方法,在任何可能改变Rep的方法最后执行(都检查最好),确保RI时刻满足

有益可变性

immutable ADT:A应当不变 R中取值是可变的

通过牺牲immutability的部分原则来换取“效率”和“性能”

文档化

在代码中用注释形式记录AF和RI

  • 要精确的记录RI: rep中的所有fields何为有效
  • 要精确记录AF:如何解释每一个R值
  • 给出理由,证明代码并未对外泄露其内部表示——自证清白(预防表示泄露措施)
  • 注意:这个是用户可见的,只能用用户可见的内容撰写(参数,返回值,异常等),涉及到的值不可以是内部表示
  • 可以考虑用ADT不变量取代复杂的Precondition,相当于将复杂的precondition封装到了ADT内部。
    img

标签:表示,ADT,06,数据类型,client,抽象,RI
From: https://www.cnblogs.com/HaoranLuo/p/18218964

相关文章

  • 关于ADT的一些思考
    ADT基本概念1.什么是ADT?抽象数据类型(AbstractDataType,ADT)是将数据对象,数据对象之间的关系和数据对象的基本操作封装在一起的一种表达方式,是用于简化描述抽象算法,分类与评价数据结构,形式描述程序设计语言的类型系统。在ADT设计时,首先要考虑对不可变类型的满足,虽然不可变类型......
  • SD8906A恒定批量降压转换器集成电路IC同步整流器SOT封装
    该SD8906A是一个恒定频率,电流模式PWM降压转换器。该器件集成了一个主开关和一个同步整流器,无需外部肖特基二极管即可实现高效率。它是为单节锂离子(Li+)电池供电的便携式设备的理想选择。输出电压可调低至0.6V。该SD8906A还可以运行在100%的低压差操作占空比,延长便携式系统......
  • CSP历年复赛题-P1067 [NOIP2009 普及组] 多项式输出
    原题链接:https://www.luogu.com.cn/problem/P1067题意解读:模拟法依次输出多项式内容即可,但是需要考虑的周全,主要有以下关键点:1、系数为0时不输出多项式2、第一个符号,只有负号才输出3、次数不为0时,不输出为1的系数;次数为0时,输出所有系数4、次数为1时,不输出次数;次数为0时不输......
  • HITSC_6_Abstract Data Type (ADT)
    AbstractionandUser-DefinedTypes......
  • 【DRF-06】rest-framework之节流
    1.自定义节流类,基于用户IP限制访问频率1.1:自定义节流类importtimeVISIT_RECORD={}classVisitThrottle(BaseThrottle):'''#(1)取出访问者ip#(2)判断当前ip不在访问字典里,添加进去,并且直接返回True,表示第一次访问,在字典里,继续往下走#(3)循......
  • 代码随想录算法训练营第三十七天 | 860.柠檬水找零、406.根据身高重建队列、452.用最
    目录860.柠檬水找零思路代码 406.根据身高重建队列思路代码452.用最少数量的箭引爆气球思路代码860.柠檬水找零本题看上好像挺难,其实挺简单的,大家先尝试自己做一做。代码随想录思路    这题还有什么难不难的,这道题不是非常经典的入门题吗。......
  • 2000.1-2022.06.17中国经济政策不确定性指数日度数据
    2000.1-2022.06.17中国经济政策不确定性指数数据(日度)1、时间:2001.1.1-2022.06.172、指标:CNEPU(经济政策不确定性指数)3、来源:ChinaEconomicPolicyUncertaintyIndex4、用途:可用于量化我国经济政策的不确定性,预测宏观经济增长,分析政策波动对企业的影响5、指标解释:中国经济......
  • 06_整数拆分
    343.整数拆分给定一个正整数n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。返回你可以获得的最大乘积。示例1:输入:2输出:1解释:2=1+1,1×1=1。示例2:输入:10输出:36解释:10=3+3+4,3×3×4=36。说明:你可以假设n不小......
  • 梦断代码阅读笔记06
    梦断代码阅读笔记06阅读总结在阅读《梦断代码》这本书后,我深刻感受到编程不仅是一种技能,更是一种思维方式,它对日常生活中的问题解决和思考方式有着深远的影响。通过这本书,我学到了编程思维的重要性。书中强调了逻辑思维、创造性、自动化、数据分析和解决复杂问题的能力,这些都是......
  • hdu1069java
    给你n个方块,其中每个方块具有它的长宽高(方块可以任意旋转放置),方块数量不限。现在你要堆一个高塔,上面方块的长和宽必须严格小于下面方块的长和宽。问你能堆起来的最大高度。先将方块以长和宽按从小到大排序,然后从小到大以此为底,求出最大高度。dp[i]=max(dp[j])+i.height(j.x<i.x......