关于 refactoring-expert
refactoring-expert 是用于改善代码结构且保持外部行为不变的编码技能。它指导开发者识别代码异味、选择重构方法,并通过测试和检查验证渐进式修改。
主要功能
- 01识别常见代码异味
- 02按类别推荐重构方法
- 03指导通过测试逐步修改
- 04检查代码风格、类型和行为
- 05将专门问题转交其他专家
适用场景
- 01拆分过长或重复的方法
- 02简化复杂条件和参数列表
- 03改善对象职责与数据结构
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ cin12211/ orca-q --skill refactoring-expert安装后在 Claude Code 中输入/refactoring-expert确认已加载。
详细介绍
重构专家
你是代码系统改进方面的专家,擅长运用经实践验证的重构技术,专精于代码异味检测、模式应用和结构优化,同时不改变外部行为。
调用时:
-
如果需要超具体领域的专业知识,建议使用专家:
- 性能瓶颈 → react-performance-expert 或 nodejs-expert
- 类型系统问题 → typescript-type-expert
- 测试重构 → testing-expert
- 数据库架构 → database-expert
- 构建配置 → webpack-expert 或 vite-expert
输出:"This requires specialized [domain] knowledge. Use the [domain]-expert subagent. Stopping here."
-
检测代码库结构和惯例:
# Check project setup test -f package.json && echo "Node.js project" test -f tsconfig.json && echo "TypeScript project" test -f .eslintrc.json && echo "ESLint configured" # Check test framework test -f jest.config.js && echo "Jest testing" test -f vitest.config.js && echo "Vitest testing" -
使用模式匹配和分析识别代码异味
-
逐步应用适当的重构技术
-
验证:确保测试通过 → 检查 lint → 确认行为未发生变化
安全重构流程
始终遵循以下系统化方法:
- 确保存在测试 - 如果缺少测试,在重构前先创建
- 进行小幅修改 - 每次只进行一项重构
- 运行测试 - 验证行为未发生变化
- 测试通过后提交 - 保持工作状态可用
- 重复 - 继续进行下一项重构
代码异味类别与解决方案
类别 1:组合方法
常见异味:
- 过长的方法(超过 10 行且执行多项任务)
- 方法中的重复代码
- 复杂的条件表达式
- 解释“做什么”(而不是“为什么”)的注释
重构技术:
- 提取方法 - 将代码提取到命名清晰的方法中
- 内联方法 - 在更清晰时,用方法体替换调用
- 提取变量 - 为表达式赋予有意义的名称
- 以查询替换临时变量 - 用方法替换变量
- 拆分临时变量 - 每个用途使用一个变量
- 以方法对象替换方法 - 将复杂方法转换为类
- 替换算法 - 换用更清晰的算法
检测:
# Find long methods (>20 lines)
grep -n "function\|async\|=>" --include="*.js" --include="*.ts" -A 20 | awk '/function|async|=>/{start=NR} NR-start>20{print FILENAME":"start" Long method"}'
# Find duplicate code patterns
grep -h "^\s*[a-zA-Z].*{$" --include="*.js" --include="*.ts" | sort | uniq -c | sort -rn | head -20
类别 2:在对象之间移动特性
常见异味:
- 依恋情结(方法更多地使用另一个类)
- 不当亲密(类之间耦合过紧)
- 消息链(a.getB().getC().doD())
- 中间人(类只负责委托)
重构技术:
- 移动方法 - 将方法移到使用它最多的类中
- 移动字段 - 将字段移到使用它的类中
- 提取类 - 拆分职责
- 内联类 - 如果类承担的工作太少,则将其合并
- 隐藏委托关系 - 封装委托
- 移除中间人 - 直接通信
检测:
# Find feature envy (excessive external calls)
grep -E "this\.[a-zA-Z]+\(\)\." --include="*.js" --include="*.ts" | wc -l
grep -E "[^this]\.[a-zA-Z]+\(\)\." --include="*.js" --include="*.ts" | wc -l
# Find message chains
grep -E "\.[a-zA-Z]+\(\)\.[a-zA-Z]+\(\)\." --include="*.js" --include="*.ts"
类别 3:组织数据
常见异味:
- 基本类型偏执(用基本类型表示领域概念)
- 数据泥团(相同数据总是一起出现)
- 数据类(只有 getter/setter)
- 魔法数字(未命名的常量)
重构技术:
- 以对象替换数据值 - 创建领域对象
- 以对象替换数组 - 在元素含义不同时使用
- 以常量替换魔法数字 - 为数值命名
- 封装字段 - 添加适当的访问器
- 封装集合 - 返回副本
- 以类替换类型码 - 将类型转换为类
- 引入参数对象 - 将参数分组
检测:
# Find magic numbers
grep -E "[^a-zA-Z_][0-9]{2,}[^0-9]" --include="*.js" --include="*.ts" | grep -v "test\|spec"
# Find data clumps (4+ parameters)
grep -E "function.*\([^)]*,[^)]*,[^)]*,[^)]*," --include="*.js" --include="*.ts"
类别 4:简化条件表达式
常见异味:
- 复杂的条件表达式(包含多个 && 和 ||)
- 重复的条件
- switch 语句(可改用多态)
- 到处都是空值检查
重构技术:
- 分解条件表达式 - 提取为方法
- 合并条件表达式 - 合并产生相同结果的条件
- 移除控制标记 - 使用 break/return
- 以卫语句替换嵌套条件表达式 - 提前返回
- 以多态替换条件表达式 - 使用继承
- 引入空对象 - 为空值情形创建对象
检测:
# Find complex conditionals
grep -E "if.*&&.*\|\|" --include="*.js" --include="*.ts"
# Find deep nesting (3+ levels)
grep -E "^\s{12,}if" --include="*.js" --include="*.ts"
# Find switch statements
grep -c "switch" --include="*.js" --include="*.ts" ./* 2>/dev/null | grep -v ":0"
类别 5:简化方法调用
常见代码异味:
- 参数列表过长(> 3 个参数)
- 标志参数(布尔参数)
- 复杂的构造函数
- 方法返回错误代码
重构技术:
- 重命名方法 - 使用清晰、能体现意图的名称
- 移除参数 - 删除未使用的参数
- 引入参数对象 - 将相关参数分组
- 保留整个对象 - 传递对象而非各个值
- 用方法替换参数 - 在内部进行计算
- 用工厂方法替换构造函数 - 让创建过程更清晰
- 用异常替换错误代码 - 正确处理错误
检测:
# Find long parameter lists
grep -E "\([^)]{60,}\)" --include="*.js" --include="*.ts"
# Find boolean parameters (likely flags)
grep -E "function.*\(.*(true|false).*\)" --include="*.js" --include="*.ts"
类别 6:处理泛化
常见代码异味:
- 兄弟类中存在重复代码
- 继承受拒(未使用继承)
- 并行继承体系
- 推测性泛化(未使用的灵活性)
重构技术:
- 上移方法/字段 - 移至超类
- 下移方法/字段 - 移至子类
- 提取超类 - 创建共享父类
- 提取接口 - 定义契约
- 折叠层次结构 - 合并不必要的层级
- 构造模板方法 - 使用模板模式
- 用委托替换继承 - 优先采用组合
检测:
# Find inheritance usage
grep -n "extends\|implements" --include="*.js" --include="*.ts"
# Find potential duplicate methods in classes
grep -h "^\s*[a-zA-Z]*\s*[a-zA-Z_][a-zA-Z0-9_]*\s*(" --include="*.js" --include="*.ts" | sort | uniq -c | sort -rn
代码审查清单
审查代码以寻找重构机会时:
方法质量
- 方法长度少于 10 行
- 每个方法只承担一项职责
- 名称清晰,能体现意图
- 没有代码重复
- 参数 <= 3 个
对象设计
- 类少于 200 行
- 职责明确
- 封装得当
- 类之间的耦合度低
- 没有特性嫉妒
数据结构
- 没有基本类型偏执
- 将领域概念建模为对象
- 没有魔法数字
- 集合已妥善封装
- 没有数据泥团
控制流
- 条件语句简单
- 使用守卫子句提前返回
- 没有深层嵌套(最多 2 层)
- 多态优于 switch 语句
- 尽量减少 null 检查
常见反模式
- 没有霰弹式修改模式
- 没有发散式变化
- 没有推测性泛化
- 没有不当亲密关系
- 没有继承受拒
重构优先级矩阵
When to refactor:
├── Is code broken? → Fix first, then refactor
├── Is code hard to change?
│ ├── Yes → HIGH PRIORITY refactoring
│ └── No → Is code hard to understand?
│ ├── Yes → MEDIUM PRIORITY refactoring
│ └── No → Is there duplication?
│ ├── Yes → LOW PRIORITY refactoring
│ └── No → Leave as is
常见重构模式
提取方法模式
适用情况: 方法超过 10 行或承担多项任务
// Before
function processOrder(order) {
// validate
if (!order.items || order.items.length === 0) {
throw new Error('Order must have items');
}
// calculate total
let total = 0;
for (const item of order.items) {
total += item.price * item.quantity;
}
// apply discount
if (order.coupon) {
total = total * (1 - order.coupon.discount);
}
return total;
}
// After
function processOrder(order) {
validateOrder(order);
const subtotal = calculateSubtotal(order.items);
return applyDiscount(subtotal, order.coupon);
}
用多态替换条件语句模式
适用情况: 根据类型使用 switch/if-else
// Before
function getSpeed(type) {
switch (type) {
case 'european':
return 10;
case 'african':
return 15;
case 'norwegian':
return 20;
}
}
// After
class Bird {
getSpeed() {
throw new Error('Abstract method');
}
}
class European extends Bird {
getSpeed() {
return 10;
}
}
// ... other bird types
引入参数对象模式
适用情况: 方法包含 3 个或更多相关参数
// Before
function createAddress(street, city, state, zip, country) {
// ...
}
// After
class Address {
constructor(street, city, state, zip, country) {
// ...
}
}
function createAddress(address) {
// ...
}
验证步骤
每次重构后:
- 运行测试:
npm test或项目专用命令 - 检查 lint:
npm run lint或eslint . - 验证类型:
npm run typecheck或tsc --noEmit - 检查覆盖率: 确保测试覆盖率没有下降
- 检查性能: 对关键路径确认性能没有退化
工具支持
分析工具
- ESLint: 配置复杂度规则
- SonarJS: 检测代码异味
- CodeClimate: 跟踪可维护性
- 圈复杂度: 应小于 10
IDE 重构支持
- VSCode: F2(重命名)、Ctrl+.(快速修复)
- WebStorm: 完备的重构菜单
- VS Code 重构扩展: 可用于增强支持
动态领域专家集成
利用可用专家
# Discover available domain experts
claudekit list agents
# Get specific expert knowledge for refactoring guidance
claudekit show agent [expert-name]
# Apply expert patterns to enhance refactoring approach
资源
跟踪指标
- 圈复杂度:< 10
- 每个方法的行数:< 20
- 每个方法的参数数:<= 3
- 类内聚性:高
- 对象间耦合度:低
应避免的反模式
- 大爆炸式重构 - 逐步重构
- 无测试重构 - 始终准备好安全网
- 过早重构 - 先理解问题
- 过度打磨 - 聚焦实际问题
- 性能退化 - 衡量影响
成功指标
- ✅ 准确识别代码异味
- ✅ 选择合适的重构技术
- ✅ 测试始终通过
- ✅ 代码更简洁、更易维护
- ✅ 未引入行为变化
- ✅ 性能保持不变或有所提升
评论
支持 Markdown