您现在的位置是:网站首页 > 故意不写注释(“优秀的代码不需要注释”)文章详情

故意不写注释(“优秀的代码不需要注释”)

代码注释的真相

"优秀的代码不需要注释"这句话在开发者中流传甚广,听起来很有道理,但实际上是个危险的谬论。代码注释不是能力不足的表现,而是专业素养的体现。真正优秀的代码,注释和代码本身同等重要。

为什么需要注释

代码只告诉计算机"怎么做",而注释告诉开发者"为什么这么做"。看这段React组件代码:

function UserList({ users }) {
  return (
    <ul>
      {users.map(user => (
        <UserItem key={user.id} user={user} />
      ))}
    </ul>
  )
}

表面看很清晰,但如果加上注释:

/**
 * 渲染用户列表
 * @param {Object[]} users - 用户数组,必须包含id字段用于React key
 * @note 使用id作为key而非index,避免列表重排时的性能问题
 */
function UserList({ users }) {
  // 过滤掉被标记为删除的用户
  const activeUsers = users.filter(u => !u.deleted)
  
  return (
    <ul className="user-list" aria-label="活跃用户列表">
      {activeUsers.map(user => (
        <UserItem 
          key={user.id} 
          user={user}
          // 特殊处理管理员用户
          isAdmin={user.roles.includes('admin')} 
        />
      ))}
    </ul>
  )
}

注释解释了关键设计决策,这些信息无法从代码本身获取。

不写注释的代价

没有注释的代码会导致:

  1. 新成员需要更长时间理解业务逻辑
  2. 容易忽略边缘情况的处理原因
  3. 修改代码时可能破坏原有设计意图

看这个Vue示例:

computed: {
  sortedProducts() {
    return [...this.products].sort((a, b) => {
      // 特殊排序逻辑:促销商品优先,然后按库存降序
      if (a.onSale !== b.onSale) return b.onSale - a.onSale
      return b.stock - a.stock
    })
  }
}

如果没有注释,后来者可能误删促销优先的逻辑,影响线上销售。

什么才是好注释

好注释应该:

  • 解释"为什么"而非"做什么"
  • 记录非常规决策
  • 标注业务规则

坏注释的例子:

// 增加计数器
counter++

好注释的例子:

// 使用防抖避免频繁调用API
// 300ms延迟是根据用户测试得出的最佳平衡点
const search = debounce(async (query: string) => {
  const results = await fetchResults(query)
  updateState(results)
}, 300)

注释与代码质量的关系

代码质量不等于代码量少。看这个CSS案例:

/* 主内容区域布局 
 * 使用padding而非margin保证内部点击区域
 * 最大宽度1280px适配大屏但不拉伸内容 */
.main-content {
  width: 100%;
  max-width: 1280px;
  padding: 20px;
  box-sizing: border-box;
}

注释解释了设计选择,这些决策可能在响应式调整时被忽略。

注释的现代实践

现代前端工具支持注释的更多用途:

  1. JSDoc生成API文档
/**
 * 格式化日期显示
 * @param {Date} date - 要格式化的日期对象 
 * @param {string} [format='YYYY-MM-DD'] - 格式字符串
 * @returns {string} 格式化后的日期字符串
 */
function formatDate(date, format = 'YYYY-MM-DD') {
  // ...实现
}
  1. TypeScript类型提示
interface User {
  /** 用户唯一ID,来自CRM系统 */
  id: string
  /** 显示名称,可能包含emoji */
  name: string
  /** 账户状态:0-正常 1-冻结 */
  status: 0 | 1
}

注释与团队协作

在团队环境中,注释是重要的沟通工具。看这个Git提交示例:

// 修复IOS12下Date解析问题
// 原因:IOS12不支持YYYY-MM-DD格式
// 方案:使用/替换-作为分隔符
const parseDate = str => new Date(str.replace(/-/g, '/'))

这样的注释可以避免其他成员遇到同样问题时重复调查。

注释的适度原则

虽然提倡写注释,但也要避免过度注释。不要注释显而易见的代码:

// 不好的注释示例
// 定义一个变量i并赋值为0
let i = 0

好的做法是只在必要时添加注释,比如解释复杂算法:

// 使用Floyd判圈算法检测链表环
function hasCycle(head) {
  let slow = head
  let fast = head
  
  while (fast && fast.next) {
    slow = slow.next
    fast = fast.next.next
    if (slow === fast) return true
  }
  
  return false
}

注释与代码重构

注释可以帮助识别需要重构的代码。例如:

// TODO: 应该改用Web Worker处理大数据量
function processLargeData(data) {
  // 同步处理导致界面冻结
  // ...复杂计算
}

这类注释标记了技术债务,指导后续优化方向。

注释文化的建立

团队应该建立注释规范,比如:

  • 公共API必须包含JSDoc
  • 复杂业务逻辑必须有解释
  • 临时解决方案要标注TODOFIXME
  • 禁用无意义的注释如"此处修改过"

通过代码审查确保注释质量,就像确保代码质量一样重要。

我的名片

网名:~川~

岗位:console.log 调试员

坐标:重庆市-九龙坡区

邮箱:cc@qdcc.cn

沙漏人生

站点信息

  • 建站时间:2013/03/16
  • 本站运行
  • 文章数量
  • 总访问量
微信公众号
每次关注
都是向财富自由迈进的一步