wordpress自适应吸附菜单,重庆网站建设及优化,微信加精准客源软件,外贸怎样做网站ADT与OOP
1. ADT#xff08;Abstract Data Tyoe#xff09;操作的四种类型
ADT操作主要分为四种#xff1a; 构造器#xff08;creators#xff09;#xff1a;创造一个新的对象 生产器#xff08;producers#xff09;#xff1a;从一个已有的对象中生产出一个新的…ADT与OOP
1. ADTAbstract Data Tyoe操作的四种类型
ADT操作主要分为四种 构造器creators创造一个新的对象 生产器producers从一个已有的对象中生产出一个新的对象 观察器observers从一个抽象的对象类型中返回一个不同类型的对象 很简单的栗子就是各种getXX方法…… 变值器mutators改变对象属性的方法。通常返回void如果返回值为void则必然意味着他改变了对象的某些内部状态也可能返回非空类型 其中构造器和生产器可能会有些混淆对于构造器而言可能为实现的构造函数或者静态函数等而对于生产器就是从现有的对象出发产生一个新的对象。下面几个例子可以帮助理解一下 2. 表示独立性representation independence)
表示独立性客户端client使用ADT时无需考虑其内部是如何实现的ADT内部表示的变化不应影响外部的spec和客户端。
说白了就是不要客户端知道你代码的具体逻辑他们只需要知道代码的输入应该是什么给了合法的输入输出是什么就够了。
另外注意除非ADT操作指明了具体的前置后置条件否则不能改变ADT的内部表示——spec规定了客户端域代码实现者implementer之间的契约。
当然说是不清楚的还要给个栗子对吧 可以看出在java doc中并没有说明代码内部是如何实现的具体实现在这里不重要~客户只需要知道这段程序做什么的合法的输入会得到怎样的输出就足够了。 不变量Invariants、表示泄漏
不变量invariants
在任何时候都是正确的。应该由ADT来负责其不变量与客户端的人和也行为无关。生成一个‘person’对象总不能让客户端来设置person有两条腿吧客户设为三条腿还好万一设置成四五六七八条腿呢多可怕
为什么需要不变量保持程序的正确性容易发现错误。
再多的口水也不及一个栗子呀
首先这个是代码 那么让我们看我们优秀的客户端是如何使用的 天啊这个混蛋为什么改了名字没错这条推特被人盗了……盗图气不气
这也就引出了以下的概念
表示泄漏representation exposure
其将代码内部的数据泄露给了客户端这样不仅影响不变性也影响了表示独立性因为客户知道了你的代码内部的实现那么他就可以对你的代码进行一些你不希望看到的操作。诶呀~真可怕当然官方的解释是无法在不影响客户端的情况下改变其内部表示。晦涩……
或许你说那我把变量修饰为private然后在加上final这样变不了了吧。然而……呵呵哒
我们还是看个例子吧 注意红线部分此处Date是一个mutable的类型这样用确实对于该成员变量的引用不会改变。然而对于它内部的值呢 看此时的快照图 就算你是final修饰又如何骨子里善变该变还是要变的。所以对于这种mutable变量防御式拷贝也就起了重要的作用 这样就万事大吉啦另外构造方法处也要记得修改。当然在上一节已经详细说明了就不再赘余了…… 表示不变量RI、抽象函数AF 首先先来介绍一下表示空间R与抽象空间A 表示空间the space of representation values表示值rep 值的空间由实际实现实体的值组成。一般情况下ADT的表示比较简单有些时候也会用比较复杂的表示。 抽象空间the space of abstract values抽象值构成的空间用户看到和使用的值。 ADT实现者关注表示空间R用户关注抽象空间A。
注意R-A必须是满射但可以不是单射。
抽象函数R与A之间的映射关系的函数。
表示不变量RI某个具体的“表示”是否是“合法的”也可以把RI看做所有表示值的一个子集包含了所有合法的表示值或者看成描述了什么是“合法”的表示值的一个条件。
另外不同的内部表示需要设计不同的AF和RI选择某种特定的表示方式R进而指定某个子集是“合法”得RI并为该子集中的每个值做出一个“解释”AF——即如何映射到抽象空间中的值。
即使是同样的R、同样的RI也可能有不同的AF即“解释不同”。
设计ADT步骤
选择表示空间R与抽象空间A 给出RI——合法的表示值 如何解释合法的表示值——映射AF
同样给出再多定义不如一道例题收获的多 来解释一下这道例题
第一个RIs序列中的元素有小到大排序而且不允许相同
第二个RIs的长度为奇数s序列中的元素有小到大排序但允许相同
第三个RIs序列中的元素不允许相同
第四个RInull
现来看add方法其在s后面添加了一个c字符那么根据c的不同那么分别就不支持了第一二三个RI。
然后来看remove方法注意这个方法中只删除了第一个c对于之后c不删除所以如果s中存在重复字符那么就不满足remove的spec。所以其只支持一三。
再来一个栗子 乍一看好像四个都可以但其实注意该方法的实现这里遍历操作是一次扫描两个字符所以当s为奇数个字符时会出现空指针异常所以只能选第二个。
总结 不同的内部表示需要设计不同的AF与RI。
选择某种特定的表示方式R进而指定某个子集是合法的RI并为该子集中的每个值做出解释”AF“即如何映射到抽象空间中的值。
同样的R、同样的RI也可能有这不同的AF即解释不同。 ———————————————— 版权声明本文为CSDN博主「琴弦上的南柯合浦」的原创文章遵循CC 4.0 BY-SA版权协议转载请附上原文出处链接及本声明。 原文链接https://blog.csdn.net/qq_37549266/article/details/80707151