上周review同事的代码时,我遇到了一个典型的场景:一个300行的Python脚本,没有任何注释,变量名全是a、b、c这样的单字母,缩进时而是4空格时而是tab。更糟的是,这个脚本负责处理公司核心业务的订单数据。当我问原作者某个逻辑为何这样实现时,他自己都记不清了。这让我再次意识到,干净的代码不仅关乎美学,更是团队协作的生命线。
注释和格式化就像代码的"标点符号"——没有它们,再好的内容也会变得难以理解。但现实中,开发者们对这两件事的态度往往两极分化:要么过度注释(连i++都要解释),要么彻底不写;要么执着于格式化细节(比如大括号换行位置),要么完全放任自流。本文将分享我在多个大型项目中总结出的平衡之道。
好的注释应该解释"为什么"而不是"是什么"。看到下面这个例子:
python复制# 计算订单总价
total = price * quantity
这是典型的无用注释——代码本身已经清楚地表达了它在做什么。相比之下,这个注释就有价值:
python复制# 使用乘法而非sum()因为API返回的price已含批量折扣
total = price * quantity
根据我的经验,以下六种情况必须写注释:
不同的语言社区有不同的注释风格,但有几个通用原则:
Python示例:
python复制def calculate_tax(amount: float) -> float:
"""计算含税价格(当前税率7%)
Args:
amount: 不含税金额,需大于0
Returns:
含税金额,保留2位小数
Raises:
ValueError: 当输入为负数时
"""
if amount < 0:
raise ValueError("金额不能为负")
return round(amount * 1.07, 2)
提示:现代IDE如VSCode/PyCharm都能解析这种docstring生成智能提示,相当于免费的API文档
我曾参与过一个Java项目,团队花了整整两周时间争论"大括号是否换行"——这种争论毫无意义。现在我的原则很简单:直接采用语言社区的主流格式化工具:
这些工具的优势在于:
仅仅在本地运行格式化是不够的。我推荐的完整工作流:
pre-commit钩子:在git commit时自动格式化
bash复制# .pre-commit-config.yaml示例
repos:
- repo: https://github.com/psf/black
rev: 23.3.0
hooks:
- id: black
CI流水线检查:在PR时阻断未格式化的代码
yaml复制# GitHub Actions示例
- name: Check formatting
run: |
black --check .
isort --check .
编辑器集成:保存时自动格式化(VSCode设置)
json复制"editor.formatOnSave": true,
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
}
根据代码审查经验,这些注释问题最常见:
即使是自动化工具,这些坑仍需注意:
JavaScript示例:
javascript复制// 不好的格式化
const data = {id:1,name:'张三',age:30,address:'北京市海淀区',phone:'13800138000'}
// 更好的方式
const data = {
id: 1,
name: '张三',
age: 30,
address: '北京市海淀区',
phone: '13800138000'
}
在Tech Lead岗位上,我总结出这套方法:
当review代码时,我会特别检查这些方面:
经验:在PR模板中加入检查清单能显著提升代码质量
以下是我在VSCode中的完整配置(适用于全栈开发):
json复制{
"editor.tabSize": 2,
"editor.insertSpaces": true,
"editor.renderWhitespace": "all",
"files.trimTrailingWhitespace": true,
"files.insertFinalNewline": true,
"editor.formatOnSave": true,
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter",
"editor.codeActionsOnSave": {
"source.organizeImports": true
}
},
"isort.args": ["--profile", "black"],
"javascript.format.enable": false,
"typescript.format.enable": false,
"[javascript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
},
"[typescript]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
对于需要大量API文档的项目,这些工具能节省时间:
示例使用pydocstring生成注释模板:
在严格遵循规范的同时,也要保持务实态度。去年我们遇到一个生产环境性能问题,需要在两小时内热修复。当时我写了这样的代码:
python复制def fast_fix(data):
# TODO: 临时方案,性能优化需要重构(负责人:张三 2023-12到期)
# 当前方案牺牲可读性换取3倍性能提升
return [x for x in sorted(
filter(lambda y: y>0, data),
key=lambda z: (z%10, z//10)
)]
关键点在于:
这种平衡比机械遵守规范更重要——代码最终是为业务服务的。