代码整洁之道概述:整洁代码的含义、命名规范、函数设计原则

各位同学,咱们今天聊聊代码整洁之道。说实话,我入行头三年写的代码,现在回头看简直想找个地缝钻进去。那时候觉得能跑就行,管它乱不乱。直到有一次,一个紧急bug让我在两千行的函数里翻了整整一个下午——嗯,从那以后,我彻底改观了。

整洁代码不是花架子,它是你职业生涯的护身符。你想想看,代码写出来首先是给人看的,其次才是给机器执行的。机器不挑食,但你的同事会骂娘。

什么是整洁代码

整洁代码,说白了就是读起来像是一篇好文章。它有自己的节奏,有清晰的逻辑,每个函数都在讲一个完整的故事。

我个人习惯用一个标准来判断:如果一段代码让你想骂人,那它就不整洁。反过来,如果你读代码时能顺畅地点头,那就是好代码。

整洁代码的三个核心特征:

  • 可读性强——变量名、函数名一看就懂,不需要猜
  • 职责单一——每个函数只做一件事,且做好
  • 易于修改——改一处不会崩三处

我在项目中遇到过最典型的反面教材:一个叫 processData 的函数,里面同时做了数据校验、格式转换、写入数据库、发送邮件。你猜怎么着?后来要改邮件模板,结果把数据库写挂了。这就是不整洁的代价。

命名规范:名字就是最好的注释

命名这件事,我踩过的坑比写过的代码还多。曾经我特别喜欢用 abtmp 这种变量名,觉得省事。结果呢?三天后自己都看不懂了。

好的命名应该做到:看到名字就知道它是什么、干什么用

坏命名 好命名 说明
int d; int daysSinceLastLogin; 明确含义,不用猜
list List<User> activeUsers; 带上类型和用途
getData() fetchUserProfile() 具体到做什么
flag isPaymentCompleted 布尔值用 is/has/can 开头

我的命名小技巧:

  • 类名用名词:CustomerOrderProcessor
  • 方法名用动词:calculateTotal()saveToDatabase()
  • 布尔变量用 is/has/can:isValidhasPermission
  • 避免缩写:idx 不如 indexcfg 不如 config

我曾经接手过一个项目,里面有个变量叫 xxx。你没看错,就是三个x。我查了git记录,原作者说"临时用一下,回头改"。结果这个"临时"用了两年。嗯,后来我花了三天才搞清楚它到底存的是什么。

函数设计原则:小而美

函数设计,我有一条铁律:一个函数只做一件事。如果函数名里出现了"和"字,那大概率是设计有问题。

举个例子,下面这个函数就犯了典型的"贪多"毛病:

// 坏例子:一个函数做了三件事
public void processOrder(Order order) {
    // 1. 校验订单
    if (order.getTotal() <= 0) {
        throw new IllegalArgumentException("订单金额无效");
    }
    // 2. 计算折扣
    double discount = 0;
    if (order.getTotal() > 1000) {
        discount = 0.1;
    }
    // 3. 保存订单
    database.save(order);
    emailService.sendConfirmation(order);
}

这个函数干了三件事:校验、计算、保存。哪天要改折扣规则,你得从整个函数里抠逻辑。改成这样就好多了:

// 好例子:每个函数只做一件事
public void processOrder(Order order) {
    validateOrder(order);
    double discount = calculateDiscount(order);
    saveOrderWithDiscount(order, discount);
}

private void validateOrder(Order order) {
    if (order.getTotal() <= 0) {
        throw new IllegalArgumentException("订单金额无效");
    }
}

private double calculateDiscount(Order order) {
    if (order.getTotal() > 1000) {
        return 0.1;
    }
    return 0;
}

private void saveOrderWithDiscount(Order order, double discount) {
    order.setDiscount(discount);
    database.save(order);
    emailService.sendConfirmation(order);
}

你看,每个函数都短小精悍,名字就是它的说明书。改折扣?直接去 calculateDiscount 里改,不会动到其他逻辑。

函数设计的避坑指南:

  • 函数不要超过20行——超过就考虑拆分
  • 参数不要超过3个——多了就封装成对象
  • 避免副作用——函数不要偷偷改全局变量
  • 不要用布尔参数控制流程——拆成两个函数更清晰

我曾经在一个项目里看到过300行的函数,里面嵌套了6层if-else。当时要加一个新功能,我盯着屏幕看了半小时,愣是没敢下手。最后花了整整一天重构,拆成12个小函数。测试通过的那一刻,我差点哭了。

知识体系总览

下面这张图,是我对整洁代码核心思想的总结。你可以把它当作一个检查清单:

整洁代码 可读性 命名规范 函数设计原则 类名用名词 · 方法用动词 布尔用 is/has/can · 避免缩写 单一职责 · 不超过20行 参数≤3个 · 避免副作用 目标:代码即文档,读起来像文章

这张图把整洁代码拆成了三个维度:可读性是基础,命名规范和函数设计是具体落地手段。你写代码的时候,可以拿这个图当镜子照一照——你的代码,经得起照吗?

最后送你三句话,我贴了十年在工位上:

  1. 写代码的时候,想象一下半年后的自己会怎么骂现在的你。
  2. 整洁代码不是一次写成的,是反复打磨出来的。
  3. 对代码负责,就是对同事负责,更是对自己负责。

好了,这一章就聊到这儿。记住,整洁代码不是教条,是让你少加班的真功夫。下一章咱们深入聊聊命名——那些让你"一看就懂"的名字,到底是怎么想出来的。


公众号:蓝海资料掘金营,微信deep3321