tmcfarlane/oh-my-cursor/refactoring-patterns

Claude Code and agent skill by tmcfarlane/oh-my-cursor

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Apply named refactoring transformations to improve code structure without changing behavior. Use when the user mentions "refactor this", "code smells", "extract method", "replace conditional", or "technical debt". Covers smell-driven refactoring, safe transformation sequences, and testing guards. For code quality foundations, see clean-code. For managing complexity, see software-design-philosophy.

Install

npx vskill@latest install tmcfarlane/oh-my-cursor/refactoring-patterns

SKILL.md

Refactoring Patterns Framework

A disciplined approach to improving the internal structure of existing code without changing its observable behavior. Apply these named transformations when reviewing code, reducing technical debt, or preparing code for new features. Every refactoring follows the same loop: verify tests pass, apply one small structural change, verify tests still pass.

Core Principle

Refactoring is not rewriting. It is a sequence of small, behavior-preserving transformations, each backed by tests. You never change what the code does -- you change how the code is organized. The discipline of taking tiny verified steps is what makes refactoring safe. Big-bang rewrites fail because they combine structural change with behavioral change, making it impossible to know which broke things.

The foundation: Bad code is not a character flaw -- it is a natural consequence of delivering features under time pressure. Code smells are objective signals that structure has degraded. Named refactorings are the proven mechanical recipes for fixing each smell. The catalog of smells tells you where to look; the catalog of refactorings tells you what to do.

Scoring

Goal: 10/10. When reviewing or refactoring code, rate the structural quality 0-10 based on adherence to the principles below. A 10/10 means: no obvious smells remain, each function does one thing, names reveal intent, duplication is eliminated, and the test suite covers the refactored paths. Always provide the current score and specific refactorings needed to reach 10/10.

The Refactoring Patterns Framework

Six areas of focus for systematically improving code structure:

1. Code Smells as Triggers

Core concept: Code smells are surface indicators of deeper structural problems. They are not bugs -- the code works -- but they signal that the design is making the code harder to understand, extend, or maintain. Each smell maps to one or more named refactorings that fix it.

Why it works: Without a shared vocabulary of smells, code review devolves into subjective "I don't like this." Named smells give teams objective criteria: "This is Feature Envy -- the method uses six fields from another class and only one of its own." The name points directly to the fix.

Key insights:

  • Smells cluster into five families: Bloaters, Object-Orientation Abusers, Change Preventers, Dispensables, and Couplers
  • Long Method is the most common smell and the gateway to most other refactorings
  • Duplicate Code is the single biggest driver of maintenance cost
  • A method that needs a comment to explain what it does is a smell -- extract and name the block instead
  • Shotgun Surgery (one change requires edits in many classes) and Divergent Change (one class changes for many reasons) are opposites that both signal misplaced responsibilities
  • Primitive Obsession -- using raw strings, ints, or arrays instead of small domain objects -- causes errors and duplication throughout the codebase

Code applications:

ContextPatternExample
Method > 10 linesExtract MethodPull the loop body into calculateLineTotal()
Class > 200 linesExtract ClassMove shipping logic into a ShippingCalculator
Switch on type codeReplace Conditional with PolymorphismCreate subclasses for each order type
Multiple methods use same paramsIntroduce Parameter ObjectGroup startDate, endDate into DateRange
Method uses another object's dataMove MethodMove calculateDiscount() to the Customer class
Copy-pasted logicExtract Method + Pull Up MethodShare via a common method or base class

See: references/smell-catalog.md

2. Composing Methods

Core concept: Most refactoring starts here. Long methods are broken into smaller, well-named pieces. Each extracted piece should do one thing and its name should say what that thing is. The goal is methods you can read like prose -- a sequence of high-level steps, each delegating to a clearly named helper.

Why it works: Short methods with intention-revealing names eliminate the need for comments, make bugs obvious (each method is small enough to verify at a glance), and enable reuse. The cognitive cost of a method call is near zero when the name tells you everything.

Key insights:

  • Extract Method is the single most important refactoring -- master it first
  • If you feel the urge to write a comment, extract the code block and use the comment as the method name
  • Inline Method when a method body is as clear as the name -- indirection without value is noise
  • Replace Temp with Query when a temporary variable holds a computed value that is used in multiple places
  • Split Temporary Variable when one variable is reused for two different purposes
  • Replace Method with Method Object when a method is too tangled to extract from (many local variables referencing each other)

Code applications:

ContextPatternExample
Block with a commentExtract Method// check eligibility becomes isEligible()
Temp used onceInline VariableRemove const price = order.getPrice() if used once
Temp used in multiple placesReplace Temp with QueryReplace let discount = getDiscount() with method calls
Temp assigned twice for different reasonsSplit Temporary VariableIntroduce perimeterWidth and perimeterHeight
Trivial delegating methodInline MethodInline moreThanFiveDeliveries() if it's return deliveries > 5 and only used once
Complex method with many localsReplace Method with Method ObjectMove the method into its own class where locals become fields

See: references/composing-methods.md

3. Moving Features Between Objects

Core concept: The key decision in object-oriented design is where to put responsibilities. When a method or field is in the wrong class -- evidenced by Feature Envy, excessive coupling, or unbalanced class sizes -- move it to where it belongs.

Why it works: Well-placed responsibilities reduce coupling and increase cohesion. When a method lives in the class whose data it uses, changes to that data affect only one class. Misplaced methods create invisible dependencies that cause Shotgun Surgery.

Key insights:

  • Move Method when a method uses more features of another class than its own
  • Move Field when a field is used more by another class than the class it lives in
  • Extract Class when one class does two things -- split along the axis of change
  • Inline Class when a class does too little to justify its existence
  • Hide Delegate to enforce the Law of Demeter -- a client shouldn't navigate a chain of objects
  • Remove Middle Man when a class does nothing but forward calls
  • The tension between Hide Delegate and Remove Middle Man is resolved case by case: hide the delegate when the chain is unstable; remove the middle man when forwarding becomes the entire class

Code applications:

ContextPatternExample
Method envies another classMove MethodMove calculateShipping() from Order to ShippingPolicy
Field used by another class constantlyMove FieldMove discountRate from Order to Customer
God class with 500+ linesExtract ClassPull Address fields and methods into their own class
Tiny class with one fieldInline ClassMerge PhoneNumber back into Contact if no behavior
Client calls a.getB().getC()Hide DelegateAdd a.getCThroughB() so client doesn't know about C
Class only forwards callsRemove Middle ManLet client call the delegate directly

See: references/moving-features.md

4. Organizing Data

Core concept: Raw data -- magic numbers, exposed fields, type codes represented as integers, parallel arrays -- creates subtle bugs and scatters domain knowledge. Replace primitive representations with objects that encapsulate behavior and enforce invariants.

Why it works: An int representing a currency amount has no concept of rounding rules, currency codes, or formatting. A Money object encapsulates all of that. When domain concepts are represented as first-class objects, business rules live in one place, validation happens automatically, and the type system catches errors at compile time.

Key insights:

  • Replace Magic Number with Symbolic Constant as the simplest data refactoring -- it names the intent
  • Replace Data Value with Object (Primitive Obsession cure) -- wrap strings and numbers in domain objects (EmailAddress, Money, Temperature)
  • Encapsulate Field -- never expose a raw field; a getter/setter allows you to add validation, logging, or computation later
  • Encapsulate Collection -- return an unmodifiable view; never let callers mutate your internal list
  • Replace Type Code with Subclasses when the type code affects behavior; use Strategy when subclassing is impractical
  • Change Value to Reference when you need identity semantics (one shared Customer object, not copies)

Code applications:

ContextPatternExample
`if (status == 2)`Replace Magic Number with Symbolic Constantif (status == ORDER_SHIPPED)
`String email` passed everywhereReplace Data Value with ObjectCreate EmailAddress class with validation
Public fieldEncapsulate FieldReplace order.total with order.getTotal()
Getter returns mutable listEncapsulate CollectionReturn Collections.unmodifiableList(items)
`int typeCode` with switchReplace Type Code with SubclassesEmployee -> Engineer, Manager, Salesperson
Duplicated customer recordsChange Value to ReferenceShare one Customer instance via a registry

See: references/organizing-data.md

5. Simplifying Conditional Logic

Core concept: Complex conditionals -- deeply nested if/else trees, long switch statements, null checks scattered everywhere -- are the hardest code to read and the most likely to contain bugs. Named refactorings decompose, consolidate, and replace conditionals with clearer structures.

Why it works: A conditional with six branches and nested sub-conditions requires the reader to simulate every path mentally. Decomposing the condition into well-named methods makes each branch self-documenting. Replacing conditionals with polymorphism eliminates entire categories of "forgot to handle this case" bugs.

Key insights:

  • Decompose Conditional: extract the condition, the then-branch, and the else-branch into named methods
  • Consolidate Conditional Expression: merge multiple conditions that lead to the same result into one named check
  • Replace Nested Conditional with Guard Clauses: handle edge cases early and return, leaving the main path unindented
  • Replace Conditional with Polymorphism: the gold standard for type-based conditionals -- each type knows its own behavior
  • Introduce Special Case (Null Object): eliminate if (x == null) checks by providing an object that represents "nothing" with safe default behavior
  • Introduce Assertion: make assumptions explicit so they fail fast in development

Code applications:

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 100 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

7-day trend score
0

Refreshed 19 Mar 2026, 7 months ago.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/tmcfarlane/oh-my-cursor/refactoring-patterns/badge)](https://verified-skill.com/skills/tmcfarlane/oh-my-cursor/refactoring-patterns)

Something wrong with this skill or its page? Tell us.