文章目录
- 6-1 可维护性
- 单选题 第1题 1分
- 多选题 第2题 2分
- 多选题 第3题 2分
- 多选题 第4题 2分
- 单选题 第5题 1分
- 单选题 第6题 1分
- 6-2 面向可维护性的设计模式
- 单选题 第1题 1分
- 多选题 第2题 2分
- 多选题 第3题 2分
- 单选题 第4题 1分
- 单选题 第5题 1分
- 单选题 第6题 1分
- 单选题 第7题 1分
- 单选题 第8题 1分
- 单选题 第9题 1分
- 多选题 第10题 2分
- 6-3 可维护性构造技术
- 单选题 第1题 1分
- 单选题 第2题 1分
- 单选题 第3题 1分
- 单选题 第4题 1分
- 单选题 第5题 1分
- 多选题 第6题 2分
- 单选题 第7题 1分
- 单选题 第8题 1分
- 单选题 第9题 1分
- 多选题 第10题 2分
- 单选题 第11题 1分
6-1 可维护性
单选题 第1题 1分
涉及以下三个场景的软件维护活动分别称为___
1 将iOS 10下的App升级,使之能在iOS 11下运行;
2 用户报告一个功能bug,对该bug进行修复并重新发布;
3 为改善性能,发布一个补丁
A 预防性、完善性、纠错性
B 适应性、纠错性、完善性
C 完善性、适应性、预防性
D 纠错性、预防性、适应性
正确答案:B
多选题 第2题 2分
关于软件维护和演化的说法,正确的是___
A 在设计与开发阶段就要考虑将来的可维护性,而不是等到软件发布之后再考虑
B 对软件代码的频繁变化,可能导致软件复杂度的增加和质量的下降
C 软件开发的大部分成本来自于维护阶段
D 软件维护是软件开发团队中“运维工程师”的工作
正确答案:ABC
多选题 第3题 2分
以下___可提高软件的可维护性
A 高内聚、低耦合
B 每个类的责任应尽可能单一
C 遵循LSP原则设计类
D 抽象的模块不应依赖于具体的模块
E 避免类产生“表示泄露”
F 降低代码复杂度,提高代码可读性
正确答案:ABCDEF
答案解析:
A 显然,这是可维护性的最基本的原则
B “单一责任原则”SRP
C LSP原则
D OCP原则
E 信息隐藏原则
F 显然
多选题 第4题 2分
关于可维护性的说法,不恰当的是___
A 开发中使用的类的数量越多,就越难以保护
B 对新功能的扩展所影响的已有代码范围越小,可维护性就越高
C 客户端调用类的某个方法,方法所需的参数越多,将来维护的代价可能就越大
D 类结构里使用的overload和override越多,维护的代价就越高
正确答案:A
答案解析:
A 类的多少与可维护性无直接关系
B 这就是“可维护性”追求的目标
C 接口要尽可能小,参数多,交互复杂,维护困难
D overload和ovverride过多,影响代码的可理解性,的确会造成一定程度的维护性下降
单选题 第5题 1分
关于“开放-封闭原则”(OCP)的说法,不正确的是___
A 能够通过在已有类结构上增加新的类来进行扩展
B 对类结构进行扩展的时候,不应或应尽可能少的变化已写好的代码
C 为支持OCP,客户端不应该直接使用具体的类,而应尽可能使用接口
D 客户端使用接口来调用方法,即可避免声明特定实现类的对象
正确答案:D
单选题 第6题 1分
关于面向可维护性的OO设计原则的说明,不正确的是__
A 对client的需求分类,将client共同使用的一组方法放到同一个接口里,其他方法分离出去
B 如果client代码里出现了对某个具体实现类的调用,最好引入接口,使client避免直接接触类
C 尽可能降低类之间的耦合度,而类之间的delegation越多,耦合度可能就越大。
D 当发生需求变化时,首先考虑对原有代码进行修改,然后再考虑增加新类满足之
正确答案:D
6-2 面向可维护性的设计模式
单选题 第1题 1分
关于Factory Method模式,说法不正确的是__
A 如果不想在client代码中指明要具体创建的对象类型时,使用该模式比较合适
B 定义一个接口,其中包含工厂方法,然后在它的不同实现类中完成不同子类型的对象实例的创建
C 工厂方法可以被实现为静态的,即静态工厂方法
D 使用工厂方法创建的对象实例是接口类型,在client代码里使用instanceof
也无法得知其具体类型
正确答案:D
多选题 第2题 2分
Factory Method (FM) 和Abstract Factory (AF)模式,错误的是__
A AF模式为了解决客户端创建遵循固定搭配规则的多个不同类型的对象实例的麻烦
B AF模式在创建每个类型实例的时候,本质上是使用了FM模式
C Client不能仅使用AF的某个具体实现类来创建单个对象实例,必须要同时创建多个不同类型的对象实例
D Client可用多个FM来取代AF模式,可达到同样的目的
E 如果要改变不同类型的对象实例的固定搭配,只需扩展新的抽象工厂实现类即可
正确答案:CD
答案解析:
针对C选项:AF的实现类里提供了多个工厂方法,分别创建不同类型的对象实例,Client完全可以只调用其中一个而忽略其他。当然这么做就失去了抽象工厂方法的意义。
多选题 第3题 2分
关于Builder模式,错误的是__
A Client要的不是一堆零散的objects,而是一个完整的对象(由若干小的objects组成)
B Client不需了解各部分怎么创建、怎么组合,这些细节完全隐藏在Director类当中
C Builder在构造复杂对象内部各部分时,需要遵循严格的构造次序
D 可以支持多种不同的产品构建,只要为每一个产品实现一个具体的builder类即可
正确答案:C
单选题 第4题 1分
在上图所示builder模式中,负责将各个“部分”组装在一起的方法是_
A Builder
的buildPart()
B Builder
的getResult()
C ConcreteBuilder
的getResult()
DDirector
分的construct()
正确答案:D
答案解析:
construct()
是负责调用每一个“部分”的build方法,意即将一个对象的各个部分逐步构造出来。而getResult()
是获得组装后的结果(单一对象)。
单选题 第5题 1分
关于Bridge模式的说法,不正确的是____
A 通过delegation+inheritance建立两个具体类之间的关系,避免具体类之间的直接“接触”
B Bridge模式中两个具体对象之间的关系是在编译阶段就建立起来,在运行阶段实现delegation
C Bridge模式中,两个ADT对象之间的关系是永久保存的
D Bridge实现了两棵inheritance继承树,两棵树中的不同子类之间的关系根据client的具体需求在client代码中动态确定
正确答案:B
单选题 第6题 1分
关于proxy模式,说法不正确的是__
A 目的是在client
代码和具体被访问的类代码之间建立隔离
B Client
实际请求的Proxy
类和实际执行任务的类,二者实现同一个接口或具有相同的父类
CClient
代码必须知道Proxy
类的名字并new
一个Proxy
对象实例,否则无法使用其功能
D 可在Client
请求的Proxy
类中实现lazy initialization
、lazy loading
等,降低执行具体任务的类的负担
正确答案:C
答案解析:
C选项:当然可以使用factory method将proxy隐藏起来,对client不可见。
单选题 第7题 1分
关于composite模式,不正确的说法是__
A 该模式用来解决“递归包含”的问题,程序运行时的多个对象构成一棵树型结构
B 树型结构中的所有节点,实现相同的接口或继承自相同的类,符合LSP原则
C 每个节点对象具有一个集合类型的field,保存其下层的节点对象,集合内元素数量>0
D 该树型结构是在运行时根据client代码动态构建起来的
正确答案:C
单选题 第8题 1分
关于observer模式,不正确的是___
A 该模式在1
个subject
对象和一组observer
对象之间建立1
对多的delegation
关系
B Observer
对象调用subject
对象的attach()
方法,将自己加入到subject
对象的“粉丝”队列中
C 当subject
对象的状态变化时,它回调各个observer
对象的update()
方法
D 在Java
中,各具体observer
类要继承自Java Observer
类
正确答案:D
单选题 第9题 1分
关于visitor模式,不正确的是__
A 该模式可将一个ADT定义的某些特定操作从原ADT实现类中抽取出来,单独放在visitor实现类中
B 给原ADT传递进不同的visitor实现类的实例,即可对ADT对象实例做不同的操作,但无需改变原ADT的代码
C 被visit的ADT,需要提供accept(Visitor v)这样的方法,便于将一个外部visitor实例传递进来
D 被visit的ADT,可以提供诸如accept (Visitor v1, Visitor v2)的方法,即可支持对ADT做两个外部操作的组合
正确答案:A
答案解析:
A选项:形式上类似于该选项所述,但这并非是visitor模式的本意
D选项:一下子扩展两个操作?其实是可以实现的。
多选题 第10题 2分
以下关于Java中的-able
和-ator
的说法,不正确的是__
AComparator<T>
是个接口,其类要实现的方法是compareTo(T a)
BComparable<T>
是个抽象类,子类需要实现的方法是compare (T a1, T a2)
C Iterable<E>
是个接口,iterator()
是其类要实现的方法
DIterator<E>
是个抽象类,其子类要实现的方法有hasNext(), next(), remove()
E Observable
是个抽象类,其子类要实现的方法之一是notifyObservers()
FObserver
是个抽象类,其子类要实现的方法之一是update(...)
正确答案:ABDF
6-3 可维护性构造技术
单选题 第1题 1分
关于State设计模式,说法不正确的是__
A 使用delegation机制,将状态转换的行为委派到多个独立的State类中去完成
B 各具体State类分别代表对象能达到的某种状态,并负责完成在该状态下所能进行的状态转换,向客户端返回某个新状态的实例
C 避免了在ADT内部代码中使用if/else结构实现状态转换,支持将来状态可能的扩展
D ADT自己需要提供一个类似于accept(State s)
的方法来判断当前状态是否为最终状态
正确答案:D
单选题 第2题 1分
关于Memento模式,不正确的是_
A Originator
是需要备忘的类
B 一个Memento
对象代表“备份”的一次历史状态
COriginator
类利用Memento
和Caretaker
类管理一系列历史状态,随时进行备份和恢复
D 备忘和恢复的动作由client端代码发起,而非由Originator
类和Memento
类发起
正确答案:C
单选题 第3题 1分
class Caretaker {
List<Memento> ms = new ArrayList<>();
public void addMemento(Memento m) {
ms.add(m);
}
public Memento getMemento(int i) {
return ms.get(i);
}
}
如果client端想恢复离当前时刻最近的倒数第i次备份的状态,上述代码中的“?”应该是___
A i
B i-1
Cms.size()-i
D ms.size()-i+1
正确答案:C
单选题 第4题 1分
class Caretaker {
List<Memento> ms = new ArrayList<>();
Memento getMemento(int i) {
return ms.get(?);
}
Memento repeat(int i) {
return ms.get(??);
}
}
Client用getMemento(i)
恢复倒数第i次备份状态后,想调用repeat(i)
来撤销本次恢复,即重新回到恢复前的状态,那么上述代码中的“??”应该是___
A ms.size()-i
B i+1
C ms.size()-1
D 以上ABC均无法做到
正确答案:D
单选题 第5题 1分
关于Table-driven construction,说法不正确的是___
A 将代码中复杂的if-else
和switch-case
语句从代码中分离出来,通过查表完成
B 表驱动编程的运行效率会远低于传统的if-else
和switch-case
方式,需要折中考虑
C 待查的“表”,既可以是代码中的final
变量,也可以是外部文件或数据库(程序运行时从文件或库读入)
D 好处是当规则发生变化时,业务逻辑代码无需修改,提高了可维护性
正确答案:B
答案解析:
B:如果表是在代码中的fianl变量,其效率要高于if/else语句。
多选题 第6题 2分
以下关于Grammar的说法,不正确的是___
A 语法驱动编程适用于从外部读入遵循特定格式的文本数据并加以解析的场景
B Regular grammar是指grammar被简化之后可以表达为一个不包含任何非终止节点的产生式
C 正则表达式未必总是regular grammar
D Parse tree是parser根据特定grammar对某个字符串进行解析之后得到的结果
E 在grammar的操作符中,|的优先级高于*和+
正确答案:CE
单选题 第7题 1分
F :: = B? E N* M
B :: = >
E ::= : | ; | 8
N ::= - | ^
M ::= D | O | P
以下字符串__符合该语法定义?
A :-^[
B B:^D
C:---D
D <3
正确答案:C
单选题 第8题 1分
以下哪一对正则表达式所表示的字符串内容是等价的____
A
(cb*c)*
c(b*c)*
B
\?[a-z]+(y*by*)*
\?\w+(y)*(by?)*
C
(a|b|c*)*(d?)
(a|b|c*)*(c*|d)
D
([^abc]+x*)+
^a[bc]([^abc]*x*)+x
正确答案:C
单选题 第9题 1分
在Java正则表达式中,\d和\w分别代表__
A[0-9] [a-zA-Z_0-9]
B A whitespace character [^0-9]
C ^[a-zA-Z_0-9] [ \t\n\x0B\f\r]
D [^0-9] [^\s]
正确答案:A
多选题 第10题 2分
以下__字符串是符合下列正则表达式的合法字符串?
(\.[a-z]+\.)+[a-z]+(:[0-9]+)?
A hit.edu.cn
B hit.ed.u.c.n:88880?
C.hit.ed.u.cn:088888
D .hit.ed.u.cn
正确答案:C
更正:四个选项都不对。按照语法的结构,字符串分为三部分,其中第1部分在一组字母前后分别匹配一个“点”,按照这个规则,选项C和D中的“.hit.”先被匹配出来,后面跟的“ed”被语法中的第2部分匹配,然后“ed”后头的“."就没法匹配了。
单选题 第11题 1分
从语法的角度看,Java的编译器javac相当于__,与Java源代码相对应的AST相当于__
A Parser generator, Grammar
B Parser, Grammar
C Parser, Parse tree
D Parser generator, Parse tree
正确答案:C