反模式与代码坏味道

共 20 题
#

1. Primitive Obsession(基本类型偏执)中何时应该用值对象替代散落的字符串/数字参数?

A 当某个基本类型被反复校验或承载业务规则时,应用值对象封装以获得类型安全与行为内聚 ✓ 正确答案
B 用 int 表达金额与数量是安全的,无需类型区分
C 值对象会降低类型安全
D 基本类型偏执只在字符串场景出现
#

2. 反模式的系统性治理中如何用静态分析(圈复杂度/内聚度)自动识别并纳入 CI 门禁?

A 圈复杂度越高越好,代表方法更强大
B 静态分析只能人工执行,无法自动化
C LCOM 用于衡量方法的复杂度,而非内聚度
D 用圈复杂度与内聚度指标配合 CI 门禁,可自动识别反模式并阻止新债进入 ✓ 正确答案
#

3. Speculative Generality 中如何识别为将来可能用到而做的过度抽象,删除时的安全步骤

A 为未来可能用到而做的过度抽象是有价值的,应保留
B 删除抽象无需验证引用,直接删即可
C 识别信号是抽象只有一个实现或参数从不被传非默认值,删除前先确认无调用方 ✓ 正确答案
D 所有抽象都应删除,无论是否有使用者
#

4. Message Chains 与 Middle Man 中链式调用如何隐藏真实依赖,中间人只做转发时如何用 Hide Delegate 与 Remove Middle Man 重构

A 链式调用让真实依赖更清晰
B 两者都用 Remove Middle Man 重构
C Message Chains 用 Hide Delegate 隐藏链结构,Middle Man 用 Remove Middle Man 删除纯转发 ✓ 正确答案
D Middle Man 是很好封装,应保留全部转发
#

5. Feature Envy(依恋情结)中方法过度访问其他类数据时如何用 Move Method 纠正?

A 方法访问其他类数据是正常的,无需处理
B Move Method 是把方法移到调用方附近
C 用 Move Method 把方法移到它依赖数据的类中,让行为与数据内聚 ✓ 正确答案
D Feature Envy 与数据归属无关
#

6. God Class 的识别与拆分中按职责内聚度拆分,如何避免拆出新的"上帝类"?

A 按职责内聚度分组,用 Extract Class 拆分,并明确每个新类的单一职责避免新上帝类 ✓ 正确答案
B God Class 拆分应盲目按大小切分,无需考虑职责
C LCOM 高说明内聚好,不是 God Class
D 拆出的类无需保证单一职责
#

7. 数据泥团(Data Clump)中重复出现的一组字段如何提取为类,保持行为内聚?

A 任何成组字段都应无条件提取
B 数据泥团无需处理,重复字段无害
C 提取字段组会破坏行为内聚
D 重复成组出现的字段应提取为类,并封装相关行为,实现内聚 ✓ 正确答案
#

8. 坏味道度量指标中圈复杂度、LCOM(方法内聚缺乏度)在自动识别中的作用与局限?

A 圈复杂度高一定代表坏味道,必须重构
B LCOM 用于衡量代码行数
C LCOM 衡量方法间共享字段的程度,LCOM 高预示内聚差,但指标是启发式需人工复核 ✓ 正确答案
D 指标可完全替代人工评审
#

9. 反模式治理的落地顺序中静态扫描 → 评审清单 → 渐进重构 → 门禁的推进路径?

A 直接大规模重写,无需扫描与门禁
B 先静态扫描建立基线,再评审清单、渐进重构,最后设 CI 门禁 ✓ 正确答案
C 门禁应在静态扫描之前设置
D 评审清单可替代静态扫描与门禁
#

10. Data Class 中只有 getter/setter 的类如何用 Move Method 承载行为,何时应封装集合并暴露意图方法

A 只有 getter/setter 的类应通过 Move Method 承载行为,并对集合封装暴露意图方法 ✓ 正确答案
B Data Class 是理想设计,无需改进
C 集合应直接暴露原始引用,便于外部修改
D 意图方法会降低可读性
#

11. Long Parameter List 中参数过多的成因与 Introduce Parameter Object、Preserve Whole Object 的取舍

A 参数彼此独立时也应强行合并为参数对象
B Introduce Parameter Object 把相关参数组合成对象,Preserve Whole Object 传完整对象取字段 ✓ 正确答案
C Preserve Whole Object 一定比特参数对象优
D 过长参数列表无需处理,不影响可读性
#

12. Refused Bequest 的识别与处理中子类只使用父类部分行为时,为什么用'以委托取代继承'(Replace Inheritance with Delegation)重构?

A 委托比继承更死板,不利于复用
B Refused Bequest 说明继承关系非常合适,应保留
C 子类只使用父类部分行为时,用"以委托取代继承"重构,避免接口污染 ✓ 正确答案
D 子类应继承父类所有方法,包括不适用的
#

13. 重复造轮子(Reinventing the Wheel)的代价与边界中什么场景下自研优于复用(学习、深度定制、合规),如何评估长期维护成本?

A 自研永远优于复用,无论成本
B 重复造轮子没有成本代价
C 复用库永远比自研安全,无需评估
D 学习、深度定制、合规等场景下自研可能优于复用,但要评估长期维护成本 ✓ 正确答案
#

14. God Class 与 Long Method 的危害中为什么类/方法过长会降低可测试性与可维护性?

A 长类/长方法把职责揉在一起,导致测试难以隔离、维护牵一发动全身 ✓ 正确答案
B 长方法可测试性更好,因为逻辑集中
C 类过长只影响可读性,不影响可测试性
D 长类职责单一,利于复用
#

15. 复制粘贴代码与 DRY 的边界中复制后微调有时比抽象更安全,如何用规则判定该不该抽象?

A 任何重复都必须抽象,否则违反 DRY
B 若两处代码因同一原因变化则应抽象,若会各自演化则复制更安全 ✓ 正确答案
C 复制粘贴永远比抽象安全
D 三次法则指出现一次就要抽象
#

16. Shotgun Surgery(霰弹式修改)的识别中一处需求改动散落多处文件,如何用重构收敛?

A 改动分散是正常现象,无需收敛
B 霰弹式修改代表逻辑内聚良好
C 一处需求改动需修改多处文件,可用 Move Method/Extract Class 把相关逻辑收敛 ✓ 正确答案
D 收敛后改动仍会散落多处
#

17. Shotgun Surgery 与 Divergent Change 中两者分别对应合并 vs 拆分的重构方向?

A 两者都需合并
B 两者都需拆分
C Shotgun Surgery 是"一个变化改多处"需合并,Divergent Change 是"一处因多原因改"需拆分 ✓ 正确答案
D 两者是同一概念,无区别
#

18. 过早优化(premature optimization)与性能敏感代码的取舍中为什么先测量再优化能避免过度设计?

A 优化会提升可读性,应尽早做
B 任何代码都应无条件提前优化
C 应先用 profiler 测量定位真实瓶颈,再针对性优化,避免过度设计 ✓ 正确答案
D 性能敏感代码无需考虑性能约束
#

19. 以注释代替代码(Commented-Out Code)的坏味道,为什么删除注释掉的代码并用版本控制保留历史更优?

A 版本控制无法恢复已删代码
B 注释掉的代码应永久保留以防需要
C 注释掉的代码不影响可读性
D 应删除注释掉的代码,用版本控制保留历史,避免误导与失步 ✓ 正确答案
#

20. Lazy Class 中几乎不做事的类如何识别,何时合并到相邻类或直接删除

A 几乎没有职责的类应合并到相邻类或直接删除,删除前确认无引用 ✓ 正确答案
B Lazy Class 是理想设计,应保留
C 懒散类方法越少越好,无需处理
D 任何类都不能删除