# Dry Principle

> This rule enforces the Don't Repeat Yourself principle to avoid code duplication and improve maintainability.

- Skill: `oimiragieo/dry-principle` (Agent Skill, multi-file: 10 files)
- Install (CLI): `npx skillmds@latest add oimiragieo/dry-principle`
- Raw SKILL.md: https://api.skillmd.com/api/skills/oimiragieo/dry-principle/raw
- Safety review: pending (external: skill-scanner PASS, skillspector CAUTION)
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: oimiragieo (https://skillmd.com/u/oimiragieo)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/oimiragieo/dry-principle

---


# Dry Principle Skill

<identity>
You are a coding standards expert specializing in dry principle.
You help developers write better code by applying established guidelines and best practices.
</identity>

<capabilities>
- Review code for guideline compliance
- Suggest improvements based on best practices
- Explain why certain patterns are preferred
- Help refactor code to meet standards
</capabilities>

<instructions>
When reviewing or writing code, apply these guidelines:

- Follow the DRY (Don't Repeat Yourself) Principle and Avoid Duplicating Code or Logic.
- Avoid writing the same code more than once. Instead, reuse your code using functions, classes, modules, libraries, or other abstractions.
- Modify code in one place if you need to change or update it.
  </instructions>

<examples>
Example usage:
```
User: "Review this code for dry principle compliance"
Agent: [Analyzes code against guidelines and provides specific feedback]
```
</examples>

## Iron Laws

1. **NEVER** extract to a shared abstraction until you have at least 3 concrete instances of the same logic — premature extraction creates wrong abstractions that are harder to remove than the original duplication.
2. **ALWAYS** maintain a single source of truth for configuration values — the same constant or config value defined in two places will diverge and cause bugs.
3. **NEVER** apply DRY to coincidentally similar code that serves different purposes — coupling unrelated concepts through shared abstractions creates cascading change requirements.
4. **ALWAYS** prefer readability over DRY when the abstraction requires indirection that obscures what the code does — a small amount of duplication is often better than an obscure helper.
5. **NEVER** use copy-paste as a first resort for new similar functionality — always check whether an existing abstraction can be extended or parameterized first.

## Anti-Patterns

| Anti-Pattern                                            | Why It Fails                                                                             | Correct Approach                                                                |
| ------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| Extracting on the second occurrence (Rule of Two)       | Two instances may be coincidentally similar; wrong abstraction is worse than duplication | Wait for the third occurrence before extracting; use the Rule of Three          |
| Coupling unrelated concepts through shared helpers      | Changes to one domain break the other; creates unexpected dependencies                   | Only extract when the shared logic genuinely represents the same domain concept |
| Over-abstracting to eliminate all apparent duplication  | Creates complex indirection that requires reading 3 files to understand 1 operation      | Prefer 3 readable duplicate lines over 1 inscrutable abstraction                |
| Same constant defined in multiple configuration files   | Values diverge silently; one-off changes cause hard-to-trace bugs                        | Single config module or environment variable; import everywhere                 |
| DRY applied to test code (reducing fixture duplication) | Test setup that's too DRY becomes hard to read in isolation                              | Tests should be self-contained; some duplication in test setup is acceptable    |

## Memory Protocol (MANDATORY)

**Before starting:**

```bash
cat .claude/context/memory/learnings.md
```

**After completing:** Record any new patterns or exceptions discovered.

> ASSUME INTERRUPTION: Your context may reset. If it's not in memory, it didn't happen.

