谈一谈代码洁癖之三-落地

169 阅读6分钟

“代码洁癖” 绝非追求形式上的完美,而是通过可执行的规则体系,将抽象的 “整洁代码” 理念转化为具体的开发实践。它的核心目标是降低系统复杂度,让代码具备可读性、可维护性与可扩展性。以下针对五条核心落地规则,结合实际开发场景详解实现路径。

一、对象、流程、动作:业务建模的 “三维拆解法”

代码是业务的数字化表达,能否精准拆分 “对象、流程、动作”,直接决定代码与业务的贴合度。三者各司其职,共同构建清晰的业务逻辑骨架。

1. 对象:承载数据的 “业务实体”

对象对应业务中的具体实体,核心价值是自身强相关的数据属性,避免承载复杂业务逻辑。

2. 流程:串联步骤的 “调度中枢”

流程是业务环节的有序集合,负责定义 **“先做什么、后做什么” 的执行顺序 **,扮演 “调度者” 角色。

  • 核心特征:聚焦流程控制逻辑,不涉及具体操作实现。以 “订单创建流程” 为例,仅定义 “校验参数→查询库存→创建订单→通知用户” 的步骤顺序,以及 “库存不足则终止流程” 的条件判断。
  • 落地关键:流程类应保持 “轻量调度” 特性,像导演把控剧本节奏,而非亲自下场表演。

3. 动作:执行操作的 “功能单元”

动作是流程中单一操作的具体实现,解决 **“怎么做” 的问题 **,每个动作仅承担一项明确职责。

  • 核心特征:输入输出清晰,功能独立可测试。
  • 落地原则:一个动作只做一件事,避免 “一动作多职责”。

二、策略等设计模式:应对变化的 “弹性工具库”

设计模式是代码洁癖中 “应对需求变化” 的核心武器,其中策略模式针对 “同类行为多实现” 场景,其他模式也各有明确的落地场景,共同提升代码扩展性。

1. 策略模式:多实现场景的 “解耦方案”

当同一动作存在多种实现方式且需动态切换时,策略模式可彻底消除冗长的条件分支。

  • 落地三步法:
  1. 定义抽象策略接口:以支付场景为例,创建PaymentStrategy接口,包含pay(Order order)核心方法;
  1. 实现具体策略类:分别编写WechatPayment、AlipayPayment类,实现pay方法封装各自支付逻辑;
  1. 构建策略工厂:PaymentStrategyFactory根据订单的paymentType参数,返回对应策略实例。
  • 优势体现:新增银联支付时,仅需新增UnionPayPayment策略类,无需修改流程与工厂代码,符合 “开闭原则”。

2. 其他模式的落地场景

除策略模式外,以下模式在代码洁癖实践中高频使用:

  • 工厂模式:用于复杂对象创建,如OrderFactory根据订单类型生成普通订单、预售订单等不同子类;
  • 观察者模式:处理 “一动作多后续” 场景,如支付成功后,通过PaymentSuccess同时通知库存、积分、物流系统;
  • 装饰器模式:动态增强动作功能,如给PaymentStrategy添加LogDecorator(日志记录)、RiskDecorator(风控校验)。

三、流程关联动作对象:松耦合的 “链路构建术”

流程与动作的关联方式,直接影响代码的耦合度。优质的关联逻辑应实现 “流程不依赖具体动作,动作不依赖流程” 的解耦效果。

反例:强耦合的 “硬编码陷阱”

流程类中直接嵌入动作逻辑,导致两者深度绑定,修改动作需改动流程:

正例:松耦合的 “接口依赖方案”

通过 “接口注入” 实现流程与动作的解耦,动作实例通过构造器传入流程:

这种设计下,流程成为稳定的 “骨架”,动作作为可替换的 “零件”,极大提升代码灵活性。

四、规模控制:类 200 行、方法 80 行的 “复杂度红线”

代码规模与可读性呈负相关,类与方法的行数限制本质是 “强制拆分职责”,避免 “大而全” 的臃肿模块。

1. 类:200 行的 “职责边界线”

一个类超过 200 行,往往意味着承担了多个职责。例如UserService同时处理用户 CRUD、权限校验、日志记录,需按 “单一职责原则” 拆分:

  • 拆分后模块:UserManager(用户数据管理)、UserPermissionChecker(权限校验)、UserOperationLogger(日志记录),每个类均控制在 150 行以内。
  • 例外处理:工具类(如DateUtil)可适当放宽,但需保证方法独立无依赖,且单个方法不超过 80 行。

2. 方法:80 行的 “功能聚焦线”

方法过长通常是 “多职责叠加” 导致,需通过 “提取辅助方法” 拆解。例如 120 行的createOrder方法:

// 重构前:长方法包含多步逻辑
public Order createOrder(OrderDTO dto) {
    // 1. 参数校验(30行)
    // 2. 计算订单金额(25行)
    // 3. 保存订单数据(40行)
    // 4. 封装返回结果(25行)
}
// 重构后:拆分为短方法
public Order createOrder(OrderDTO dto) {
    validateParams(dto); // 参数校验(20行)
    BigDecimal amount = calculateAmount(dto); // 金额计算(18行)
    Order order = saveOrder(dto, amount); // 数据保存(30行)
    return buildResult(order); // 结果封装(15行)
}

拆分后每个方法均在 80 行以内,功能聚焦,可读性与可维护性显著提升。

五、消除重复代码:拒绝 “复制粘贴” 的 “维护防火墙”

重复代码是系统 “腐烂” 的开端,一处逻辑修改需同步更新多个副本,极易引发遗漏与 BUG。消除重复的核心是 “抽象复用”。

1. 重复代码的两种典型形态

  • 完全重复:多处出现 identical 代码块,如多个服务中均有 “手机号格式校验” 逻辑;
  • 逻辑相似:代码结构一致,仅参数或细节不同,如 “微信支付” 与 “支付宝支付” 的签名生成逻辑。

2. 针对性落地方案

  • 完全重复:抽为工具类静态方法,如Validator.validatePhone(String phone),统一调用;
  • 逻辑相似:用 “模板方法模式” 提取公共逻辑,差异部分定义为抽象方法。例如支付签名逻辑,抽象出AbstractPaymentSigner,子类仅实现getSignKey()等差异方法;
  • 跨类重复:抽为父类共性方法,如BaseService封装所有服务共有的 “事务处理”“异常捕获” 逻辑,子类继承复用。

总结:代码洁癖落地的核心逻辑

以上规则并非孤立存在,而是形成 “业务建模→架构设计→代码实现→质量管控” 的完整闭环:

  • 对象、流程、动作的拆分,解决 “业务逻辑混乱” 问题;
  • 策略等设计模式的应用,解决 “需求变化适配” 问题;
  • 流程与动作的解耦关联,解决 “代码耦合度高” 问题;
  • 规模控制与去重,解决 “可读性与维护性差” 问题。

真正的代码洁癖,不是追求 “无懈可击的代码”,而是通过这些规则,让代码始终处于 “易于理解、便于修改、能够扩展” 的健康状态。做到以上几点,足以构建出高质量的工程化代码。以上是代码洁癖之我的认知,不足的地方欢迎大家指正,也欢迎大家讨论。