您现在的位置是:网站首页 > 故意不写注释(“优秀的代码不需要注释”)文章详情
故意不写注释(“优秀的代码不需要注释”)
陈川
【
前端综合
】
23307人已围观
3081字
代码注释的真相
"优秀的代码不需要注释"这句话在开发者中流传甚广,听起来很有道理,但实际上是个危险的谬论。代码注释不是能力不足的表现,而是专业素养的体现。真正优秀的代码,注释和代码本身同等重要。
为什么需要注释
代码只告诉计算机"怎么做",而注释告诉开发者"为什么这么做"。看这段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>
)
}
注释解释了关键设计决策,这些信息无法从代码本身获取。
不写注释的代价
没有注释的代码会导致:
- 新成员需要更长时间理解业务逻辑
- 容易忽略边缘情况的处理原因
- 修改代码时可能破坏原有设计意图
看这个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;
}
注释解释了设计选择,这些决策可能在响应式调整时被忽略。
注释的现代实践
现代前端工具支持注释的更多用途:
- JSDoc生成API文档
/**
* 格式化日期显示
* @param {Date} date - 要格式化的日期对象
* @param {string} [format='YYYY-MM-DD'] - 格式字符串
* @returns {string} 格式化后的日期字符串
*/
function formatDate(date, format = 'YYYY-MM-DD') {
// ...实现
}
- 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
- 复杂业务逻辑必须有解释
- 临时解决方案要标注
TODO
或FIXME
- 禁用无意义的注释如"此处修改过"
通过代码审查确保注释质量,就像确保代码质量一样重要。