# Refactoring Specialist

> Code refactoring expert for improving code structure, readability, and maintainability.

Code refactoring expert for improving code structure, readability, and maintainability. Use when user asks to refactor, clean up, or improve code quality.

- Page: https://ss33.ai/skills/zhaono1/refactoring-specialist-78890076357
- Publisher: zhaono1
- Category: [Software Development](https://ss33.ai/skills/category/software-development-t44z8z) › [Misc](https://ss33.ai/skills/category/software-development-t44z8z/misc-0pfo0b)
- License: MIT
- Source: https://github.com/zhaono1/agent-playbook/blob/be7a9d7d17593abd8cf029d51c87dbd5b445351e/skills/refactoring-specialist/SKILL.md

## Skill

SKILL.md: https://ss33.ai/api/v1/ss33/download/zhaono1/refactoring-specialist-78890076357

# Refactoring Specialist

Expert guidance on refactoring code to improve structure, readability, and maintainability while preserving functionality.

## When This Skill Activates

Activates when you:
- Ask to refactor code
- Request cleanup or improvement
- Mention "technical debt" or "code smell"
- Want to improve code quality

## Refactoring Principles

1. **Preserve Behavior**: Refactoring must not change external behavior
2. **Small Steps**: Make small, incremental changes
3. **Test Coverage**: Ensure tests pass before and after
4. **Commit Often**: Commit after each successful refactoring

## Code Smells to Address

### 1. Long Method
**Symptom:** Function > 20-30 lines

**Refactoring:** Extract Method
```typescript
// Before:
function processOrder(order) {
  // 50 lines of code
}

// After:
function processOrder(order) {
  validateOrder(order);
  calculateTotals(order);
  saveOrder(order);
  sendConfirmation(order);
}
```

### 2. Duplicate Code
**Symptom:** Similar code in multiple places

**Refactoring:** Extract Method / Template Method
```typescript
// Before:
class UserService {
  async validateEmail(email) {
    if (!email || !email.includes('@')) return false;
    const domain = email.split('@')[1];
    return domain.length > 0;
  }
}
class AdminService {
  async validateEmail(email) {
    if (!email || !email.includes('@')) return false;
    const domain = email.split('@')[1];
    return domain.length > 0;
  }
}

// After:
class EmailValidator {
  async validate(email) {
    if (!email || !email.includes('@')) return false;
    return email.split('@')[1].length > 0;
  }
}
```

### 3. Large Class
**Symptom:** Class doing too many things

**Refactoring:** Extract Class
```typescript
// Before:
class User {
  // Authentication
  // Profile management
  // Notifications
  // Reporting
}

// After:
class User { /* Core user data */ }
class UserAuth { /* Authentication */ }
class UserProfile { /* Profile management */ }
class UserNotifier { /* Notifications */ }
```

### 4. Long Parameter List
**Symptom:** Function with 4+ parameters

**Refactoring:** Introduce Parameter Object
```typescript
// Before:
function createUser(name, email, age, address, phone, role) { ... }

// After:
function createUser(user: UserData) { ... }

interface UserData {
  name: string;
  email: string;
  age: number;
  address: string;
  phone: string;
  role: string;
}
```

### 5. Feature Envy
**Symptom:** Method uses more data from other classes

**Refactoring:** Move Method
```typescript
// Before:
class Report {
  formatSummary(formatter) {
    const options = formatter.getFormattingOptions();
    // ...
  }
}

// After:
class Formatter {
  formatReport(report) {
    const discount = this.discountLevel;
    // ...
  }
}
```

### 6. Data Clumps
**Symptom**: Same data appearing together

**Refactoring**: Extract Value Object
```typescript
// Before:
function drawShape(x, y, width, height) { ... }
function moveShape(x, y, width, height, dx, dy) { ... }

// After:
class Rectangle {
  constructor(x, y, width, height) { ... }
}
function drawShape(rect: Rectangle) { ... }
```

### 7. Primitive Obsession
**Symptom**: Using primitives instead of small objects

**Refactoring**: Replace Primitive with Object
```typescript
// Before:
function createUser(name, email, phone) { ... }

// After:
class Email {
  constructor(value) {
    if (!this.isValid(value)) throw new Error('Invalid email');
    this.value = value;
  }
  // ...
}
```

### 8. Switch Statements
**Symptom**: Large switch on type

**Refactoring**: Replace Conditional with Polymorphism
```typescript
// Before:
function calculatePay(employee) {
  switch (employee.type) {
    case 'engineer': return employee.salary * 1.2;
    case 'manager': return employee.salary * 1.5;
    case 'sales': return employee.salary * 1.1;
  }
}

// After:
interface Employee {
  calculatePay(): number;
}
class Engineer implements Employee {
  calculatePay() { return this.salary * 1.2; }
}
```

### 9. Temporary Field
**Symptom**: Variables only used in certain scenarios

**Refactoring**: Extract Class
```typescript
// Before:
class User {
  calculateRefund() {
    this.tempRefundAmount = 0;
    // complex calculation
    return this.tempRefundAmount;
  }
}

// After:
class RefundCalculator {
  calculate(user) {
    // ...
  }
}
```

### 10. Comments
**Symptom**: Code needs extensive comments

**Refactoring**: Extract Method with clear name
```typescript
// Before:
// Calculate the total price including discounts
// and tax based on user location
function calc(u, i) {
  let t = 0;
  // discount logic
  if (u.vip) t *= 0.9;
  // tax logic
  if (u.state === 'CA') t *= 1.08;
  return t;
}

// After:
function calculateTotalPrice(user: User, items: Item[]): number {
  let total = items.sum(i => i.price);
  if (user.isVIP) {
    total = applyVIPDiscount(total);
  }
  return applyTax(total, user.state);
}
```

## Refactoring Steps

1. **Identify the smell** - What makes this code hard to work with?
2. **Determine the refactoring** - Which technique applies?
3. **Ensure tests pass** - Green before starting
4. **Apply the refactoring** - Make the change
5. **Run tests** - Verify behavior unchanged
6. **Commit** - Small, atomic commits

## Safe Refactoring Practices

- Use your IDE's refactoring tools (Rename, Extract, Move)
- Run tests frequently (after each change)
- Keep commits small and focused
- Write a descriptive commit message
- Consider code reviews for complex refactorings

## Before Refactoring

- [ ] Tests are passing
- [ ] I understand what the code does
- [ ] I have identified the specific code smell
- [ ] I know which refactoring to apply
- [ ] I have a rollback plan

## After Refactoring

- [ ] Tests still pass
- [ ] Code is more readable
- [ ] Code is easier to maintain
- [ ] No new code smells introduced
- [ ] Documentation updated if needed

## References

- `references/smells.md` - Complete code smell catalog
- `references/techniques.md` - Refactoring techniques
- `references/checklist.md` - Refactoring checklist
