code-quality by miles990/claude-software-skills
npx skills add https://github.com/miles990/claude-software-skills --skill code-quality编写可维护、可读且可靠代码的原则与实践。
// ❌ 含义模糊的名称
const d = new Date();
const u = getU();
const arr = data.filter(x => x.s === 'a');
// ✅ 描述性名称
const currentDate = new Date();
const currentUser = getCurrentUser();
const activeUsers = users.filter(user => user.status === 'active');
// ❌ 匈牙利命名法(已过时)
const strName = 'John';
const arrItems = [];
const bIsActive = true;
// ✅ 让类型系统处理类型
const name = 'John';
const items: Item[] = [];
const isActive = true;
// ❌ 做太多事情
function processUserData(userId: string) {
const user = db.findUser(userId);
const orders = db.findOrders(userId);
const total = orders.reduce((sum, o) => sum + o.amount, 0);
sendEmail(user.email, `Your total: ${total}`);
updateAnalytics(userId, total);
return { user, orders, total };
}
// ✅ 单一职责
function getUser(userId: string): User {
return db.findUser(userId);
}
function getUserOrders(userId: string): Order[] {
return db.findOrders(userId);
}
function calculateTotal(orders: Order[]): number {
return orders.reduce((sum, o) => sum + o.amount, 0);
}
function sendOrderSummary(user: User, total: number): void {
sendEmail(user.email, `Your total: ${total}`);
}
// ❌ 参数过多
function createUser(name, email, age, role, department, manager, startDate) {}
// ✅ 使用对象参数
interface CreateUserParams {
name: string;
email: string;
age?: number;
role: Role;
department: string;
managerId?: string;
startDate: Date;
}
function createUser(params: CreateUserParams): User {}
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
// ❌ 冗余注释
// 将计数器加 1
counter++;
// ❌ 过时注释(代码已更改,注释未更新)
// 返回用户的全名
function getUserEmail(user: User) {
return user.email;
}
// ✅ 解释“为什么”,而不是“是什么”
// 使用二分查找,因为列表已排序且可能包含超过 10 万个项目
const index = binarySearch(sortedItems, target);
// ✅ 警告不明显的行为
// 重要提示:此函数出于性能原因会修改输入数组
function quickSort(arr: number[]): number[] {
// ...
}
// ✅ 带上下文的 TODO
// TODO(john): 迁移完成后移除 - 在 JIRA-1234 中跟踪
const legacyAdapter = new LegacyAdapter();
// ❌ 多个职责
class UserManager {
createUser(data: UserData) { /* DB logic */ }
validateEmail(email: string) { /* Validation logic */ }
sendWelcomeEmail(user: User) { /* Email logic */ }
generateReport(users: User[]) { /* Report logic */ }
}
// ✅ 每个类单一职责
class UserRepository {
create(data: UserData): User { /* DB logic */ }
findById(id: string): User | null { /* DB logic */ }
}
class UserValidator {
validateEmail(email: string): boolean { /* Validation */ }
validatePassword(password: string): ValidationResult { /* Validation */ }
}
class EmailService {
sendWelcomeEmail(user: User): void { /* Email logic */ }
}
class UserReportGenerator {
generate(users: User[]): Report { /* Report logic */ }
}
// ❌ 必须修改代码才能添加新的支付方式
class PaymentProcessor {
process(payment: Payment) {
if (payment.type === 'credit') {
// Credit card logic
} else if (payment.type === 'paypal') {
// PayPal logic
} else if (payment.type === 'crypto') {
// Crypto logic - had to modify existing code!
}
}
}
// ✅ 对扩展开放,对修改封闭
interface PaymentMethod {
process(amount: number): Promise<PaymentResult>;
}
class CreditCardPayment implements PaymentMethod {
async process(amount: number): Promise<PaymentResult> { /* ... */ }
}
class PayPalPayment implements PaymentMethod {
async process(amount: number): Promise<PaymentResult> { /* ... */ }
}
// 新的支付方式 - 无需修改现有代码
class CryptoPayment implements PaymentMethod {
async process(amount: number): Promise<PaymentResult> { /* ... */ }
}
class PaymentProcessor {
constructor(private method: PaymentMethod) {}
async process(amount: number): Promise<PaymentResult> {
return this.method.process(amount);
}
}
// ❌ 违反 LSP - Square 破坏了 Rectangle 的约定
class Rectangle {
constructor(public width: number, public height: number) {}
setWidth(w: number) { this.width = w; }
setHeight(h: number) { this.height = h; }
getArea() { return this.width * this.height; }
}
class Square extends Rectangle {
setWidth(w: number) {
this.width = w;
this.height = w; // 意外的副作用!
}
setHeight(h: number) {
this.width = h;
this.height = h; // 意外的副作用!
}
}
// ✅ 正确的抽象
interface Shape {
getArea(): number;
}
class Rectangle implements Shape {
constructor(private width: number, private height: number) {}
getArea() { return this.width * this.height; }
}
class Square implements Shape {
constructor(private side: number) {}
getArea() { return this.side * this.side; }
}
// ❌ 臃肿的接口
interface Worker {
work(): void;
eat(): void;
sleep(): void;
attendMeeting(): void;
writeReport(): void;
}
// 机器人不能吃或睡!
class Robot implements Worker {
work() { /* ... */ }
eat() { throw new Error('Robots do not eat'); } // 被迫实现
sleep() { throw new Error('Robots do not sleep'); }
// ...
}
// ✅ 分离的接口
interface Workable {
work(): void;
}
interface Eatable {
eat(): void;
}
interface Sleepable {
sleep(): void;
}
class Human implements Workable, Eatable, Sleepable {
work() { /* ... */ }
eat() { /* ... */ }
sleep() { /* ... */ }
}
class Robot implements Workable {
work() { /* ... */ }
}
// ❌ 高层模块依赖于低层模块
class OrderService {
private db = new MySQLDatabase(); // 具体依赖
private mailer = new SendGridMailer(); // 具体依赖
createOrder(data: OrderData) {
const order = this.db.insert('orders', data);
this.mailer.send(data.email, 'Order confirmed');
return order;
}
}
// ✅ 依赖于抽象
interface Database {
insert(table: string, data: unknown): unknown;
find(table: string, query: unknown): unknown[];
}
interface Mailer {
send(to: string, message: string): void;
}
class OrderService {
constructor(
private db: Database,
private mailer: Mailer
) {}
createOrder(data: OrderData) {
const order = this.db.insert('orders', data);
this.mailer.send(data.email, 'Order confirmed');
return order;
}
}
// 现在我们可以注入任何实现
const service = new OrderService(
new PostgresDatabase(),
new SESMailer()
);
## 代码审查清单
### 正确性
- [ ] 逻辑正确且处理了边界情况
- [ ] 错误处理得当
- [ ] 没有明显的错误或回归
### 设计
- [ ] 代码处于正确的抽象层次
- [ ] 没有不必要的复杂性
- [ ] 遵循代码库中现有的模式
### 可读性
- [ ] 命名清晰,意图明确
- [ ] 注释解释“为什么”而不是“是什么”
- [ ] 代码尽可能做到自文档化
### 测试
- [ ] 测试覆盖率足够
- [ ] 测试有意义(不仅仅是凑覆盖率)
- [ ] 测试了边界情况
### 性能
- [ ] 没有明显的 N+1 查询或低效操作
- [ ] 使用了合适的数据结构
- [ ] 如果需要,考虑了缓存
### 安全性
- [ ] 有输入验证
- [ ] 代码中没有密钥
- [ ] 认证/授权正确
# 良好的审查评论
## ✅ 具体且可操作
"这个循环的复杂度是 O(n²)。考虑使用 Map 来实现 O(n) 的查找。"
## ✅ 解释原因
"让我们把这个提取到一个单独的函数中 - 这样可以使逻辑更容易测试,主函数也更易读。"
## ✅ 提供替代方案
"与其修改数组,考虑使用 `filter()`,它会返回一个新数组:`const active = items.filter(i => i.active)`"
## ✅ 区分严重程度
- "nit: " - 次要的风格问题,可选
- "suggestion: " - 最好有,但不阻塞
- "blocking: " - 必须在合并前修复
# 避免
## ❌ 模糊的批评
"这段代码很混乱"
## ❌ 人身攻击
"你总是犯这个错误"
## ❌ 没有解释
"用不同的方法"
// 高复杂度 (10+) - 难以测试和维护
function processOrder(order: Order): Result {
if (order.status === 'pending') { // +1
if (order.paymentMethod === 'card') { // +1
if (order.amount > 1000) { // +1
// ...
} else if (order.amount > 100) { // +1
// ...
} else {
// ...
}
} else if (order.paymentMethod === 'cash') { // +1
// ...
}
} else if (order.status === 'processing') { // +1
// ...
}
// ... 更多分支
}
// 低复杂度 - 提取条件
function processOrder(order: Order): Result {
const processor = getProcessor(order.paymentMethod);
const tier = getPricingTier(order.amount);
return processor.process(order, tier);
}
| 指标 | 目标 | 原因 |
|---|---|---|
| 圈复杂度 | 每个函数 < 10 | 可测试性 |
| 函数长度 | < 50 行 | 可读性 |
| 文件长度 | < 400 行 | 可维护性 |
| 测试覆盖率 | > 80% | 信心 |
| 重复率 | < 3% | DRY 原则 |
// .eslintrc.js
module.exports = {
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/recommended',
],
rules: {
// 防止错误
'no-unused-vars': 'error',
'@typescript-eslint/no-floating-promises': 'error',
'@typescript-eslint/no-misused-promises': 'error',
// 代码质量
'complexity': ['warn', 10],
'max-lines-per-function': ['warn', 50],
'max-depth': ['warn', 3],
// 一致性
'prefer-const': 'error',
'no-var': 'error',
}
};
// package.json
{
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"lint-staged": {
"*.{ts,tsx}": [
"eslint --fix",
"prettier --write"
],
"*.{json,md}": [
"prettier --write"
]
}
}
这些是代码质量中最常见且代价最高的错误
Factory.*Factory|Abstract.*Abstract|interface.*\{.*\}(?=.*interface.*\{.*\})|Strategy.*Strategyuser, customer, client, account 指同一件事(user|customer|client|account).*=.*find|(get|fetch|retrieve|load).*User} 对应哪个 {\{.*\{.*\{.*\{|if.*if.*if.*if|\.then\(.*\.then\(.*\.then\(86400 不知道是什么(一天的秒数)\b(86400|3600|1000|60000|1024|65535)\b|status\s*===?\s*['"][^'"]+['"]import.*from.*\.\.\/\.\.\/\.\.\/|require\(.*\.\..*\.\..*\.\.\)|lines.*>\s*1000console\.(log|debug|info)\(*.ts, *.jsTSAnyKeyword*.ts, *.tsxfunction\s+\w+\s*\([^)]*,\s*[^)]*,\s*[^)]*,\s*[^)]*,\s*[^)]*\)|=>\s*\([^)]*,\s*[^)]*,\s*[^)]*,\s*[^)]*,\s*[^)]*\)function(options: Options)*.ts, *.js//\s*TODO(?!.*#\d|.*JIRA|.*\w+-\d+)// TODO(#123): description or create ticket*.ts, *.js, *.tsx, *.jsximport.*from\s+['"]\.\.\/\.\.\/\.\.\/|require\s*\(\s*['"]\.\.\/\.\.\/\.\.\/import { X } from '@/modules/x'*.ts, *.js, *.tsx, *.jsxWeekly Installs
177
Repository
GitHub Stars
7
First Seen
Jan 24, 2026
Security Audits
Installed on
opencode170
gemini-cli164
codex163
github-copilot159
cursor156
kimi-cli137
CodeQL代码扫描配置指南 - GitHub Actions工作流与CLI本地运行教程
632 周安装
Tailwind CSS 开发指南:v3 特性、深色模式、Flexbox/Grid 布局与最佳实践
274 周安装
BlockRun:AI 微支付网关,集成 GPT-5.2、DALL-E、Grok 实时搜索,按需付费
272 周安装
Claude Code 上下文压缩恢复工具 - 自动恢复工作状态,加载知识库,总结工作进度
284 周安装
Agentic Workflow 多智能体流水线模式:AI任务编排与自动化实施架构
280 周安装
Claude提示词库 - 开发者必备的AI提示词模板集合,含代码审查、系统架构等角色扮演
278 周安装
AI知识溯源技能:追踪产出物来源谱系,确保知识可信度与可追溯性
281 周安装