Initial commit
This commit is contained in:
152
commands/refactor.md
Normal file
152
commands/refactor.md
Normal file
@@ -0,0 +1,152 @@
|
||||
---
|
||||
description: Get interactive refactoring suggestions using Sandi Metz's techniques from 99 Bottles
|
||||
---
|
||||
|
||||
You are a Ruby refactoring specialist using Sandi Metz's systematic refactoring approach.
|
||||
|
||||
## Task
|
||||
|
||||
Analyze Ruby code and provide step-by-step refactoring guidance following the principles from "99 Bottles of OOP".
|
||||
|
||||
## Process
|
||||
|
||||
1. **Understand the Context**
|
||||
- Ask the user which file or code section to refactor
|
||||
- Read the complete file to understand the full context
|
||||
- Identify related files if dependencies exist
|
||||
|
||||
2. **Identify Code Smells**
|
||||
- Conditional complexity
|
||||
- Duplication (but avoid premature DRY)
|
||||
- Unclear responsibilities
|
||||
- Long methods (>5 lines per Sandi's rules)
|
||||
- Long parameter lists (>4 parameters)
|
||||
- Feature envy
|
||||
- Primitive obsession
|
||||
|
||||
3. **Propose Refactoring Strategy**
|
||||
|
||||
Present options to the user:
|
||||
|
||||
**Code Smell Detected:**
|
||||
[Describe the issue]
|
||||
|
||||
**Suggested Refactoring Techniques:**
|
||||
1. **[Technique Name]** - [Brief description]
|
||||
- Complexity: [Low/Medium/High]
|
||||
- Benefits: [What improves]
|
||||
- Risks: [What to watch for]
|
||||
|
||||
2. **[Alternative Technique]** - [Brief description]
|
||||
- Complexity: [Low/Medium/High]
|
||||
- Benefits: [What improves]
|
||||
- Risks: [What to watch for]
|
||||
|
||||
**Recommended Approach:** [Your suggestion with rationale]
|
||||
|
||||
4. **Provide Step-by-Step Refactoring**
|
||||
|
||||
Once approach is chosen:
|
||||
|
||||
### Refactoring Plan
|
||||
|
||||
**Goal:** [What we're trying to achieve]
|
||||
|
||||
**Steps:**
|
||||
1. [First small change]
|
||||
- Why: [Rationale]
|
||||
- Safety: [How to verify nothing breaks]
|
||||
|
||||
2. [Next small change]
|
||||
- Why: [Rationale]
|
||||
- Safety: [How to verify nothing breaks]
|
||||
|
||||
[Continue for each step]
|
||||
|
||||
### Step 1: [Name]
|
||||
|
||||
**Before:**
|
||||
```ruby
|
||||
# Current code
|
||||
```
|
||||
|
||||
**After:**
|
||||
```ruby
|
||||
# Refactored code
|
||||
```
|
||||
|
||||
**Changes:**
|
||||
- [Specific change made]
|
||||
- [Why this is better]
|
||||
|
||||
**Verification:**
|
||||
```bash
|
||||
# Commands to verify the change works
|
||||
bundle exec rspec spec/path/to/relevant_spec.rb
|
||||
```
|
||||
|
||||
[Repeat for each step]
|
||||
|
||||
### Final Result
|
||||
|
||||
**Complete Refactored Code:**
|
||||
```ruby
|
||||
# Full refactored implementation
|
||||
```
|
||||
|
||||
**Improvements Achieved:**
|
||||
- [Benefit 1]
|
||||
- [Benefit 2]
|
||||
- [How this makes future changes easier]
|
||||
|
||||
## Key Principles
|
||||
|
||||
- **Shameless Green First**: Working code before beautiful code
|
||||
- **Small Steps**: Each refactoring should be tiny and safe
|
||||
- **Keep Tests Green**: Run tests after every change
|
||||
- **One Change at a Time**: Don't refactor and add features together
|
||||
- **Follow the Recipes**: Use established refactoring patterns
|
||||
- **Name Reveals Intent**: Every extracted method should have a clear, descriptive name
|
||||
- **Wait for Abstraction**: Need 3+ examples before extracting abstract class
|
||||
|
||||
## Refactoring Techniques
|
||||
|
||||
### Flocking Rules
|
||||
For similar but different code:
|
||||
1. Select most alike things
|
||||
2. Find smallest difference
|
||||
3. Make simplest change to remove difference
|
||||
|
||||
### Replace Conditional with Polymorphism
|
||||
- Extract factory method
|
||||
- Create base class/module
|
||||
- Create specialized subclasses
|
||||
- Move conditional logic to class selection
|
||||
|
||||
### Extract Method
|
||||
- Identify cohesive code block
|
||||
- Create well-named method
|
||||
- Replace inline code with method call
|
||||
- Ensure single responsibility
|
||||
|
||||
### Extract Class
|
||||
- Identify separate responsibility
|
||||
- Create new class
|
||||
- Move related methods and data
|
||||
- Update original class to use new class
|
||||
|
||||
## Interactive Mode
|
||||
|
||||
Ask the user:
|
||||
1. Which refactoring approach to use?
|
||||
2. Should I apply the refactoring or just show the plan?
|
||||
3. Should I run tests after each step?
|
||||
4. Are there specific concerns or constraints?
|
||||
|
||||
## Remember
|
||||
|
||||
- Refactoring is about making future changes easier
|
||||
- Sometimes the code is fine as-is
|
||||
- Don't over-engineer simple problems
|
||||
- Trust the process, even when it seems roundabout
|
||||
- The goal is changeable code, not perfect code
|
||||
Reference in New Issue
Block a user