Engineering Standards
Foundational principles for high-quality software. Use this skill when:
- Reviewing code for quality issues
- Planning architectural changes
- Identifying refactoring opportunities
- Evaluating technical debt
SOLID Principles
Single Responsibility (SRP)
A class/module should have one reason to change.
Detection patterns:
- Class with 5+ public methods doing unrelated things
- Method longer than 50 lines
- Class name contains "And" or "Manager" with mixed concerns
- File imports from 10+ unrelated modules
Refactoring:
- Extract class for each responsibility
- Split into focused modules
- Use composition over inheritance
Open/Closed (OCP)
Open for extension, closed for modification.
Detection patterns:
- Switch/case on type with frequent additions
- if/else chains checking instance types
- Modifying existing code to add new features
Refactoring:
- Strategy pattern for varying behaviors
- Plugin architecture for extensions
- Dependency injection for configurability
Liskov Substitution (LSP)
Subtypes must be substitutable for their base types.
Detection patterns:
- Override that throws "not implemented"
- Subclass that ignores parent behavior
- Type checks before calling inherited methods
Refactoring:
- Favor composition over inheritance
- Extract interface for true polymorphism
- Use abstract base with required overrides
Interface Segregation (ISP)
Clients shouldn't depend on methods they don't use.
Detection patterns:
- Interface with 10+ methods
- Implementing classes that stub methods as no-ops
- "Fat" interfaces with unrelated method groups
Refactoring:
- Split into role-specific interfaces
- Use mixins/traits for optional behaviors
- Compose multiple focused interfaces
Dependency Inversion (DIP)
Depend on abstractions, not concretions.
Detection patterns:
- Direct instantiation of dependencies (
new ConcreteClass())
- Hard-coded database/API connections
- Test files creating production instances
Refactoring:
- Constructor injection
- Factory pattern for complex creation
- Interface-based dependencies
DRY (Don't Repeat Yourself)
Detection patterns:
- Copy-pasted code blocks (3+ occurrences)
- Similar functions with minor variations
- Duplicated validation logic
- Repeated configuration values
Refactoring:
- Extract shared function/class
- Parameterize variations
- Create configuration constants
- Use template method pattern
Exceptions (acceptable duplication):
- Test code clarity (explicit over DRY)
- Cross-boundary isolation (microservices)
- Performance-critical paths
YAGNI (You Aren't Gonna Need It)
Detection patterns:
- Unused parameters "for future use"
- Abstract classes with single implementation
- Configuration options never used
- Speculative generalization
Guidance:
- Build for current requirements
- Refactor when needs emerge
- Delete dead code immediately
- Prefer simple over flexible
KISS (Keep It Simple, Stupid)
Detection patterns:
- Cyclomatic complexity > 10
- Nested callbacks/promises 4+ deep
- Generic solutions for specific problems
- Framework overkill for simple tasks
Refactoring:
- Flatten control flow
- Extract named functions
- Use early returns
- Choose boring technology
Code Smells Quick Reference
| Smell |
Symptom |
Fix |
| Long Method |
>50 lines, multiple concerns |
Extract method |
| Large Class |
>500 lines, many responsibilities |
Extract class |
| Feature Envy |
Method uses other class more than own |
Move method |
| Data Clumps |
Same fields appear together |
Extract object |
| Primitive Obsession |
Strings/ints for domain concepts |
Value objects |
| Switch Statements |
Type-based switching |
Polymorphism |
| Parallel Inheritance |
Every subclass needs partner subclass |
Merge hierarchies |
| Lazy Class |
Class doing too little |
Inline class |
| Speculative Generality |
Unused abstraction |
Remove it |
| Temporary Field |
Field only set sometimes |
Extract class |
When to Apply
Always apply:
- SRP, DRY for production code
- KISS for all code
Apply with judgment:
- OCP when extension points are clear
- ISP when interfaces grow beyond 5 methods
- DIP at module boundaries
Defer:
- YAGNI violations until pattern emerges 3+ times
See references/refactoring-catalog.md for detailed refactoring techniques.