# 1. Long Method 在 try/catch 嵌套、嵌套 if、循环内长体的拆分策略。 A 针对 try/catch、嵌套 if、循环长体分别提炼核心逻辑为独立方法,让方法单一职责 ✓ 正确答案 B 长方法无需拆分,逻辑集中更清晰 C try/catch 块内的逻辑不应提炼 D 循环体不应提炼为独立方法
# 2. Primitive Obsession 在用 int 描述订单状态、钱、范围的工程治理。 A 枚举会让状态更混乱 B int 描述状态是安全的,无需治理 C 值对象无法承载校验行为 D 用枚举替代 int 状态、用值对象封装金额与范围,获得类型安全与语义清晰 ✓ 正确答案
# 3. Middle Man 在大量方法仅转发到被委托对象的中间人识别。 A 大量方法仅转发给被委托对象、无额外价值的中间人,应用 Remove Middle Man 移除 ✓ 正确答案 B 中间人越多封装越好 C 转发方法无法识别 D 中间人不会增加间接层
# 4. Comments 在用代码本身表达、删除坏注释的工程治理。 A 用命名与代码表达意图,删除重复/过时/注释掉的坏注释,保留解释"为什么"的注释 ✓ 正确答案 B 所有注释都应删除 C 注释越详细越好,无需关注失步 D 注释掉的代码应永久保留
# 5. Data Class 在只有 getter/setter、无行为的贫血模型。 A Data Class 是理想设计,无需改进 B 只有 getter/setter 的贫血模型应通过 Move Method 承载行为,封装集合并暴露意图方法 ✓ 正确答案 C 贫血模型利于内聚 D 行为应放在外部调用方,不应进入类
# 6. Data Clumps 在参数列表常出现的字段组应当抽取为对象。 A 抽取对象会破坏行为内聚 B 数据泥团无需处理,重复字段无害 C 任何字段都应独立参数,不抽取 D 参数列表常成组出现的字段应抽取为对象,减少重复并封装行为 ✓ 正确答案
# 7. Divergent Change 在单一类因不同原因修改的拆分(SRP)。 A Divergent Change 说明类内聚良好 B 单一类因不同原因修改时,应按 SRP 用 Extract Class 拆分为各自职责的类 ✓ 正确答案 C 一个类应承担多种职责,减少类数量 D 拆分只需按代码大小,无需考虑职责
# 8. Duplicated Code 在 magic number、if-else 链、相同字段重复三个位置的工程识别。 A 重复代码最安全,改动无需多处同步 B magic number 提取为常量、if-else 链提炼为方法、重复字段抽取为共享类,消除重复 ✓ 正确答案 C magic number 不影响维护 D 重复字段无法消除
# 9. Shotgun Surgery 在单一改动触多类的工程治理。 A 改动分散是正常现象,无需治理 B 单一改动触多类时,用 Move Method/Extract Class 把散落逻辑收敛到一处 ✓ 正确答案 C Shotgun Surgery 与合并无关 D 收敛后改动仍会散落多处
# 10. Speculative Generality 在为未来准备的抽象、参数、类的过度设计。 A 无用参数不影响设计 B 过度抽象应保留以防未来需要 C 只有一个实现的抽象仍然合理 D 为未来准备的抽象、参数、类,若无真实使用者应删除,遵循 YAGNI ✓ 正确答案
# 11. Temporary Field 在实例字段仅在特定算法期间使用的设计问题。 A 临时字段作为实例字段是理想设计 B 仅在特定算法期间使用的实例字段,应改为局部变量或提炼为算法类,避免无效状态 ✓ 正确答案 C 临时字段无需判断有效性 D 临时字段生命周期清晰,无需治理
# 12. Message Chains 在 a.getB().getC().getD() 的链式调用的封装。 A Hide Delegate 会暴露更多内部结构 B 链式调用让依赖更清晰 C 链式调用无需封装 D a.getB().getC().getD() 链式调用应用 Hide Delegate 封装为意图方法,解耦调用方与真实依赖 ✓ 正确答案
# 13. Parallel Inheritance Hierarchies 在父类新增时子类必须同步新增的反模式。 A 平行继承是最佳设计,便于扩展 B 两个继承层次必须同步新增时,用组合/委托替代一个层次或合并,打破强制同步 ✓ 正确答案 C 新增子类无需同步其他层次 D 平行继承层次之间无耦合
# 14. Refused Bequest 在子类拒绝父类方法/字段的继承问题。 A 子类应继承并实现父类所有方法 B Refused Bequest 说明继承关系合理 C 子类拒绝父类部分方法时,用"以委托取代继承"避免接口污染 ✓ 正确答案 D 委托比继承更不利于复用
# 15. Switch Statements 在多态替代的工程实现。 A 所有 switch 都必须强制改为多态 B switch 分支越多越好,便于集中管理 C 多态替代无法消除类型分支 D 大量基于类型的 switch 分支可改为多态,让各类型子类实现行为,新增类型无需改 switch ✓ 正确答案
# 16. Alternative Classes with Different Interfaces 在同名不同方法的抽象统一。 A 同名不同方法无法统一 B 接口各异是正常的,无需统一 C 做相同事情但接口各异的类,应定义统一接口让其实现,调用方针对接口编程 ✓ 正确答案 D 统一接口会增加调用方分支
# 17. Feature Envy 在方法多访问他类字段而非本类字段的归属。 A Move Method 会把方法搬到调用方附近 B 方法访问他类字段是正常的,无需处理 C Feature Envy 与数据归属无关 D 方法多访问他类字段时,用 Move Method 把它搬到依赖数据的类中,让行为与数据内聚 ✓ 正确答案
# 18. Inappropriate Intimacy 在两个类互相访问私有成员的耦合。 A 私有成员应被公开供其他类访问 B 互相访问私有成员利于高效协作 C 过度亲密不影响封装 D 两个类互相访问私有成员时,应搬移逻辑、提取公共部分或接口隔离,降低耦合 ✓ 正确答案
# 19. Incomplete Library Class 在无法修改的库的扩展模式。 A 无法修改的库类可用 Introduce Foreign Method 或 Local Extension(子类/包装)扩展,而不改库源码 ✓ 正确答案 B 应直接修改第三方库源码 C 外部函数无法扩展库类 D 库类缺少方法时无需处理
# 20. Large Class 在上帝类、聚合多种职责的拆分边界。 A 按 SRP 划分职责,用 Extract Class 拆分,每个新类只承担一个清晰职责,避免新上帝类 ✓ 正确答案 B 上帝类应保留,职责集中便于维护 C 拆分按代码大小,无需考虑职责 D 拆出的类无需保证单一职责
# 21. Lazy Class 在没什么职责的类的删除。 A 懒散类应保留,越多越好 B 没什么职责的类应合并到相邻类或直接删除,删除前确认无引用 ✓ 正确答案 C 懒散类方法少但职责清晰 D 任何类都不能删除
# 22. Long Parameter List 在引入 Parameter Object 后的可读性与可演进性。 A 参数对象无法承载默认值与校验 B 参数对象会降低可读性 C 无关参数也应强行合并为参数对象 D 引入 Parameter Object 提升可读性,未来增删字段只需改对象,增强可演进性 ✓ 正确答案