497 lines
11 KiB
Markdown
497 lines
11 KiB
Markdown
---
|
|
name: safe-refactoring
|
|
description: Provides a safe, systematic approach to refactoring code with confidence that behavior is preserved
|
|
---
|
|
|
|
# Safe Refactoring Skill
|
|
|
|
This skill provides a safe, systematic approach to refactoring code with confidence that behavior is preserved.
|
|
|
|
## When to Use This Skill
|
|
|
|
Activate this skill when:
|
|
- User wants to "refactor", "restructure", or "clean up code"
|
|
- Code is working but needs improvement
|
|
- Code is difficult to maintain or understand
|
|
- Technical debt needs to be addressed
|
|
- Preparing code for new features
|
|
|
|
## Refactoring Philosophy
|
|
|
|
**Main Principle:** Refactoring changes the structure, NOT the behavior.
|
|
|
|
**Key Principles:**
|
|
1. Tests must pass before and after
|
|
2. Small, incremental changes
|
|
3. Commit after each safe step
|
|
4. Never refactor and add features simultaneously
|
|
5. Behavior remains identical
|
|
|
|
---
|
|
|
|
## PHASE 1: PREPARE & PROTECT
|
|
|
|
**Goal:** Establish a safety net before making changes.
|
|
|
|
**Actions:**
|
|
|
|
1. **Ensure Tests Exist**
|
|
- Check for existing tests
|
|
- If tests don't exist or coverage is poor, STOP
|
|
- Add tests FIRST before refactoring
|
|
|
|
2. **Run Current Tests**
|
|
- All tests must pass
|
|
- Fix any failing tests first
|
|
- Establish baseline
|
|
|
|
3. **Understand Current Behavior**
|
|
- Read the code thoroughly
|
|
- Understand what it does
|
|
- Identify inputs and outputs
|
|
- Note side effects
|
|
|
|
4. **Identify Scope**
|
|
- What needs refactoring?
|
|
- What is the goal of refactoring?
|
|
- What will NOT change?
|
|
|
|
**Pre-Refactoring Checklist:**
|
|
|
|
```markdown
|
|
## Refactoring Preparation
|
|
|
|
### Current State
|
|
- [ ] Tests exist and cover the code
|
|
- [ ] All tests passing (baseline established)
|
|
- [ ] Code behavior understood
|
|
- [ ] No pending changes in version control
|
|
|
|
### Refactoring Goal
|
|
**What:** [What code is being refactored]
|
|
**Why:** [Why this refactoring is needed]
|
|
**Outcome:** [Expected improvement]
|
|
|
|
### Safety Measures
|
|
- [ ] Version control available
|
|
- [ ] Can revert if needed
|
|
- [ ] Tests provide safety net
|
|
```
|
|
|
|
**Quality Gate:**
|
|
- [ ] Tests exist with adequate coverage
|
|
- [ ] All tests passing
|
|
- [ ] Code behavior fully understood
|
|
- [ ] Refactoring goal clearly defined
|
|
|
|
**DO NOT PROCEED** without adequate test coverage.
|
|
|
|
---
|
|
|
|
## PHASE 2: PLAN THE REFACTORING
|
|
|
|
**Goal:** Break refactoring into small, safe steps.
|
|
|
|
**Actions:**
|
|
|
|
1. **Identify Bad Code**
|
|
- Long functions (> 50 lines)
|
|
- Duplicated code
|
|
- Large classes
|
|
- Long parameter lists
|
|
- Deeply nested logic
|
|
- Poor naming
|
|
- Magic numbers/strings
|
|
- Complex conditionals
|
|
|
|
2. **Choose Refactoring Pattern**
|
|
|
|
**Common Refactorings:**
|
|
|
|
**Extract Method/Function**
|
|
- Break long functions into smaller ones
|
|
- Each function has single purpose
|
|
|
|
**Rename Variable/Function**
|
|
- Improve clarity
|
|
- Use intention-revealing names
|
|
|
|
**Extract Variable**
|
|
- Name complex expressions
|
|
- Improve readability
|
|
|
|
**Remove Duplication**
|
|
- DRY (Don't Repeat Yourself)
|
|
- Extract common code
|
|
|
|
**Simplify Conditionals**
|
|
- Extract complex conditions to named functions
|
|
- Use guard clauses
|
|
- Replace nested ifs with early returns
|
|
|
|
**Introduce Parameter Object**
|
|
- Replace long parameter lists
|
|
- Group related parameters
|
|
|
|
**Replace Magic Numbers**
|
|
- Use named constants
|
|
- Improve maintainability
|
|
|
|
3. **Order the Steps**
|
|
- Start with safest refactorings first
|
|
- One refactoring at a time
|
|
- Build on previous changes
|
|
|
|
**Refactoring Plan:**
|
|
|
|
```markdown
|
|
## Refactoring Steps
|
|
|
|
### Step 1: [Name of refactoring]
|
|
**Type:** [Extract method / Rename / etc.]
|
|
**Risk:** [Low / Medium / High]
|
|
**What:** [Specific change]
|
|
**Why:** [Benefit]
|
|
|
|
### Step 2: [Name of refactoring]
|
|
**Type:** [Extract method / Rename / etc.]
|
|
**Risk:** [Low / Medium / High]
|
|
**What:** [Specific change]
|
|
**Why:** [Benefit]
|
|
|
|
### Step 3: [Name of refactoring]
|
|
**Type:** [Extract method / Rename / etc.]
|
|
**Risk:** [Low / Medium / High]
|
|
**What:** [Specific change]
|
|
**Why:** [Benefit]
|
|
|
|
[Continue for all planned steps...]
|
|
```
|
|
|
|
**Quality Gate:**
|
|
- [ ] Bad code identified
|
|
- [ ] Refactoring steps planned
|
|
- [ ] Steps ordered from safest to riskiest
|
|
- [ ] Each step has clear goal
|
|
|
|
---
|
|
|
|
## PHASE 3: REFACTOR INCREMENTALLY
|
|
|
|
**Goal:** Execute refactoring in small, verified steps.
|
|
|
|
**Process for Each Step:**
|
|
|
|
1. **Make One Small Change**
|
|
- Follow the plan
|
|
- Make minimal modification
|
|
- Change structure, not behavior
|
|
|
|
2. **Run Tests**
|
|
- All tests must still pass
|
|
- If tests fail, revert and try different approach
|
|
|
|
3. **Verify Behavior**
|
|
- Code still works as before
|
|
- No new bugs introduced
|
|
- Performance not degraded
|
|
|
|
4. **Commit**
|
|
- Commit after each successful step
|
|
- Clear commit message
|
|
- Can revert if needed
|
|
|
|
**Refactoring Step Template:**
|
|
|
|
```markdown
|
|
## Step [N]: [Refactoring Name]
|
|
|
|
### Before:
|
|
```[language]
|
|
[Code before refactoring]
|
|
```
|
|
|
|
### After:
|
|
```[language]
|
|
[Code after refactoring]
|
|
```
|
|
|
|
### Changes:
|
|
- [Change 1]
|
|
- [Change 2]
|
|
|
|
### Verification:
|
|
- [ ] Code compiles/runs
|
|
- [ ] All tests pass
|
|
- [ ] Behavior unchanged
|
|
- [ ] Committed to version control
|
|
|
|
### Benefits:
|
|
- [Improvement 1]
|
|
- [Improvement 2]
|
|
```
|
|
|
|
**CRITICAL RULES:**
|
|
|
|
1. **Run tests after EVERY change**
|
|
2. **If tests fail, REVERT immediately**
|
|
3. **Never skip steps**
|
|
4. **Commit after each successful step**
|
|
5. **If stuck, break into smaller steps**
|
|
|
|
**Quality Gate (For Each Step):**
|
|
- [ ] Change is small and focused
|
|
- [ ] Tests run and pass
|
|
- [ ] Behavior is identical
|
|
- [ ] Change committed
|
|
|
|
**DO NOT PROCEED** to next step if tests fail.
|
|
|
|
---
|
|
|
|
## PHASE 4: VALIDATE & IMPROVE
|
|
|
|
**Goal:** Ensure refactoring achieved its goal and code is better.
|
|
|
|
**Actions:**
|
|
|
|
1. **Run Full Verification**
|
|
- All tests pass
|
|
- Manual testing in realistic scenarios
|
|
- Performance check (no degradation)
|
|
- Code review quality
|
|
|
|
2. **Measure Improvement**
|
|
|
|
**Before vs After:**
|
|
- Lines of code
|
|
- Complexity score
|
|
- Number of functions
|
|
- Duplication percentage
|
|
- Readability score
|
|
|
|
3. **Quality Assessment**
|
|
|
|
```markdown
|
|
## Refactoring Results
|
|
|
|
### Metrics
|
|
| Metric | Before | After | Change |
|
|
|--------|--------|-------|--------|
|
|
| Lines of Code | [N] | [N] | [±N] |
|
|
| Functions | [N] | [N] | [±N] |
|
|
| Complexity | [N] | [N] | [±N] |
|
|
| Max Nesting | [N] | [N] | [±N] |
|
|
|
|
### Improvements
|
|
✅ [Improvement 1]
|
|
✅ [Improvement 2]
|
|
✅ [Improvement 3]
|
|
|
|
### Code Health
|
|
- Readability: [Better / Same / Worse]
|
|
- Maintainability: [Better / Same / Worse]
|
|
- Testability: [Better / Same / Worse]
|
|
- Performance: [Better / Same / Worse]
|
|
```
|
|
|
|
4. **Additional Improvements**
|
|
- Documentation added?
|
|
- Comments improved?
|
|
- Tests enhanced?
|
|
- Edge cases better handled?
|
|
|
|
**Quality Gate:**
|
|
- [ ] All tests passing
|
|
- [ ] Code measurably improved
|
|
- [ ] No performance degradation
|
|
- [ ] Code review shows quality increase
|
|
|
|
---
|
|
|
|
## PHASE 5: DOCUMENT & REFLECT
|
|
|
|
**Goal:** Capture learnings and document changes.
|
|
|
|
**Actions:**
|
|
|
|
1. **Update Documentation**
|
|
- Update code comments
|
|
- Update API documentation
|
|
- Note design decisions
|
|
- Update README if needed
|
|
|
|
2. **Create Summary**
|
|
|
|
```markdown
|
|
# Refactoring Summary
|
|
|
|
## Objective
|
|
[What we set out to improve]
|
|
|
|
## Changes Made
|
|
- [High-level change 1]
|
|
- [High-level change 2]
|
|
- [High-level change 3]
|
|
|
|
## Files Modified
|
|
- [file_path] - [description of changes]
|
|
- [file_path] - [description of changes]
|
|
|
|
## Improvements Achieved
|
|
1. **[Improvement]**: [Before] → [After]
|
|
2. **[Improvement]**: [Before] → [After]
|
|
3. **[Improvement]**: [Before] → [After]
|
|
|
|
## Test Results
|
|
- Total tests: [count]
|
|
- All passing: ✅
|
|
- Coverage: [before]% → [after]%
|
|
|
|
## Next Steps
|
|
- [ ] [Follow-up refactoring if needed]
|
|
- [ ] [Documentation updates]
|
|
- [ ] [Additional testing]
|
|
|
|
## Lessons Learned
|
|
- [Lesson 1]
|
|
- [Lesson 2]
|
|
```
|
|
|
|
3. **Reflect on Process**
|
|
- What worked well?
|
|
- What was challenging?
|
|
- What would you do differently?
|
|
- Patterns to reuse?
|
|
|
|
**Quality Gate:**
|
|
- [ ] Documentation updated
|
|
- [ ] Summary created
|
|
- [ ] Changes well-documented
|
|
- [ ] Team can understand what changed and why
|
|
|
|
---
|
|
|
|
## FINAL OUTPUT
|
|
|
|
```markdown
|
|
# Refactoring Complete ✅
|
|
|
|
## Summary
|
|
[Brief overview of refactoring]
|
|
|
|
## Goal Achieved
|
|
**Objective:** [Original goal]
|
|
**Result:** [What was achieved]
|
|
|
|
## Changes
|
|
**Files Modified:** [count]
|
|
**Lines Changed:** [count]
|
|
**Commits:** [count]
|
|
|
|
## Quality Improvements
|
|
- [Improvement 1]
|
|
- [Improvement 2]
|
|
- [Improvement 3]
|
|
|
|
## Verification
|
|
- ✅ All tests passing ([count] tests)
|
|
- ✅ Behavior unchanged
|
|
- ✅ Performance maintained
|
|
- ✅ Code quality improved
|
|
|
|
## Metrics
|
|
| Metric | Before | After | Change |
|
|
|--------|--------|-------|--------|
|
|
| [Metric] | [Value] | [Value] | [±Value] |
|
|
|
|
---
|
|
|
|
**Code is now cleaner, more maintainable, and ready for future development.**
|
|
```
|
|
|
|
---
|
|
|
|
## GUARDS (CRITICAL!)
|
|
|
|
**MUST DO:**
|
|
- ✅ Have adequate test coverage BEFORE refactoring
|
|
- ✅ Run tests after EVERY change
|
|
- ✅ Make small, incremental changes
|
|
- ✅ Commit after each successful step
|
|
- ✅ Preserve exact behavior
|
|
- ✅ Measure and verify improvements
|
|
- ✅ Revert if tests fail
|
|
|
|
**MUST NOT DO:**
|
|
- ❌ Refactor without tests
|
|
- ❌ Change behavior during refactoring
|
|
- ❌ Make large changes all at once
|
|
- ❌ Add features while refactoring
|
|
- ❌ Skip running tests
|
|
- ❌ Commit broken code
|
|
- ❌ Refactor "just because" without clear goal
|
|
|
|
**IF TESTS FAIL:**
|
|
1. STOP immediately
|
|
2. REVERT the change
|
|
3. Analyze what went wrong
|
|
4. Make a smaller change
|
|
5. Try again
|
|
|
|
## Common Refactoring Patterns
|
|
|
|
**Extract Function:**
|
|
```javascript
|
|
// Before
|
|
function process(data) {
|
|
// 50 lines of complex logic
|
|
const result = data.filter(x => x.value > 10 && x.active && !x.deleted);
|
|
// more logic
|
|
}
|
|
|
|
// After
|
|
function process(data) {
|
|
const filtered = filterActiveHighValueItems(data);
|
|
// more logic
|
|
}
|
|
|
|
function filterActiveHighValueItems(data) {
|
|
return data.filter(x => x.value > 10 && x.active && !x.deleted);
|
|
}
|
|
```
|
|
|
|
**Rename for Clarity:**
|
|
```javascript
|
|
// Before
|
|
function calc(a, b) { return a * b * 0.15; }
|
|
|
|
// After
|
|
function calculateSalesTax(price, quantity) {
|
|
const TAX_RATE = 0.15;
|
|
return price * quantity * TAX_RATE;
|
|
}
|
|
```
|
|
|
|
**Replace Magic Number:**
|
|
```javascript
|
|
// Before
|
|
if (age > 18) { /* ... */ }
|
|
|
|
// After
|
|
const LEGAL_AGE = 18;
|
|
if (age > LEGAL_AGE) { /* ... */ }
|
|
```
|
|
|
|
## Success Criteria
|
|
|
|
A successful refactoring has:
|
|
1. ✅ All tests passing (before and after)
|
|
2. ✅ Behavior perfectly preserved
|
|
3. ✅ Code quality measurably improved
|
|
4. ✅ Changes documented
|
|
5. ✅ Small, incremental commits
|
|
6. ✅ Clear improvement in maintainability
|
|
|
|
**Now begin PHASE 1: PREPARE & PROTECT.**
|