DRY、KISS、YAGNI 原则

共 19 题
#

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 在真实重复时应用 ✓ 正确答案
#

14. DRY 的边界中重复代码 vs 错误抽象?

A 错误抽象无害
B 任何重复都必须合并
C 合并需引入分支区分不同语义时是错误抽象,应保留独立 ✓ 正确答案
D 合并永不产生耦合
#

15. 复杂度预算中团队如何为变更设定"简单性预算"并在评审中把关,防止 KISS 沦为口号?

A 复杂度无需管理
B 复杂度预算限制了所有功能
C KISS 只是口号无需执行
D 为每次变更设复杂度上限,评审把关每个抽象的必要性,把 KISS 落地为可执行规则 ✓ 正确答案
#

16. 配置与脚本的单一来源中多环境配置、CI 步骤与文档中的重复如何用模板或生成消除?

A 文档无法自动生成
B 各环境各写一份配置
C CI 步骤无需复用
D 用模板/生成器让配置源、CI 步骤、文档单源,各环境产物自动生成 ✓ 正确答案
#

17. YAGNI 与可扩展性的平衡中为未来留接口 vs 为现在写代码

A 可扩展性意味着投机开发
B 应提前实现所有未来功能
C 为现在写代码,保持结构可演进(依赖抽象、低耦合),而非提前实现投机功能 ✓ 正确答案
D YAGNI 禁止任何接口
#

18. DRY 的复用层级中函数、模块与服务?

A 函数/模块/服务对应不同复用范围与代价,应用最小层级满足需求 ✓ 正确答案
B 复用层级越高越好
C 所有逻辑都应拆成服务
D 函数复用代价最高
#

19. 重复造轮子 vs 引入依赖中内部工具函数与成熟第三方库之间的 DRY 边界与决策依据?

A 依赖无任何风险
B 永远自研
C 永远用第三方
D 成熟通用能力用第三方库,核心业务或简单功能自研,权衡维护成本与风险 ✓ 正确答案