软件构造——等价性

ADT中的等价性

判定等价性的两种方式(一)——AF定义等价性(AF等价性)

  • ADT的概念:首先要清楚ADT是根据数据特征的行为操作对它们进行分类抽象的而不是根据数据本身的表示方式抽象的。简要来说在ADT中我们只关心数据上可以实现哪些操作行为,而并不关系内部我们是用点图、边图还是列表、集合等其它形式表示的。因此我们忽略数据具体表示形式根据它们特征行为进行抽象,得到新的表示形式。
  • AF的概念:根据ADT的概念,我们会忽略数据内部组织方式(即内部表示),而根据数据行为操作将它们重新组织起来(即抽象表示),而究竟是将具有哪些行为特征的数据组织在一起呢,这个问题就是AF来说明,AF也就是从内部表示空间R到抽象表示空间A的映射函数(也叫抽象函数Abstract Function)。
  • 使用AF来定义ADT等价性
    • 原理:根据上述介绍,我们就可以很好理解为什么可以使用AF来定义等价性了,因为我们只专注于数据能实现哪些操作,操作后的变化什么样,而它内部究竟怎么表示的这只是编写程序的程序员需要考虑的事情,站在外部客户端的角度,我们并不关心。
    • 等价性的充要条件:对于使用AF来定义等价性的情况,我们说对象a等价于对象b,当且仅当AF(a) == AF(b)

判定等价性的两种方式(二)——通过观察定义等价性(观察等价性)

  • 通过观察定义等价性
    • 等价性的充要条件:对于通过观察定义等价性的情况,我们说对象a等价于对象b,当且仅当调用对象a中任何的方法得到的结果与调用对象b中任何对应的方法得到的结果完全一致

判定等价性的两种方式比较:AF等价性与观察等价性

  • 两种角度都比较对象a和对象b得出的结论可能不一致
  • 并不是所有的对象都可以使用AF等价性和观察等价性判断的
    • 如果AF并没有以注释的形式给出,那么我们自然无法判断AF等价性
    • 如果该种对象所属类型中只有creator(更普遍的只有一种方法的情况),那么由于测试creator,producer,mutator必须借助observer;而测试observer必须借助creator,producer,mutator,所以我们无法判断观察等价性

“==”与“.equals()方法”

  • “==”:比较两个引用指向的地址空间是否一致,不管所比较的两个引用指向的地址空间中存储的两个对象的关系,因此此操作符用来比较两个引用是否具有引用等价性。
  • “.equals()”:比较两个引用所指地址空间中对象是否一致(此一致的标准需要程序员重写指定),因此此方法用来比较两个引用是否具有对象等价性。
  • 两种方法的选择:
    • 基本数据类型
      • immutable:使用“==”, (没有对象没有引用的概念)
    • 对象数据类型
      • immutable:使用重写的.equals()方法比较内部对象是否等价
      • mutable:通常使用“==”或不重写直接继承自Object类的.equals方法(对应“行为等价性”,如StringBuilder类型的equals);很少情况使用重写的.equals方法(对应“观察等价性”,如Date类型中的equals、List类型中的equals)

.equals()和.hashCode()方法

  • 如果两个对象.equals()的结果为true,则它们的hashCode()的结果必须相同,反之不一定满足
posted @   dcyyyyyy  阅读(107)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示