147 lines
7.4 KiB
Markdown
147 lines
7.4 KiB
Markdown
# Uncle Bob Craft — Expanded Reference
|
||
|
||
This document expands the criteria referenced in the main skill. Sources: *Clean Code*, *Clean Architecture*, *The Clean Coder*, *Clean Agile* (Robert C. Martin). Use for progressive disclosure when you need full lists or deeper context.
|
||
|
||
---
|
||
|
||
## Clean Architecture
|
||
|
||
### Dependency Rule
|
||
|
||
Source code dependencies must point only **inward** (toward higher-level policies). Inner layers do not know about outer layers (e.g., use cases do not import from the web framework or the database driver).
|
||
|
||
- **Entities** (enterprise business rules) — center, no outward dependencies.
|
||
- **Use cases** (application business rules) — depend only on entities.
|
||
- **Interface adapters** (presenters, gateways) — depend on use cases/entities.
|
||
- **Frameworks and drivers** (UI, DB, HTTP) — outermost; depend inward.
|
||
|
||
### Layers (hexagonal / ports and adapters)
|
||
|
||
| Layer | Responsibility | Depends on |
|
||
|-------|----------------|------------|
|
||
| Entities | Core business entities and rules | Nothing (innermost) |
|
||
| Use cases | Application-specific business rules, orchestration | Entities |
|
||
| Interface adapters | Convert data between use cases and external world | Use cases, entities |
|
||
| Frameworks & drivers | DB, UI, HTTP, file I/O | Interface adapters |
|
||
|
||
### SOLID in architecture context
|
||
|
||
- **SRP** — A module should have one reason to change (one actor).
|
||
- **OCP** — Open for extension, closed for modification (use abstractions and boundaries).
|
||
- **LSP** — Subtypes must be substitutable for their base types (interfaces and implementations).
|
||
- **ISP** — Many client-specific interfaces are better than one general-purpose interface (splitting interfaces at boundaries).
|
||
- **DIP** — Depend on abstractions, not concretions (invert dependencies at boundaries).
|
||
|
||
### Component design (summary)
|
||
|
||
For grouping classes into components: **REP** (reuse/release equivalence), **CCP** (common closure), **CRP** (common reuse); **ADP** (acyclic dependencies), **SDP** (stable dependencies), **SAP** (stable abstractions). See [references/clean-architecture.md](./references/clean-architecture.md) for brief definitions.
|
||
|
||
---
|
||
|
||
## The Clean Coder
|
||
|
||
### Professionalism
|
||
|
||
- **Do no harm** — Do not leave the code worse than you found it; leave it better when you can.
|
||
- **Work ethic** — Know your craft, practice, stay current.
|
||
- **Saying no** — Say no when the request is unreasonable or would compromise quality; offer alternatives.
|
||
- **Saying yes** — When you say yes, mean it; commit to deadlines you can meet.
|
||
|
||
### Estimation
|
||
|
||
- **Three-point estimates** — Best case, nominal, worst case; use for planning, not promises.
|
||
- **Velocity** — Use historical velocity for iteration planning; do not inflate commitments.
|
||
- **Uncertainty** — Communicate uncertainty; avoid false precision.
|
||
|
||
### Sustainable pace
|
||
|
||
- Avoid sustained overtime; it reduces quality and long-term output.
|
||
- Tests and refactoring are part of the job, not "extra."
|
||
|
||
### Tests as requirement
|
||
|
||
- Code without tests is legacy by definition. Writing tests is a professional requirement.
|
||
|
||
### Mentoring and collaboration
|
||
|
||
- Helping others (mentoring, pairing) and leaving the team and codebase better are part of professionalism.
|
||
|
||
---
|
||
|
||
## Clean Agile
|
||
|
||
### Values (from Agile manifesto, emphasized by Uncle Bob)
|
||
|
||
- Individuals and interactions over processes and tools.
|
||
- Working software over comprehensive documentation.
|
||
- Customer collaboration over contract negotiation.
|
||
- Responding to change over following a plan.
|
||
|
||
### Iron Cross (four values that support the above)
|
||
|
||
| Value | Meaning |
|
||
|-------|--------|
|
||
| **Communication** | Prefer face-to-face and collaboration; reduce information loss. |
|
||
| **Courage** | Courage to refactor, to say no, to change design when needed. |
|
||
| **Feedback** | Short feedback loops (tests, demos, iterations). |
|
||
| **Simplicity** | Do the simplest thing that could work; avoid speculative design. |
|
||
|
||
### Practices
|
||
|
||
- **TDD** — Red, green, refactor; tests first as specification and safety net.
|
||
- **Refactoring** — Continuous small improvements; keep tests green.
|
||
- **Pair programming** — Two people at one machine; design and quality improve.
|
||
- **Simple design** — No duplication, express intent, minimal elements, small abstractions.
|
||
|
||
---
|
||
|
||
## Smells and Heuristics (expanded)
|
||
|
||
### Design smells (from Clean Code / Clean Architecture)
|
||
|
||
| Code | Name | Brief |
|
||
|------|------|--------|
|
||
| **Rigidity** | Hard to change; one change triggers many. | Reduce coupling; introduce boundaries. |
|
||
| **Fragility** | Breaks in unexpected places. | Isolate changes; improve tests. |
|
||
| **Immobility** | Hard to reuse. | Extract reusable parts; reduce coupling. |
|
||
| **Viscosity** | Easy to hack, hard to do right. | Make right thing easy (abstractions, tests). |
|
||
| **Needless complexity** | Speculative or unused design. | YAGNI; remove until needed. |
|
||
| **Needless repetition** | DRY violated. | Extract common logic; name the abstraction. |
|
||
| **Opacity** | Hard to understand. | Rename, extract, clarify intent. |
|
||
|
||
### Heuristics (review checklist style)
|
||
|
||
- **C1 / Naming** — Names reveal intent; no disinformation (e.g., `accountList` when it is not a list).
|
||
- **C2 / Functions** — Small, one thing, one level of abstraction; few arguments.
|
||
- **C3 / Comments** — Prefer self-explanatory code; good comments for why, not what.
|
||
- **C4 / Formatting** — Newspaper metaphor; vertical density; variables near use.
|
||
- **C5 / Error handling** — Exceptions over return codes; don’t return or pass null without contract.
|
||
- **C6 / Tests** — F.I.R.S.T.; TDD when applicable.
|
||
- **C7 / Classes** — Small, single responsibility; stepdown rule.
|
||
- **T1 / Boundaries** — Dependencies point inward; no outer details in inner layers.
|
||
- **T2 / SOLID** — Check SRP, OCP, LSP, ISP, DIP in context.
|
||
- **T3 / Patterns** — Pattern used to solve a real problem, not for show.
|
||
|
||
(You can extend to a full C1–T9 list in your team; the above is a compact reference.)
|
||
|
||
---
|
||
|
||
## Design patterns (when and when not)
|
||
|
||
- **Use** when: you have repeated variation (Strategy), lifecycle/creation complexity (Factory), or a clear cross-cutting concern (e.g., logging, validation at a boundary).
|
||
- **Avoid** when: the code is simple and a pattern would add indirection without reducing duplication or clarifying intent.
|
||
- **Cargo cult** — Applying a pattern by name everywhere (e.g., everything is a Factory) without a design reason. Prefer "simplest thing that could work" until duplication or change axis appears.
|
||
|
||
---
|
||
|
||
---
|
||
|
||
## Scope and attribution
|
||
|
||
- **Clean Code** — Full heuristics and chapter-by-chapter detail: use the `@clean-code` skill. This skill references Clean Code for review context and defers naming/functions/formatting there.
|
||
- **Clean Architecture** — We cover the Dependency Rule, layers, boundaries, SOLID in architecture, and component cohesion/coupling (REP, CCP, CRP, ADP, SDP, SAP) in summary; the book has full treatment and more nuance.
|
||
- **The Clean Coder** — We summarize professionalism, estimation, sustainable pace, tests, and mentoring; the book has full chapters and stories.
|
||
- **Clean Agile** — We summarize values, Iron Cross, and key practices (TDD, refactoring, pairing, simple design); the book ties them to agile history and adoption.
|
||
|
||
*Attribution: Principles and structure drawn from Robert C. Martin, Clean Code (2008), Clean Architecture (2017), The Clean Coder (2011), Clean Agile (2019). This reference is a summary for agent use, not a substitute for the books.*
|