重构与模式选型

共 21 题
#

1. 设计模式选型的决策树,根据变化维度(算法/对象创建/对象组合/行为)选择策略/工厂/组合/观察者,避免过度设计的 YAGNI 原则

A 算法变化用工厂模式,创建方式变化用策略模式
B 算法变化用策略模式,对象创建变化用工厂模式,组合结构用组合模式,行为通知用观察者模式 ✓ 正确答案
C 所有变化都应立即抽象成模式,无需考虑 YAGNI
D 模式选型与变化维度无关,随意选择即可
#

2. Replace Conditional with Polymorphism 中如何用策略/多态消除类型分支?

A 类型分支逻辑简单时也应强制用多态
B 该重构会增加类型分支,不利于扩展
C 多态重构无法消除条件判断
D 用多态把类型分支逻辑移到子类方法中,新增类型只需新增子类,符合开闭原则 ✓ 正确答案
#

3. 接缝(Seam)与依赖注入中如何在不改生产代码的前提下用接口、工厂或方法级注入替换依赖,让遗留代码可测

A 遗留代码不需要接缝就能测试
B 接缝与依赖注入无关
C 依赖注入必须改动生产代码才能实现
D 接缝是可在不改生产逻辑的情况下替换行为的位置,依赖注入是制造接缝的手段 ✓ 正确答案
#

4. Parallel Change(扩展-收缩)中新增兼容实现、双写双路径、迁移、删除旧实现的四阶段如何避免一次性断裂

A Parallel Change 只适用于数据库,不适用于 API 演进
B 应一次性删除旧实现,不做兼容
C 双写阶段无需比对结果
D 四阶段为新增兼容实现、双写、迁移、删除旧实现,能避免一次性断裂 ✓ 正确答案
#

5. Push Down Method 的适用场景中只有部分子类需要某方法时下移到子类,与方法上移(Pull Up Method)形成对称重构,如何决策?

A 所有方法都应上移到基类
B 只有部分子类需要的方法应下移,全部子类共有且一致的方法应上移 ✓ 正确答案
C 下移只适用于接口,不适用于类
D 上移与下移是同一操作,无区别
#

6. Strangler Fig 模式在遗留系统迁移中的实施中路由层逐步切流、数据双写与一致性窗口、回滚策略、与 Branch by Abstraction 的互补关系

A 数据双写会破坏一致性,不应使用
B Strangler Fig 要求一次性切换全部流量
C 通过路由层逐步切流、数据双写与一致性窗口,配合回滚策略渐进替换遗留系统 ✓ 正确答案
D Strangler Fig 与 Branch by Abstraction 无关
#

7. Extract Class 的重构步骤中如何识别单一职责边界、迁移字段与方法、处理双向引用,与 Extract Method 的差异?

A 先按 SRP 识别职责边界,再迁移字段方法并处理双向引用,与 Extract Method 是类级与方法级的不同提炼 ✓ 正确答案
B Extract Class 与 Extract Method 是同一操作
C 拆类无需处理双向引用
D Extract Class 按代码大小盲目拆分,无需考虑职责
#

8. 重构的节奏与安全网中小步重构 + 测试保障如何配合,与大规模重写的成本对比?

A 重构应一次性完成所有改动
B 大规模重写比小步重构更安全
C 重构不需要测试保障
D 小步重构配合测试保障比大规模重写成本更低、风险更可控 ✓ 正确答案
#

9. 重构的评审与协作中大范围重构如何分小步合并,避免长时间分支?

A 应把大重构拆成小步提交并尽快合并主干,避免长时间分支带来的冲突与失同步 ✓ 正确答案
B 大重构应长时间独占分支,避免被干扰
C 重构提交无需与功能提交分离
D 分小步合并会显著增加集成风险
#

10. 重构的风险控制中小步提交、测试保护与代码评审如何保障安全?

A 重构只要测试通过就无需评审
B 小步提交、测试保护与代码评审三者配合,保障重构行为不变、可回退 ✓ 正确答案
C 大步骤提交更利于定位问题
D 重构无法控制风险,只能依赖运气
#

11. 对象间搬移行为中 Move Method 与 Move Field 如何根据耦合方向与内聚性决定搬移目标

A 根据耦合方向与内聚性,把方法/字段搬到它真正依赖、关系更紧密的类中 ✓ 正确答案
B 搬移目标与耦合无关,随意选择
C 方法应搬到调用方最多的类,与数据无关
D Move Field 无法提升内聚性
#

12. 变异测试验证重构中为什么杀死变异体(mutation)比覆盖率更能证明行为未变

A 变异测试与覆盖率完全等价
B 覆盖率越高,重构行为一定不变
C 杀死变异体说明测试能捕获行为变化,比覆盖率更能证明行为未变 ✓ 正确答案
D 变异体存活说明测试有效
#

13. 重构 vs 重写的决策框架中技术债务四象限(审慎/鲁莽 × 故意/无意)、何时增量重构优于推倒重来、Martin Fowler "三次法则"与 Ward Cunningham 的债务隐喻

A 技术债务越早偿还越亏
B 重写永远比重构风险低
C 技术债务分四象限,增量重构通常优于推倒重来,三次法则指导抽象时机 ✓ 正确答案
D 三次法则指出现一次就应抽象
#

14. 重构的时机与信号中重复代码、过长参数列表、发散式变化如何触发对应重构?

A 重构应在代码不可用时才做
B 所有坏味道都用同一重构手法
C 重复代码用 Extract Method/Class,过长参数用 Parameter Object,发散式变化用 Extract Class 拆分 ✓ 正确答案
D 发散式变化应合并而非拆分
#

15. Branch by Abstraction 与 Strangler Fig 的区别中为什么先抽象接口再逐步替换实现能降低迁移风险?

A 先抽象接口会增加迁移风险
B 两者完全相同,都指路由切流
C Branch by Abstraction 是代码级抽象接口渐进替换,Strangler Fig 是架构级路由切流替换,先抽象接口可降低迁移风险 ✓ 正确答案
D 抽象分支要求一次性替换全部调用方
#

16. 反模式识别与纠偏中 God Class、Spaghetti Code、Shotgun Surgery、Feature Envy 的代码坏味道特征,以及如何用重构手法(Move Method/Extract Class/Introduce Parameter Object)系统性消除

A God Class 用 Extract Class、Feature Envy 用 Move Method、Shotgun Surgery 用 Move Method 收敛,识别特征后选对应重构 ✓ 正确答案
B 所有反模式都用同一方式修复
C Spaghetti Code 无需重构,等待重写
D Feature Envy 是正常设计,无需处理
#

17. 微服务上下文中的重构策略中单体拆分时的 DDD 限界边界识别、防腐层(ACL)隔离、数据库拆分的事务一致性过渡方案(dual-write → CDC → 单写)

A 用 DDD 识别限界上下文、防腐层隔离,数据库拆分用 dual-write→CDC→单写渐进过渡 ✓ 正确答案
B 单体拆分应直接切库,无需过渡
C 防腐层会提高服务间耦合
D 数据库拆分无需考虑一致性
#

18. 常用重构手法中 Extract Method、Move Method、Replace Conditional with Polymorphism 的步骤?

A Extract Method、Move Method、Replace Conditional with Polymorphism 都遵循识别-迁移-替换-测试验证 ✓ 正确答案
B 重构无需测试验证
C Move Method 不需要更新调用方
D Replace Conditional with Polymorphism 是增加分支而非消除
#

19. 模式选型的陷阱中什么时候引入模式是过度设计,如何用"需求变化点"判断?

A 过度设计不影响可读性
B 所有模式都应无条件引入,以体现专业性
C 抽象层越多代码越易于维护
D 当模式对应的需求变化点当前不存在时,引入模式是过度设计 ✓ 正确答案
#

20. 重构中的行为保持中每步重构都应保持可编译可测试,如何用特征测试(characterization test)验证行为不变?

A 每步保持可编译可测试,并用特征测试固化当前行为以验证重构不变 ✓ 正确答案
B 重构可以一次性破坏行为,最后再修
C 特征测试只用于新代码,不适用于遗留代码
D 重构无需保持可编译
#

21. 删除死代码中如何用调用图与版本控制安全识别不可达代码,为什么直接删比注释保留更好

A 删死代码无需版本控制,因为不可恢复
B 死代码应保留注释以防万一
C 调用图无法识别死代码
D 用调用图与静态分析识别不可达代码,版本控制保障可恢复,直接删比注释保留更好 ✓ 正确答案