# 1. DRY 与 WET 的边界中哪些重复是必要的(如测试用例、模板代码、安全检查样板) A 模板代码必须抽象 B 所有重复都必须消除 C 测试用例应 DRY 合并 D DRY 针对知识与逻辑,测试用例、安全检查样板等必要重复应保留 ✓ 正确答案
# 2. Dan North 的"重复 vs 抽象"决策树中区分重复代码(结构重复)、重复意图(语义重复)、复制粘贴(无意重复) A 所有文本相似都该合并 B 语义重复(同一意图)才应抽象,结构相似但意图不同不应合并 ✓ 正确答案 C 复制粘贴应保留 D 重复类型与意图无关
# 3. Rule of Three(第三次出现时抽象)的边界;过早抽象(WET → DRY)的代价与案例 A 抽象越早越好 B 第一次出现就应抽象 C 第三次出现时才抽象,避免过早抽象基于不充分信息 ✓ 正确答案 D Rule of Three 与抽象无关
# 4. 抽象时机与团队规模中 5 人团队与 50 人团队对抽象阈值的差异 A 团队越大重复的维护成本越高,越应积极抽象;小团队宜降低抽象阈值 ✓ 正确答案 B 团队越大越不应抽象 C 团队规模与抽象无关 D 小团队应大量抽象
# 5. 框架代码与业务代码的相似度判断;何时抽公共模块(lib、kit)、何时保留各自独立 A 共享的是稳定领域知识且多个真实调用方时抽 lib,语义不同则保留独立 ✓ 正确答案 B 只要长得像就抽公共模块 C 公共模块无任何代价 D 所有相似代码都必须合并
# 6. 模板代码(boilerplate)的处理中 Lombok、JUnit Extension、Kotlin 委托属性、Macro A Macro 会提升可读性 B 应全部手写样板 C 用 Lombok、JUnit Extension、Kotlin 委托属性、Macro 等消除样板,但需权衡简洁与魔法 ✓ 正确答案 D 样板代码无法消除
# 7. 跨语言共享的"逻辑重复"——Java 与 Kotlin/Go/Scala 同步实现,如何通过 IDL 单一来源解决 A 各语言各写一份即可 B 用 IDL(如 Protobuf)作为单一来源,自动生成各语言代码,消除手工同步 ✓ 正确答案 C IDL 无法生成代码 D 跨语言重复无法避免
# 8. "Shotgun Surgery" 与 "Divergent Change"中识别是真正的耦合还是合理的分层 A 跨层修改一定是坏味道 B 两者完全相同 C Shotgun 是"一变化多处改"需聚合,Divergent 是"一处在多因变"需拆分,跨层修改是合理分层 ✓ 正确答案 D 两者都无需重构
# 9. "magic strings" 替换为常量的真实收益(编译期检查 vs 字符串拼写错误) A 常量/枚举引入编译期检查,拼错立即报错,并提供单一来源 ✓ 正确答案 B 常量与字符串等价 C 字符串拼错编译期就能发现 D 常量无收益
# 10. speculative generality(投机式抽象)的识别与回滚路径 A 投机式抽象是提前设计的好实践 B 接口只有一个实现、无真实多态需求即投机式抽象,应回滚展平 ✓ 正确答案 C 抽象层越多越好 D 投机式抽象无需识别
# 11. KISS 原则的工程实践中简单设计 vs 过度简化,如何识别过度工程并安全回滚? A 过度简化优于简单设计 B 越简单越好,可省略错误处理 C 过度工程是 KISS 的体现 D 简单设计保留必要健壮性,过度工程是多余抽象与泛化,回滚需先加测试固化 ✓ 正确答案
# 12. YAGNI 原则的工程实践中避免投机式开发,何时不做比做更正确? A YAGNI 与需求无关 B 应提前为所有未来可能做设计 C 不为虚构的未来需求投机开发,需求未明确时不做更正确 ✓ 正确答案 D 提前开发总是更主动
# 13. DRY vs KISS 的张力中何时接受重复以保持简单;DRY/KISS/YAGNI 三原则冲突时如何权衡? A 三原则相互矛盾无解 B DRY 永远优先 C KISS 永远优先 D 以真实需求为锚,YAGNI 限时机、KISS 限复杂度、DRY 在真实重复时应用 ✓ 正确答案
# 15. 复杂度预算中团队如何为变更设定"简单性预算"并在评审中把关,防止 KISS 沦为口号? A 复杂度无需管理 B 复杂度预算限制了所有功能 C KISS 只是口号无需执行 D 为每次变更设复杂度上限,评审把关每个抽象的必要性,把 KISS 落地为可执行规则 ✓ 正确答案
# 16. 配置与脚本的单一来源中多环境配置、CI 步骤与文档中的重复如何用模板或生成消除? A 文档无法自动生成 B 各环境各写一份配置 C CI 步骤无需复用 D 用模板/生成器让配置源、CI 步骤、文档单源,各环境产物自动生成 ✓ 正确答案
# 17. YAGNI 与可扩展性的平衡中为未来留接口 vs 为现在写代码 A 可扩展性意味着投机开发 B 应提前实现所有未来功能 C 为现在写代码,保持结构可演进(依赖抽象、低耦合),而非提前实现投机功能 ✓ 正确答案 D YAGNI 禁止任何接口
# 19. 重复造轮子 vs 引入依赖中内部工具函数与成熟第三方库之间的 DRY 边界与决策依据? A 依赖无任何风险 B 永远自研 C 永远用第三方 D 成熟通用能力用第三方库,核心业务或简单功能自研,权衡维护成本与风险 ✓ 正确答案