# 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 用调用图与静态分析识别不可达代码,版本控制保障可恢复,直接删比注释保留更好 ✓ 正确答案