软件构造week4

3.1(b)Mutability and Immutability
第一题
关于mutable和immutable的说法正确的是:
所有的简单数据类型和所有相对应的封装类(Integer,Double,Boolean等)都是immutable的
所有数组都是mutable的
使用immutable类型可以降低程序蕴含bug的风险,但其时空性能相对较差

第二题
针对final关键字,说法正确的是:
A final class declaration means it cannot be inherited
A final variable means it always contains the same value/reference but cannot be changed
A final method means it cannot be overridden by subclasses

第三题
String a = “a”;
String c = a;
a += “b”;
c += “c”;
StringBuilder b = new StringBuilder(a);
StringBuilder d = b;
b.append(“b”);
d.append(“c”);
假设执行之后未进行任何垃圾回收,此时内存里共有3个String对象和1个StringBuilder对象
此时c的取值是ac,d的取值是abbc

第四题
关于immutable和mutable data type的说法,正确的是:
使用不可变类型,对其频繁修改会产生大量的临时拷贝
可变类型可直接修改其值而无需太多拷贝,从而提高效率
不可变数据类型更安全,因为其值无法修改
使用可变类型做全局变量,可在不同模块之间高效率的进行共享数据读写

第五题
final List l1 = new ArrayList<>();
List l2 = new ArrayList<>();
A l1.add(“a”);
B l1.set(0,“b”);
C l1 = l2;
D l2 = l1;
上面无法通过static type checking的是C
因为l1为final

第六题
List k = new ArrayList<>();
k.add(“lab1 ends”);
Iterator it = k.iterator();
System.out .println(it.hasNext());
it.next();
System.out.println(it.hasNext());
k.remove(0);
System.out.println(it.hasNext());
输出的结果为true false true
第三个在迭代器迭代过程中用remove删除,iterator行为不可预知

第七题
List t = new ArrayList<>();
t.addAll(Arrays.asList(“a”,“b”));
Iterator i = t.itertor();
while(i.hasNext())
  if(i.next()==“a”)
    i.remove();
期望结果是t中只包含"b"
正常执行,结果与期望一致!

3.2 Specification
第一题
两个方法具有“行为等价性(behavior equivalence)”:
站在客户端的角度看,它们实现相同的功能
站在客户端的角度看,它们可能展现出不同的性能
它们具有相同的规约(spec)
其实是针对同一个spec来说是等价的。若对这个spec进行更改,这两个方法也许就不等价了

第二题
关于方法spec的说法:
程序员针对给定的spec写代码,需做到“若前置条件满足,则后置条件必须要满足”
前置条件是对client端的约束,后置条件是对开发者的约束
若客户端传递进来的参数不满足前置条件,则方法可直接退出或随意返回一个结果

第三题
在Java的语法中,使用@param表达一个方法的pre-condition,使用@return和@throws表达方式的post-condition

第四题
除非在post-condition中明确声明过,否则方法内部代码不应该改变输入参数
方法的spec描述里不能使用内部代码中的局部变量或该方法所在类的private属性
若在方法的post-condition中声明“client端不能修改该方法所返回的变量”,不能减少该方法的潜在bug
若为某方法设计JUnit test case,在任何test case中对该方法的调用必须遵循其pre-condition

第五题
如果修改了某个方法的spec使之变弱了,那么可能发生的是:
client调用该方法的代价变大了,即client需要对调用时传入该方法的参数做更多的检查
程序员实现该spec的难度降低了,自由度增加了
如果使用椭圆面积表示spec的强度,那么该方法的椭圆面积增大了
该spec的实现方式变多了

第六题
spec的强度:
前置越强spec越弱,后置越强spec越强,后置比较需要在相同的前置条件下。若前置后置都更强则无法比较

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值