本次博客是关于老师的讲课内容的学习笔记!因为ADT设计的后半部分比较重要所以需要记录一下。
属性的设置->数据结构课会涉及
涉及到r空间与a空间
R空间>对用户不可见
A空间>用户看到的
哪一个s属性的值是满足这个RI的
从小到大,允许出现重复字符
左上角,一看前四个就可以,后边的就8行
左下那个字符串对应的结果和tv是一样的
设计时尽量避免两个r’空间对应同一个a空间值,后面会涉及。要是非单射还要设置自己的一套规则
设计自己的ADT按照的顺序
先确定属性类(选择具体的数据类型,结构)
相同的AF可对应不同RI,同理RI可对应不同AF。
需要把AF和RI的选择详细记录在代码注释中(方便记忆代码)
把它们记下来。程序员自己用的。客户不可见
Q:哪些程序员能看到,哪些用户能看到?
所有这些程序员都可以看到。与属性沾边的,方法实现都是不可见的。
用户可以看到A空间的值。可以看到方法声明,看不到方法实现。
用户可见的包括前两项,中两项的声明和规约。
哪一个是合理的RI?
把RI理解为一条判定规则
只要有一句话是与属性相关的判定,那就是一条RI;第三条肯定不是一个判定了。
第一二句,第五句->
这些AF和RI哪些能够支持这个方法
Q:哪个方法违背
方法不能违反RI。
增加一个字符的操作->所有跟排序相关的全部违反
也只有最后一个能够支持。隐含了一个字符串长度大于0的要求
(4)
2.删掉一个字符,跟顺序相关的就不会出问题
字符串长度限制为偶数的就出问题了
对长度有要求的不支持。
(1)(3)
给一个字符,看集合里是否存在于集合里面
只有通过区间形式描述集合的支持、通过集合判断字符是否在区间里
设计有理数类
把af设计为分子/分母
并且设置一些限制,分母大于0这些,为了简洁设置一定是约分后的形式(可以砍掉,但是删除可能造成,分子分母其实不一样,但用户看到的值一样,不满足单射)后面还有例子
右边是具体实现。多了检测是否满足ri的检测
Check尽快地检测程序的错误,把错误尽早暴露
对应刚才的设计,满足满射和单射;但由于ri包含更多不需解释的值,不为双射(考试会出分析题)
不经过检测,在调用方法的时候才会报错。上图为checkrep具体使用方法
四类方法,前三类都需要对属性值进行更改,observer可以不用,它不进行更改,但是为了安全还是建议加一个
有的必须要加有的可以不加
对于check和afri设计的一些具体例子
9.有益的改变
Mutable多给了一个方法可以改属性值
给两个对象判断是否相等,肯定是判断a空间的值,站在用户的角度看。
Immutable可以允许的改变->改变了属性值,但在用户看来的结果是不变的
允许包含一种方法在r空间内改变对象的属性值,并不是说属性值绝对不允许改变。
A空间里是A,对应R空间里有a1,a2…只要在a空间不变,在r空间可以随便改。考试比较喜欢考这些极端情况。
Af和ri设计影响具体方法的实现。他俩简单会导致方法复杂
有益的改变->immutable的ADT内部表示的R空间中的取值则可以是变化的。
10.如何记录AF和RI,以及防止表示暴露(封闭性)
一些方法,下面是具体例子
表示暴露的安全性
用private和final进行限制,这两个值改不了了
只能看到不能改->immutable类型
Return的时候不返回mutable类型,通过函数改成immutable进行返回
考试:分析代码是否存在表示暴露,要求分析,找到错误,或修改代码
(但是100%会考)
出现了map和set,所有修改操作都可能出现问题
修改形式1.右上作defensive copy
形式2,返回immutable类型的set
经验总结:规约应该说什么
规约->给用户看的接口文件
用户看到的只能用A空间的特征(“值”)去描述,看不到R空间的属性
规约不只包含注释,还包含方法声明,也就是代码部分。
不能绕过类来更改类的属性,属性的引用表示mutable类型的引用(immutable的只能看不能改的)这种引用不能直接提供给用户。
对于独立性的探测,问一个adt是否合理,就从这三个标准来看
- 直角三角形的判断
检测它对属性值有没有改变操作
这里面没有对任何属性进行直接改变,都是创建新的值然后返回。这个就很棒。
考试就给一个类让你分析,是否符合
11. ADT不变量替换preconditions
在方法中增加用户输入检查
或者用户输入,程序负责修改,改成排完序的集合
把用户承担职责变小
这个是一个改变形式。
把限制放在程序里->创建新的类,把限制都放在类的RI里面
Usename的限制,创建一个类,把限制放进RI,程序负责对要求进行检测
Precondition是用户需要满足的要求,用程序进行检测,用户可以随意输入
这个过程就是一个ADT不变量替换负责Precondition过程。