refactor
Code Refactoring
Improve code quality without changing behavior.
When to Use
- Code is hard to understand or modify
- Duplicated logic across files
- Functions/classes are too large
- Technical debt reduction
- Before adding new features
Refactoring Process
- Ensure tests exist - Add tests before refactoring
- Small steps - Make incremental changes
- Run tests - Verify after each change
- Commit often - Keep changes reversible
Common Refactorings
Extract Function
// Before
function processOrder(order) {
// 50 lines of validation
// 30 lines of calculation
// 20 lines of notification
}
// After
function processOrder(order) {
validateOrder(order);
const total = calculateTotal(order);
notifyCustomer(order, total);
}
Replace Conditionals with Polymorphism
// Before
function getPrice(type) {
if (type === "regular") return basePrice;
if (type === "premium") return basePrice * 1.5;
if (type === "vip") return basePrice * 0.8;
}
// After
const pricingStrategies = {
regular: (base) => base,
premium: (base) => base * 1.5,
vip: (base) => base * 0.8,
};
const getPrice = (type) => pricingStrategies[type](basePrice);
Remove Duplication
// Before
function getUserName(user) {
return user?.profile?.name ?? "Unknown";
}
function getOrderName(order) {
return order?.customer?.name ?? "Unknown";
}
// After
const getName = (obj, path) => path.reduce((o, k) => o?.[k], obj) ?? "Unknown";
const getUserName = (user) => getName(user, ["profile", "name"]);
const getOrderName = (order) => getName(order, ["customer", "name"]);
Code Smells
| Smell | Symptom | Refactoring |
|---|---|---|
| Long Function | >20 lines | Extract Function |
| Large Class | >200 lines | Extract Class |
| Duplicate Code | Same logic repeated | Extract and reuse |
| Long Parameter | >3 params | Use object/builder |
| Feature Envy | Uses other class's data | Move method |
| Primitive Obsession | Strings for everything | Create value objects |
Quality Metrics
- Cyclomatic Complexity - Keep under 10 per function
- Nesting Depth - Max 3 levels
- Function Length - Under 20 lines preferred
- File Length - Under 300 lines preferred
Safety Checklist
- Tests exist and pass
- No behavior changes intended
- Changes are incremental
- Each step is committed
- Code review requested
Examples
Input: "This function is too long" Action: Identify logical sections, extract into focused functions, verify tests pass
Input: "Reduce duplication in these files" Action: Find common patterns, extract shared utilities, update call sites
More from htlin222/dotfiles
cpp
Write modern C++ with RAII, smart pointers, and STL. Use for C++ development, memory safety, or performance optimization.
130data-science
Data analysis, SQL queries, BigQuery operations, and data insights. Use for data analysis tasks and queries.
52c-lang
Write efficient C code with proper memory management and system calls. Use for C optimization, memory issues, or system programming.
46quarto-book
Generate Quarto Book project structure with chapters, configuration, and output settings. Use when user wants to create a book, multi-chapter document, technical manual, or asks about Quarto book setup.
45scientific-figure-assembly
Assemble multi-panel scientific figures with panel labels (A, B, C) at publication quality (300 DPI) using R. Use when combining individual plots into journal-ready figures.
43ai-engineer
Build LLM apps, RAG systems, and prompt pipelines. Use for AI-powered features.
42