软件构造week6

3.5 Equality
第一题
ADT的equals( )需要满足的三个性质是自反性、对称性、传递性

第二题
以下针对ADT等价性的说法,正确的:
如果对象a和b的R值被AF映射到相同的A值,则a和b等价
对对象a和b调用任何相同的方法,都会得到相同的返回值,则它们是等价的
不正确的:
对象a和b不等价,那么该ADT中不应存在任何方法op使得a. op()=b. op()
对象a和b是等价的,那么a和b的rep中每个field的值也- -定是相等的
解析:
A选项是从AF的角度判断等价性。
B选项是从外部观察者的角度来判断等价性。
C选项:是可以存在的这样的操作的。即使这个操作返回相同的结果,该ADT还应有其他操作会让a和b执行后的结果不同。
D选项:判断等价性取决于A值的等价性而非R值。很有可能多个R值对应于同一个A值。

第三题
Java中有两种不同的操作来验证对象的等价性,分别为==和equals(),它们的”学名”是引用等价性和对象等价性。

第四题
某个ADT的REP是:private int no;
private String name;他的AF是:
AF(no) == ID of a student  
那么以下equals( )正确的是:
return this.no == that.no
不正确的:
return this.no == that.no&&this.name == that.name
return this.no == that.no&&this.name.equals(that.name)
return this.name.equals(that.name)

第五题
针对mutable的Java类,有两种等价性,分别为观察等价性和行为等价性。

第六题
以下关于的等价性的说法,正确的是:
0bject类缺省的equals()是判断两个对象内存地址是否相等
若a和b满足a. equals(b)为真,那么a. hashCode()==b. hashCode( )也应为真
若a. equals(b)为假,那么a.hashCode( )b. hashCode()可以为真
不正确的:
针对mutable的类,由于其rep在变化,直接使用
判断是否相等即可,无需override equals( )
解析:
D选项:这要取决于实际需求。例如Java中List和Date等mutable的类,都override了equals()方法,实现观察等价性。

第七题
关于hashCode()的说法,正确的是:
具有相同hashCode( )返回值的两个对象a和b,必须做到a . equals(b)为真
不正确的:
若hashCode( )始终返回同一个值, 则违反了0bject对hashCode( )的要求
如果不override hashCode( )方法,object类缺省实现也可以满足要求
一个对象实例的hashCode( )返回值,在其生命周期内可以发生变化
解析:
针对C选项:还是要看需求是什么,不能一概而论
针对D选项: mutable对象的
hashCode在其mutator方法执行后,就会发生变化,因此在hash table中的位置也可能随之发生变化。

第八题
Date d = new Date(2019,4,1);
Set hs = new HashSet<>();
Set ts = new TreeSet<>();
hs . add(d);
ts. add(d);

d. setYear(2020) ;
println(hs. contains(d));println(ts . contains(d));

该代码执行后会打印出:
False; True
解析:
hashCode ,顾名思义,mutable对象的hashCode变化之后,只会影响受hashSet ,不会影响TreeSet

第九题
Date d = new Date(2019,4,1);
Date f = new Date(2019,4,1);
List al=new ArrayList<>();
List ll=new LinkedList<>();
al. add(d);
ll . add(f);
println(d.equals(f));
println(al.equals(ll));
该代码执行后输出的是:
True; True
解析:
Date是mutable的,它实现的是观察等价性,所以d和f两个值等价。
List也是mutable的,实现的也是观察等价性,所以判断其中每个元素的等价性,而d与f是等价的,故al和I也是等价的。这个跟其具体的类型( ArrayList和LinkedList )无关。

5.1可复用性
第一题
Programming for reuseProgramming with reuse二者的区别:
for:开发可复用的软件;with:用可复用的软件开发自己的软件
for:难点在于抽象
(abstraction),让开发出的软件能适应于不同但相似的应用场合
with:难点在于适配
(adaption),让自己的软件与来自外部的软件之间做好恰当的连接

第二题
Lab2中,你开发了Graph,然后在FriendShipGraph中使用Graph表示人与人之间的社交网络,此为
Module level reuse

第三题
为了让你的Lab2具备可视化功能,你决定复用Lab1的TurtleGraphics,于是在代码里加入import turtle.*, 然后在中用Turtle的相关类和方法执行图的可视化,此为
Library level reuse
解析:
潜藏的操作是你必须将turtle的jar包或.class目录加入你的项目path中。该jar表示个可复用的外部library。就如同:为了让你的程序具备Junit测试能力,你必须将junit.jar放入你的path里。

第四题
你在GitHub_上搜索了某个ConvexHull的算法,将其代码复制到你的Lab1中,这属于
Code level reuse
答案解析:
虽然不算“剽窃”,但如果你的软件投入商业用途,必须要遵循对方的开源许可协议

第五题
以下技术对开发高可复用性的软件有积极意义
泛型/参数化,例如Graph中的
使用interface定义操作,而非用class直接实现op
设计和实现abstract class
使用override和overload
将ADT的rep设置为private和final,并避免表示泄露
精心撰写符合要求的spec并生成Java Doc

第六题
Framework是一种典型的复用形态,它与传统的API复用存在区别,以下正确的是
API复用是将外部开发的API放到自己的代码中去调用,自己的代码是可执行程序的主体
Framework复用是将自己的代码填充到framework中,可执行程序的主体是framework
API复用的学习周期短,framework复用的学习周期较长
不正确的:
API复用的粒度大,framework复用的粒度小

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值