重复代码
错误:复制粘贴代码 正确:提取到函数或组件
来源: everything-claude-code 技能库
coding-standards 是适用于所有项目的通用编码标准,包括 TypeScript、JavaScript、React 和 Node.js 开发的最佳实践和模式。
// 好:清晰明确const userList = [];const isActive = true;const maxRetries = 3;const createdAt = new Date();
// 不好:模糊或缩写const lst = []; // list 缩写const ia = true; // isActive 缩写const mr = 3; // maxRetries 缩写const cat = new Date(); // createdAt 缩写// 动词前缀function getUser(id: string): User | undefined {}function createUser(data: UserData): User {}function updateUser(id: string, data: Partial<UserData>): User {}function deleteUser(id: string): void {}
// 布尔值函数function isValid(email: string): boolean {}function hasPermission(user: User, action: string): boolean {}function canAccess(resource: Resource, user: User): boolean {}// 全部大写加下划线const MAX_RETRY_COUNT = 3;const API_BASE_URL = 'https://api.example.com';const HTTP_STATUS_OK = 200;
// 或使用 enumenum HttpStatus { OK = 200, NOT_FOUND = 404, INTERNAL_ERROR = 500,}src/├── components/ # React 组件│ ├── Button/│ │ ├── Button.tsx│ │ ├── Button.styles.ts│ │ └── index.ts├── hooks/ # 自定义 hooks├── utils/ # 工具函数├── services/ # API 服务├── types/ # 类型定义├── constants/ # 常量└── index.ts # 入口文件// 1. React/框架import React, { useState, useEffect } from 'react';
// 2. 外部库import axios from 'axios';import { useQuery } from 'react-query';
// 3. 类型import { User, Post } from './types';
// 4. 组件import Button from './components/Button';
// 5. 工具import { formatDate, debounce } from './utils';
// 6. 样式/资源import './styles.css';// 好:单一职责function validateEmail(email: string): boolean { const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return regex.test(email);}
function formatUserName(firstName: string, lastName: string): string { return `${firstName} ${lastName}`.trim();}
// 不好:一个函数做太多function processUserAndSaveAndNotifyAndLog(input: any): Promise<void> { // 超过 50 行...}// 好:参数少function createUser(name: string, email: string): User { return { name, email, createdAt: new Date() };}
// 使用对象选项function createUser(options: CreateUserOptions): User { const { name, email, role = 'user' } = options; return { name, email, role, createdAt: new Date() };}
interface CreateUserOptions { name: string; email: string; role?: 'user' | 'admin';}// 好:提前返回减少嵌套function processUser(user: User | null): string { if (!user) { return 'No user provided'; }
if (!user.isActive) { return 'User is inactive'; }
return `Hello, ${user.name}!`;}
// 不好:嵌套金字塔function processUser(user: User | null): string { if (user) { if (user.isActive) { return `Hello, ${user.name}!`; } else { return 'User is inactive'; } } else { return 'No user provided'; }}// 好:清晰分离interface ButtonProps { onClick: () => void; children: React.ReactNode; variant?: 'primary' | 'secondary';}
export function Button({ onClick, children, variant = 'primary' }: ButtonProps) { return ( <button className={`btn btn-${variant}`} onClick={onClick} > {children} </button> );}// 好:多个 useStateconst [name, setName] = useState('');const [email, setEmail] = useState('');const [isLoading, setIsLoading] = useState(false);
// 不好:状态混在一起const [formData, setFormData] = useState({ name: '', email: '', isLoading: false });// 好:清理副作用useEffect(() => { const subscription = api.subscribe(handleData);
return () => { subscription.unsubscribe(); // 清理! };}, [api]);
// 不好:内存泄漏useEffect(() => { api.subscribe(handleData); // 没有清理!}, []);// 好:具体错误处理async function fetchUser(id: string): Promise<User> { try { const response = await api.get(`/users/${id}`); return response.data; } catch (error) { if (axios.isAxiosError(error)) { if (error.response?.status === 404) { throw new Error('User not found'); } throw new Error('Failed to fetch user'); } throw error; }}class ErrorBoundary extends React.Component< { children: React.ReactNode }, { hasError: boolean }> { state = { hasError: false };
static getDerivedStateFromError() { return { hasError: true }; }
render() { if (this.state.hasError) { return <div>Something went wrong.</div>; } return this.props.children; }}✅ 正确做法:1. 检查命名是否清晰2. 检查函数是否单一职责3. 检查是否有重复代码4. 检查错误处理5. 检查类型安全
❌ 错误做法:1. 只关注功能正确性2. 忽略代码风格3. 忽略性能问题4. 忽略安全漏洞✅ 正确做法:1. 先添加测试2. 小步重构3. 每次重构后运行测试4. 保持原有行为5. 提交可工作的代码
❌ 错误做法:1. 大改特改2. 不添加测试3. 重构和功能改动一起做✅ 正确做法:1. 使用有意义的名称2. 动词前缀表示动作3. 布尔值用 is/has/can 前缀4. 常量全部大写
❌ 错误做法:1. 单字母命名2. 模糊的缩写3. 中英文混用# 代码检查eslint .pylint .
# 格式化prettier --write .black .
# 类型检查tsc --noEmitmypy .
# 打包webpack buildvite build
# 测试jestvitest重复代码
错误:复制粘贴代码 正确:提取到函数或组件
函数过长
错误:一个函数做很多事 正确:单一职责原则
硬编码
错误:魔法数字和字符串 正确:提取到常量
忽略类型
错误:使用 any 正确:定义具体类型
何时使用
何时不用
关键要点
常见错误
| 技能 | 关系 |
|---|---|
| python-patterns | Python 规范 |
| golang-patterns | Go 规范 |
| code-review | 代码审查 |
官方原文: coding-standards SKILL.md
💡 提示:代码是写给人看的,代码可读性决定团队效率。