- PHP 20.1%
- Scheme 14.4%
- JavaScript 10.5%
- Python 10.4%
- Java 6.8%
- Other 37.8%
Type-directed resolution arrived (daisy: the named-element FIELD arm on carried types): a construction-known or typed receiver now resolves, so the old blanket shared-name refusal is gone. The case teaches what remains — an untyped receiver in span() that neither carried type nor uniqueness can place still refuses, and honestly. |
||
|---|---|---|
| history | ||
| pattern | ||
| refactor | ||
| smell | ||
| .gitattributes | ||
| AXES.md | ||
| READING.md | ||
| README.md | ||
catalog
A library of code smells, refactorings, and design patterns — the recognitions and corrective moves of the software-craft literature, drawn from published authors and rendered in one uniform, machine-readable entry format, alongside original entries this project has coined. It is consumed as a version-pinned dependency: tools depend on a specific commit, so the same catalog always yields the same answers.
What an entry is
Each entry is its own directory — composition over embedding. Source examples live as real, runnable files
rather than being held hostage as escaped strings inside markdown fences (the
hostage-situation smell, applied to our own
format). A typical entry carries:
description.md— what the smell/refactor/pattern is, in prose.examples/<case>/— a case with ameta.json(outcome, the smell it relates to, the languages it covers) and per-language before/after fixtures. A refused case is as first-class as a transformed one — a refusal is a recognition.arcs/<case>/(refactors) — a bigger change as an ordered sequence of behaviour-preserving steps, each a named smaller move, with a fixture at every state. An arc is the runnable form of a composed refactor: tidy by tidy, or strangler-fig step by step.prompt.md(where a model recognises or applies the entry) — the natural-language detector/actuator.
Entries link to each other by relation: a refused case names the smell that blocks it; a transformed case names the smell it cures. Composed, those links form a smell↔refactor dependency graph.
How it is organised
Three top-level groups — smell/, refactor/, pattern/ —
with each author lineage a directory inside its group. smell/ also holds Opdyke preconditions — a
distinct kind that is not a smell, but is recognised present-or-absent the same way (the blocked-by node
between a smell and its refactor). A few operational lineages that are not smell/refactors/patterns stay at the
root. The author prefix names whose recognition an entry follows; daisy- marks entries this project
originated. Smells are classified onto four quality axes plus two grounds —
see AXES.md. The sources are catalogued in READING.md.
| Lineage | Source |
|---|---|
beck-tidy/ |
Beck, Tidy First? (2023) |
fowler-refactor/ |
Fowler, Refactoring (2nd ed., 2018) |
feathers-refactor/ |
Feathers, Working Effectively with Legacy Code (2004) |
kerievsky-refactor/ |
Kerievsky, Refactoring to Patterns (2005) |
fowler-smell/ |
Fowler, Refactoring — code smells |
constantine-smell/ |
Myers, Composite Design (1975) / Constantine & Yourdon, Structured Design (1979) — the coupling ladder |
opdyke-precondition/ |
Opdyke, Refactoring Object-Oriented Frameworks (1992) — the enabling conditions a refactor must find true; the blocked-by node between smell and refactor (not a smell, recognized like one) |
meszaros-test-smell/ |
Mészáros, xUnit Test Patterns (2007) — test smells |
meszaros-test-refactor/ |
Mészáros — test-smell → test-pattern moves |
meszaros-test-pattern/ |
Mészáros — test pattern destinations |
wake-test-pattern/ |
Bill Wake — Arrange-Act-Assert (2001) |
north-test-pattern/ |
Dan North — Given-When-Then / BDD (2006) |
goos-pattern/ |
Freeman & Pryce, Growing Object-Oriented Software, Guided by Tests (2009) |
gof-pattern/ |
Gamma/Helm/Johnson/Vlissides, Design Patterns (1994) |
meyer-pattern/ |
Meyer, Object-Oriented Software Construction (1997) — Command-Query Separation |
young-pattern/ |
Greg Young — CQRS (~2010) |
beck-pattern/ |
Beck, Smalltalk Best Practice Patterns (1997) — Intention-Revealing Name |
poeaa-pattern/ |
Fowler, Patterns of Enterprise Application Architecture (2002) |
karwin-sql-smell/ |
Karwin, SQL Antipatterns (2010 / 2022) |
ambler-sql-refactor/ |
Ambler & Sadalage, Refactoring Databases (2006) |
nygard-ops-smell/ · nygard-ops-action/ |
Nygard, Release It! (2018) — stability antipatterns & damping moves |
daisy-tidy/ · daisy-refactor/ |
original — extensions to Beck / Fowler |
daisy-smell/ · daisy-test-smell/ |
original — code/doc/data/policy/process smells; test smells in Mészáros's tradition |
daisy-regex-smell/ · daisy-regex-refactor/ |
original — regex smells & moves, on Friedl; Goyvaerts & Levithan |
daisy-pattern/ · daisy-ops-smell/ · daisy-ops-action/ · daisy-verb/ · daisy-workflow/ · myers-test-axis/ |
original — pattern destinations, operational smells & moves, verbs, workflows |
Using the catalog
Pin it by commit — as a git submodule, or by cloning at a tag/hash. Consumers read entries through their own index; nothing here depends on a particular consumer. Growing the catalog is a normal contribution: add an entry as files on a branch, with its example (and, for a refactor, an arc), and open it for review.