| name | engineering-standards |
|---|---|
| description | Core software engineering principles (SOLID, DRY, YAGNI, KISS) with detection patterns and refactoring guidance. Load when reviewing code quality, planning architecture, or identifying technical debt. |
| license | MIT |
| metadata | {"author": "groupzer0", "version": "1.0"} |
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.