[HIT 软件构造] ADT 与 OOP

谈谈我对ADT与OOP的了解与它们的等价性,软件构造知识点的主观理解。

Abstract Data Type(ADT):抽象数据类型
Object-Oriented Programming(OOP):面向对象编程

先说ADT

ADT是通过封装用来避免客户端获得数据的内部表示的,否则会造成表示泄露。
ADT包含 AF 抽象函数RI 表示不变量

传统的数据类型重点关注数据的表示,而抽象数据类型将目光聚焦于操作,让开发者无需担心数据的具体存储,只需要设计操作即可。

mutable可变数据类型:这里的可变指值可变,对于赋值操作将修改该引用指向的值,比如Date。
immutable不可变数据类型:相对的,引用指向的值不可变,对于赋值操作会开辟新的空间并修改引用,比如String。
final:限定引用不可修改,即内存地址。

ADT的四种操作
  1. creator 构造器:类似于构造函数,创建一个新对象。
  2. producer 产生器:基于原对象进行运算,返回一个新对象。
  3. observer 观察器:用于访问内部数据的值,表示泄露的重点关注对象。
  4. mutator 变值器:用于修改内部数据的值,受到限制与记录,安全的修改方式。
    以上是从功能上理解,我们也可以简单的根据输入输出进行区分。
    根据输入输出区分四种操作
    表示独立性:客户端使用ADT时无需关心内部如何实现,只需要直到如何操作,ADT内部实现改变时外部使用也不受到改变的影响。
    ADT分为A空间与R空间,A空间是客户端看到的数据类型,R空间是程序员看到的数据内部表示。
    AF:是R到A的映射函数。R中的值不保证合法,不一定在A有对应值。但A中的值起码在R中有一个值。
    RI:表示不变量,描述了什么样的数据合法。

再说OOP

OOP面向对象编程,用接口定义ADT,用类实现ADT。

特性:

  1. 封装与信息隐藏(保密性)
  2. 继承与重写(可扩展性)
  3. 多态、子类型、重载(可复用性)
  4. 静态域动态分配

接口中的方法,类都需要实现,也可以在接口中用default方法统一实现。

继承:继承父类中的所有属性和方法,并且可以添加新方法。
重写:用新的方法实现父类中的同名方法,具体调用由程序运行时决定。
可用super()复用父类中的方法,方便重写的时候省掉一大段重复的代码,稍作修改即可。

abstract 抽象类 关键词,子类中统一的方法直接在父类中实现,或者给出定义然后子类重写。
某些子类特有而别的子类没有的方法不应出现在父类中,而应在特定子类中实现,因为父类中有的方法,所有子类应都能实现。

重载 :同名同返回值方法定义的输入参数类型、数量的不同,实现对不同输入的选择处理,可以是同一个类中,也可以出现在父类与子类之间,运行是程序会根据输入进行选择方法。

泛型:用<>符号定义变量类型。
泛型接口,泛型的实现类,例如 List, 用E代指ADT数据变量类型,实现的方法相同,不管是int,还是String都能使用。

instanceof:程序员可用instanceof帮助程序判断一个实例对象是父类还是哪一个子类。
最大的父类Object,也就是类这个类。
ADT通用的一些方法,equals(),hashCode(),toString()。

ADT与OOP的等价性

因为有很多在客户端看来是同一个数据,然而实际上数据由两个空间保存,甚至用不同数据类型实现,在使用原有的equals方法判断时只会判断引用是否一致导致判断错误的情况,所以我们要提供新的equals方法帮助客户端判断。

首先,要分析数据表示的要求,判断哪些数据在客户端看来是相同的,也就是R空间中哪些值指向同一个A空间的值。然后重写equals、hashCode,要满足等价性就要满足自反、对称、传递,等价的对象要有相同的hashCode。方法直接或间接继承自Object类。

等价性又分为观察等价性与行为等价性。
观察等价性,即任何观察器的结果都相同。
行为等价性,即任何方法的结果都相同,显然强于观察等价性。

参考资料:
[1] Abstract Data Type (ADT).pdf
[2] Object-Oriented Programming (OOP).pdf
[3] Equality in ADT and OOP.pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值