抽象数据类型(ADT)和面向对象编程(OOP)3.3 抽象数据类型

抽象类型的新颖性和不同之处在于对操作的关注:类型的用户不需要担心它的值如何实际存储

类型无论是内置的还是用户定义的,都可以分类为可变或不可变

可变类型的对象可以被改变

String是不可变的,因为它的操作创建了新的String对象而不是改变现有的对象

有时一种类型将以两种形式提供,一种可变形式和一种不可变形式。 例如,StringBuilder是String的一个可变版本(不可互换)

Creators (构造器)创建该类型的新对象。Creators可以将对象作为参数,但不是正在构建的类型的对象。

Producers(生产器)从该类型的旧对象创建新对象。 - 例如,String的concat()方法是一个生产者:它需要两个字符串并产生一个代表它们串联的新字符串。

Observers(观察器)获取抽象类型的对象并返回不同类型的对象,例,List.size(),返回的是int值

Mutators(变值器)改变对象属性的方法,List.add(),通过添加元素,改变list

String.concat() 是producer 

concat: String × String → String

List.size() 是observer

size: List → int

String.regionMatches 是 observer

regionMatches: String × boolean × int × String × int × int → boolean

Creator:可能实现为构造函数或静态函数

实现为静态方法的创建者通常称为工厂方法,String.valueOf()方法是作为工厂方法实现的创建者的其他示例

Mutator:通常返回void(如果返回值为void则意味着必然改变了对象的某些内部状态)

并不一定返回void   List.add()返回boolean类型

java的图形界面用户工具包 Conponent.add()返回对象本身

List(可变)

 int(不可变)

String(不可变)

设计抽象数据类型:基本信息不应该非常难以获得

表示独立性

一个好的抽象数据类型应该是独立于表示的,这意味着抽象类型的使用与其表示形式(用于实现它的实际数据结构或数据字段)无关,因此表示形式的变化对抽象类型本身之外的代码没有影响。

例如:List提供的操作与List是以LinkedList还是以数组(arraylist)表示无关。除非通过前置条件和后置条件充分指定了操作,否则您将无法更改ADT的表示形式,以便客户知道要依赖哪些内容,并且知道可以安全更改的内容。

一个好的抽象数据类型的最重要的属性是它保留了它自己的不变量(ADT负责确保自己的不变量保持不变,与客户端无关)

对于程序的每种可能的运行时状态而言,invariant都是程序的属性,它总是正确的。 - 不变性是一个至关重要的不变量:一旦创建,一个不可变对象在整个生命周期中应始终表示相同的值。

由公共方法调用维护 - 在方法执行期间可能暂时失效

为何保持不变量:推理代码更容易,如果已知某个不会改变,在debug时就不用考虑它,为另一个ADT创建一个不变也可以用它。如果只是用户保证不改变,还是要检查每一个用到该部分的代码

一定是满射,单射双射不一定。R:rep value    A:abstract value    表示空间  抽象空间

AF:一个抽象函数将rep值映射到它们表示的抽象值   AF : R → A

表示不变量RI:RI : R → boolean    a rep value r , RI(r) 是 true 当且仅当r 在 AF上有对应的A

抽象值空间本身并不决定AF RI

构造器生产器在创建对象时确保不变量为true,变值器观察器运行时保持不变性

三个标准检查ADT是否保持不变量:

①由creators producers创建②observers  mutataors保持③没有表示泄露发生

表示泄露的安全声明:给出证明表示代码并未对外泄露其内部表示

以注释的形式写RI  AF,不能写在Javadoc中,防止被外部看到,破坏表示独立性

原文地址:https://www.cnblogs.com/xgl122/p/9216708.html

时间: 2024-10-13 06:20:39

抽象数据类型(ADT)和面向对象编程(OOP)3.3 抽象数据类型的相关文章

学习面向对象编程OOP 第一天

面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个程序单元可以拼凑成一个完整的功能程序; 3.三个目标:重用性.灵活性和扩展性; 4.每个单独的对象或者单元都可以实现数据的接收.处理和发送; 5.在实际的项目开发中,都会使用达到OOP去声明类,而且在项目里面只用对象和类. 详细参考网址(根据原文学习的) http://www.cnblogs.com

2016/1/17 笔记 1,面向对象编程OOP 2,类

面向对象编程OOP 编程方式的发展 1,面向过程 重用性低 维护工作量大  2,面向对象 重用性高 维护容易 概念 1,对象 Object 一个具体的事物 是类的实例      2,类Class 同一类事物的统称 具有相同属性和行为的一类实体 特性:1,封装:  oop的核心思想           封装属性和行为,隐藏细节           保证内部数据完整性        2,继承: 子类自动继承所有父类的属性和行为           java是单继承 所有类的父类Object     

Python笔记5#面向对象编程OOP

▲面向对象编程OOP Object Oriented Programming.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行.为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度. 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递. 在Python

面向过程编程(OPP) 和面向对象编程(OOP)的关系

面向过程编程(OPP) 和面向对象编程(OOP)的关系 原文链接:http://blog.csdn.net/phphot/article/details/3985480 关于面向过程的编程(OPP)和面向对象的编程(OOP),给出这它们的定义的人很多,您可以从任何资料中找到很专业的解释,但以我的经验来看,讲的相对枯燥一点,不是很直观.除非您已经有了相当的积累,否则说起来还是比较费劲. 我是个老程序员出身,虽然现在的日常工作更多倾向了管理,但至今依然保持编码的习惯,这句话什么意思呢?我跟大家沟通应

24 Python - 面向对象编程OOP

面向对象编程OOP 01内容回顾 02属性@property本质是函数 未用属性前内容 使用属性后内容 @property  属性本质是函数,但是用起来像字段 03继承.多态示例 继承通过下面的一个基类 和一个派生类讲解 里面用到了继承和多态 [基类] [派生类] [函数调用] 04类嵌套如Employee引用Department 注意:在Employee的init()的参数中用department:Department来说明department是一个类,这样写有利于代码可读性 调用 原文地址:

23 Python - 面向对象编程OOP

面向对象编程OOP 01 方法__repr__()和__str__() __repr__()方法类似java中的toString方法,用于反馈类的相关信息且可以自己定义,一般用于开发人员控制台调试 __rept__()和__str__()方法区别 在控制台交互测试时: 输入b返回__rept__()方法结果 输入print(b) 返回__str__()方法结果,如果没有定义__str__()方法  则用__rept__()结果代替__str__()方法结果 __rept__()   打印信息一般

面向对象编程OOP Object oriented programing

oop是面向对象编程(设计) 面向对象程序设计(英语:Object Oriented Programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法论.它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性.灵活性和扩展性.基本理论 一项由 Deborah J. Armstrong 进行的长达40年之久的计算机著作调查显示出了一系列面向对象程序设计的基本理论.它们是: 类 类(Class)定义了一件事物的抽象特点.通常来说,类定义了事物的属性和它可以做到的(

php面向对象编程(oop)基础知识

面向对象并不是一种技术,而是一种思想,是一种解决问题的最基本的思维方式!如何理解使用?OOP:面向对象编程 (直接代码说明) 1.面向对象的基本概念示例demo: 1 <?php 2 header("Content-Type: text/html;charset=utf-8"); 3 //如何类的实例化? 例如: $newA= new a(); 利用类得到对象,过程是类的实例化.关键字new完成. 4 //如何定义一个类? 例如: class a{} 类 5 //如何声明定义属性

编程思想┊从实例谈面向对象编程(OOP)、工厂模式和重构

有了翅膀才能飞,欠缺灵活的代码就象冻坏了翅膀的鸟儿.不能飞翔,就少了几许灵动的气韵.我们需要给代码带去温暖的阳光,让僵冷的翅膀重新飞起来.结合实例,通过应用OOP.设计模式和重构,你会看到代码是怎样一步一步复活的. 为了更好的理解设计思想,实例尽可能简单化.但随着需求的增加,程序将越来越复杂.此时就有修改设计的必要,重构和设计模式就可以派上用场了.最后当设计渐趋完美后,你会发现,即使需求不断增加,你也可以神清气闲,不用为代码设计而烦恼了. 假定我们要设计一个媒体播放器.该媒体播放器目前只支持音频

面向对象编程(OOP)和面向过程编程

面向对象与面向过程 1.二者都是一种思想,面向对象是相对于面向过程而言的.面向过程,强调的是功能行为.面向对象,将功能封装进对象,强调具备功能的对象. 2.面向对象更加强调运用人类在日志的思维逻辑中采用的思想方法与原则,如抽象.分类.继承.聚合.多态等. 面向对象的三大特性: 1.封装 2.继承 3.多态 面向对象思想的概述: 一.程序员从执行者转化为指挥者 二.1.找具有所需功能的对象来用 2.如果没有此对象,就创建一个具有所需功能的对象. 3.简化开发,提高了复用性 三.类和对象是面向对象的