(2019春)软件构造:雨课堂试卷(三)(第5章)

5-1 可复用性

单选题 第1题 1分

Programming for reuse
Programming with reuse
二者的区别,不正确的是___

A for:开发可复用的软件;
with:用可复用的软件开发自己的软件
B with:开发可复用的软件;
for:用可复用的软件开发自己的软件
C for:难点在于抽象(abstraction),让开发出的软件能适应于不同但相似的应用场合
D with:难点在于适配(adaption),让自己的软件与来自外部的软件之间做好恰当的连接

正确答案:B
答案解析:

这道题你还错,说明本节课没听课…

有同学说“课堂上需要记忆的东西太多了”,我想说的是:不记忆点新东西,你的编程总是停留在之前写代码所养成的习惯中。要让课堂上这些一点一滴的东西逐步改变你的编程习惯。

单选题 第2题 1分

Lab2中,你开发了Graph,然后在FriendShipGraph中使用Graph表示人与人之间的社交网络,此为___

A Code level reuse
B Module level reuse
C Library level reuse
D System level reuse

正确答案:B

单选题 第3题 1分

为了让你的Lab2具备可视化功能,你决定复用Lab1的Turtle Graphics,于是在代码里加入import turtle.*,然后在中用Turtle的相关类和方法执行图的可视化,此为___

A Code level reuse
B Module level reuse
C Library level reuse
D System level reuse

正确答案:C
答案解析:

潜藏的操作是你必须将turtle的jar包或.class目录加入你的项目path中。该jar表示一个可复用的外部library。

就如同:为了让你的程序具备Junit测试能力,你必须将junit.jar放入你的path里。

单选题 第4题 1分

你在GitHub上搜索了某个ConvexHull的算法,将其代码复制到你的Lab1中,这属于

A Code level reuse
B Module level reuse
C Library level reuse
D System level ruse

正确答案:A
答案解析:

虽然不算“剽窃”,但如果你的软件投入商业用途,必须要遵循对方的开源许可协议

多选题 第5题 2分

以下__技术对开发高可复用性的软件有积极意义

A 泛型/参数化,例如Graph中的
B 使用interface定义操作,而非用class直接实现op
C 设计和实现abstract class
D 使用override和overload
E 将ADT的rep设置为private和final,并避免表示泄露
F 精心撰写符合要求的spec并生成Java Doc

正确答案:ABCDEF

单选题 第6题 1分

Framework是一种典型的复用形态,它与传统的API复用存在区别,以下不正确的是____

A API复用是将外部开发的API放到自己的代码中去调用,自己的代码是可执行程序的主体
B Framework复用是将自己的代码填充到framework中,可执行程序的主体是framework
C API复用的学习周期短,framework复用的学习周期较长
D API复用的粒度大,framework复用的粒度小

正确答案:D

5-2(1) Subtyping

单选题 第1题 1分

她是谁?
向大师致敬!
Barbara Liskov

A Margaret Hamilton
B Ada Lovelace
C Barbara Liskov
D Frances Allen

正确答案:C

多选题 第2题 2分

Behavioral subtyping必须要满足的条件,不包括以下__

A 子类型可以增加父类型中所没有的新方法
B 子类型override父类型的某方法,子类型方法需具备相同或更弱的post-condition
C 子类型必须要具备与父类型相同或更弱的invariants(不变量)
D 子类型override父类型的某个方法,不能比父类型方法抛出新的异常类型,但可比父类型方法抛出的异常更少

正确答案:BC

多选题 第3题 2分

关于Behavioral subtyping的说法,不正确的是___

A 子类型override父类型某个方法,其返回值类型应该与父类型方法的返回值类型相同或者更具体(子类型)
B 子类型override父类型某个方法,其参数的类型应该与父类型方法的参数类型相同或者更具体
C 某个类是immutable的,它可以派生出一个mutable的子类
D 子类型override父类型某个public方法,子类型中该方法的可见性可以为private

正确答案:BCD
答案解析:

C选项:java允许你这么设计,static type checking也可以通过,但却是违反LSP的,因为immutable也是invariant(不变量),子类型的invariant应该等于或强于父类型,而一个mutable的子类型就不再具备这个invariant。

D选项:把一个public方法override为private方法,那么如果用子类型的对象取代父类型对象,就无法调用这个操作了,所以无法取代,所以违反LSP。

单选题 第4题 1分

public class A {
public Object a (String d) {
return “”;
}
}
public class B extends A {
@Override
public String a (Object d) {
return null;
}
}
该段Java代码是否能通过static type checking?

A 能
B 不能

正确答案:B
答案解析:

虽然方法a在类A和类B里符合covariance和contra-variance,但因为Java不支持contra-variance,这里的@Override是不能成立的。

单选题 第5题 1分

public class A {
public Object a (String d) {
return “”;
}
}
public class B extends A {
public String a (Object d) {
return null;
}
}
该段Java代码是否能通过static type checking?

A 能
B 不能

正确答案:A
答案解析:

方法a在类A和类B里符合covariance和contra-variance,但因为Java不支持contra-variance,于是编译器就把B中的a方法看作了A中a方法的overload。

多选题 第6题 2分(错1)

void print(List list)
{…}
以下___作为参数传递进去不是对它的合法调用?

A List a;
B List<?> a;
C ArrayList a;
D List<? extends Object> a;
E List a;

正确答案:ABCD
//List<?>是LIst的父类

多选题 第7题 2分(错1)

void print
(List<? extends Number> list)
{…}
以下___作为参数传递进去不是对它的合法调用?

A List a;
B List<?> a;
C ArrayList a;
D List<? extends Integer> a;
E List a;

正确答案:BE
//C List是 ArrayList的父类

5-2(2) 组合与委派、框架复用

单选题 第1题 1分

关于delegation的说法,不正确的是___

A 某些功能不需要ADT自己来做,而是委托其他ADT来做(调用其他ADT的方法)
B 在类1的构造器里传入类2的对象,即可在类1里使用传入的对象调用类2的操作
C 为实现类1对类2的delegation,需要将类2作为类1的rep的一部分(即类2是类1的field)
D Delegation发生在object层面而非class层面

正确答案:C
答案解析:

选项C:不必需。可以动态传入类2的对象,然后调用其方法即可。

class A {

void a(B b) {
b.add();
}
}
在上面的代码中,B并未作为A的rep的一部分,只是在方法a中动态传入,然后调用b的add()方法。

单选题 第2题 1分

关于Inheritance 和delegation的说法,不正确的是____

A 如果类1需要使用类2的大部分乃至全部方法,则最好将类1设计为类2的子类
B 如果类1只需要类2的小部分方法,则最好通过delegation实现对类2的方法调用
C Delegation发生在object层面,而Inheritance发生在class层面
D 用A has a B或A use a B表示A和B之间的inheritance关系,用A is a B表示二者之间的delegation关系

正确答案:D
答案解析:
D选项:正好说反了

多选题 第3题 2分

关于Composite over inheritance原则,以下正确的是___

A 若用继承,子类不得不继承父类的全部方法,但子类可能并不需要这么多方法
B 子类的不同对象可能具备不同的行为,若用继承实现,则不得不定义大量具有不同行为的子类,麻烦
C 若用继承,子类和父类之间的关系在编译阶段即硬性绑定,难以在运行时动态改变
D 若用delegation,可隔离两个类之间的静态绑定关系,从而支持运行时实例之间关系的动态改变

正确答案:ABCD

单选题 第4题 1分

若事物o既有A行为(例如“飞”),也有B行为(例如“叫”),但具体如何实现这些行为可能会变化。那么ready for change的Java OOP设计是__

A 定义一个接口,在其中为A和B分别定义一组方法,然后为o设计一个类,实现该接口
B 为A和B分别定义一个接口,各自分别定义自己的方法;为o设计类,将其具体行为delegate到A和B的具体实现类
C 为o设计类,在类中添加A和B的行为作为其一组方法
D 针对A设计一个类,针对B设计另一个类,然后让o的类同时继承A和B的类

正确答案:B
答案解析:

A选项:如果o将来不再具备A或B的行为,那么需要修改该接口,会造成大量依赖该接口的类随之修改。
B选项:将两类行为分别放在不同接口里,o的类通过delegation调用两类接口的具体实现。这是CRP原理的恰当应用。

C选项:对接口编程,而非对类编程。

D选项:Java不支持多重继承。

单选题 第5题 1分

在这里插入图片描述
Lab2的P3按照上述UML图进行设计,那么GoGame类的place()方法(落子)的spec应该为____

A void place(Action a, …)
B void place(GoAction a, …)
C void place(…)
D void place()

…表示其他参数

正确答案:B
答案解析:

该题目的目的不是考核,而是帮你思考你的Lab2的P3设计是否有改进的空间。

记住软件构造的目标:
Ready for change
Safe from bugs
Design for reuse
Easy to understand
Efficient to run

第三章我们关注的是safe from bugs,本章开始关注design for reuse和ready for change,也是更难的东西。

多选题 第6题 2分

在这里插入图片描述
Lab2的P2按照上述UML图进行设计,这么设计的优点是____

A 客户端只需了解Game接口,无需获知其他任何信息
B 可容易的扩展其他棋类游戏(只需为Game和Action两个接口添加新的实现类)
C 如果要扩展支持真实的围棋规则,只需改GoAction类即可,最小化改变范围

正确答案:ABC
答案解析:

该题目的目的不是考核,而是帮你思考你的Lab2的P3设计是否有改进的空间。

记住软件构造的目标:
Ready for change
Safe from bugs
Design for reuse
Easy to understand
Efficient to run

第三章我们关注的是safe from bugs,本章开始关注design for reuse和ready for change,也是更难的东西。

单选题 第7题 1分

关于黑盒与白盒的framework的说法,不正确的___

A 白盒框架里实现了若干方法,用户程序通过override这些方法即可改变框架的行为
B 在黑盒框架里,用户编写类来实现框架提供的接口,框架运行时动态调用用户写的类中的方法
C 白盒框架的基本原理是inheritance,黑盒框架的基本原理是delegation
D 黑盒框架运行时主程序是用户写的类,白盒框架的主程序是框架本身的类

正确答案:D
答案解析:

没啥说的,看讲义吧
//白盒继承,黑盒是作为插件

多选题 第8题 2分

在这里插入图片描述
上图中表示delegation关系的是____
A a
B b
C c
D d
E e

正确答案:B
答案解析:

a和d,并非ADT之间的关系:这里的“终端用户”就是使用软件的真人了。

多选题 第9题 2分

在这里插入图片描述
上图中表示继承或实现关系的是____
A a
B b
C c
D d
E e

正确答案:CE
答案解析:

c是用户开发的具体类实现了Plugin接口,e是用户定义的类继承了framework所提供的抽象类。

5-3 面向复用的设计模式

多选题 第1题 2分

经典著作《Design Patterns: Elements of Reusable Object-Oriented Software》的作者是___
向前辈程序员致敬!

A Ralph Johnson
B Yoshua Bengio
C Yann LeCun
D Richard Helm
E John Vlissides
F Geoffrey Hinton
G Erich Gamma

正确答案:ADEG

单选题 第2题 1分

在这里插入图片描述
关于Adapter模式的说法,正确的是___

A Adapter类可提供被复用的方法,但与Client要求的spec不吻合
B Adaptee类用于将client的请求转化为对Adapter类的方法的调用
C Adapter类和Adaptee类之间的关系是delegation
D Adapter和ITarget之间的关系是inheritance

正确答案:C

多选题 第3题 2分

在这里插入图片描述
Adapter模式为何要设计一个ITarget接口,而不是由client直接请求Adapter的Request()方法?

A Client对接口编程,无需了解Adapter类
B Adapter类可能发生变化,接口隔离了该变化,不会影响client代码
C Adaptee类可能发生变化,需要隔离client与他的变化
D Client无法直接构造Adapter的实例,故需要增加接口

正确答案:AB

单选题 第4题 1分

关于Decorator设计模式的说法,不正确的是____

注:在以下选项中,A代表装饰之前的类,B代表装饰之后的类

A A和B二者具有共同的祖先类或实现共同的接口
B B中有一个成员变量,其类型为A
C B中的某些方法,通过delegation调用A的同名方法,并可扩展其他新功能
D B中不可以增加A中所没有的方法

正确答案:D
//B中可以添加A中没有的方法

多选题 第5题 2分

Stack t = new SecureStack (
new SynchronizedStack (
new UndoStack(s)
);
针对Decorator设计模式上述形式的client代码,以下说法不正确的是____

A 第三行的s的类型是Stack或其子类型
B 第三行的s的类型是UndoStack
C 第一行的t的运行时类型是SecureStack
D 第一行的t和第三行的s,其实是指向内存中同一个对象的两个不同alias

正确答案:BD

单选题 第6题 1分

针对Façade设计模式,以下说法不正确的是__

A 针对一个或多个已有的类,client需要调用它们的多个方法,故该模式将这些调用统一封装为一个方法对外提供
B 该模式降低了client端使用已有类的代价,减少了client与已有类之间的耦合度
C 该模式所构造的封装类中的方法一般用static类型
D 虽然减少了耦合度,该模式仍然需要client端显式构造出被封装类的实例

正确答案:D

单选题 第7题 1分

在这里插入图片描述
上图Strategy模式,说法不正确的是__

A ShoppingCart将pay()的职责delegate给了PaymentStrategy
B PaymentStrategy是接口,client的pay实际执行的是其某个实现类的pay()
C Client类不需要了解PaymentStrategy的任何实现类即可使用其pay()
D 若要扩展新的pay()策略,只需为PaymentStrategy增加新的实现类

正确答案:C
答案解析:

针对C选项:client必须要知道自己希望使用的是哪个pay策略,然后构造其对象,传入pay(PaymentStrategy p)方法,才能调用p的pay()方法。

多选题 第8题 2分

在这里插入图片描述
上图显示的Template模式,不正确的是__

A 上图的OrderProcessTemplate是“模板”,可以是接口,也可以是抽象类
B ProcessOrder()是模板方法,包含了对一系列操作的调用
C 如果OrderProcessTemplate中没有某个doXXX()方法的实现,则在NetOrder和StoreOrder中必须要实现它。
D Client可以更改对一系列doXXX()方法的调用次序。

正确答案:AD

多选题 第9题 2分

关于Iterator模式,不正确的是____

A 为了让你的类A具备iteration的能力,需要A实现Iterator接口
B 为了让你的类A具备iteration的能力,还需要构造一个实现Iterable接口的类作为符合A特定需求的迭代器
C Java里Iterable接口只有一个方法iterator(),它返回一个迭代器对象
D Java里Iterator接口有三个方法hasNext(), next(), remove()

正确答案:AB

发布了109 篇原创文章 · 获赞 1064 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/JAck_chen0309/article/details/105022454
今日推荐