Diese Spezifikation beschreibt die Daten-Strukturen und Schnittstellen der Semantic Anchors Website.
Hinweis: Da dies eine statische Website ist, sind die "APIs" primär Datenstrukturen (JSON/YAML) und JavaScript-Module, keine REST-Endpoints.
{
"id": "tdd-london-school",
"name": "TDD, London School",
"fullName": "Test-Driven Development, London School",
"alsoKnownAs": ["Mockist TDD", "Outside-In TDD"],
"categories": ["testing-quality"],
"roles": ["software-developer", "qa-engineer", "architect"],
"proponents": [
{
"name": "Steve Freeman",
"publication": "Growing Object-Oriented Software, Guided by Tests"
},
{
"name": "Nat Pryce",
"publication": "Growing Object-Oriented Software, Guided by Tests"
}
],
"coreConcepts": [
"Mock-heavy testing",
"Outside-in development",
"Interaction-based testing",
"Behavior verification",
"Interface discovery",
"Walking skeleton"
],
"whenToUse": [
"Complex systems with many collaborating objects",
"When designing APIs and interfaces",
"Distributed systems where integration is costly"
],
"relatedAnchors": ["tdd-chicago-school", "hexagonal-architecture"],
"tags": ["testing", "tdd", "mocking", "outside-in"],
"filePath": "docs/anchors/tdd-london-school.adoc"
}Felder-Beschreibung:
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
string |
Ja |
Eindeutiger Identifier (kebab-case), verwendet für URLs und Referenzen |
|
string |
Ja |
Anzeigename des Ankers |
|
string |
Nein |
Ausgeschriebener vollständiger Name |
|
string[] |
Nein |
Alternative Namen oder Synonyme |
|
string[] |
Ja |
Liste von Kategorie-IDs (mindestens 1) |
|
string[] |
Ja |
Liste von Rollen-IDs (mindestens 1) |
|
Proponent[] |
Ja |
Schlüsselfiguren und deren Publikationen |
|
string[] |
Ja |
Kernkonzepte des Ankers |
|
string[] |
Ja |
Anwendungsfälle |
|
string[] |
Nein |
IDs verwandter Anker |
|
string[] |
Nein |
Suchbegriffe und Schlagwörter |
|
string |
Ja |
Relativer Pfad zur AsciiDoc-Datei |
{
"id": "testing-quality",
"name": "Testing & Quality Practices",
"nameDE": "Testing & Qualitätspraktiken",
"description": "Methodologies and practices for software testing and quality assurance",
"descriptionDE": "Methodiken und Praktiken für Software-Testing und Qualitätssicherung",
"anchorCount": 12,
"anchors": [
"tdd-london-school",
"tdd-chicago-school",
"property-based-testing",
"mutation-testing",
"testing-pyramid"
],
"color": "#4CAF50"
}Felder-Beschreibung:
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
string |
Ja |
Eindeutiger Identifier (kebab-case) |
|
string |
Ja |
Kategorie-Name (EN) |
|
string |
Ja |
Kategorie-Name (DE) |
|
string |
Ja |
Kurzbeschreibung (EN) |
|
string |
Ja |
Kurzbeschreibung (DE) |
|
number |
Ja |
Anzahl Anker in dieser Kategorie |
|
string[] |
Ja |
Liste von Anker-IDs |
|
string |
Nein |
Farbe für Visualisierung (Hex-Code) |
{
"id": "software-developer",
"name": "Software Developer / Engineer",
"nameDE": "Software-Entwickler",
"description": "Developers writing and maintaining code",
"descriptionDE": "Entwickler, die Code schreiben und warten",
"anchorCount": 35,
"anchors": [
"tdd-london-school",
"tdd-chicago-school",
"solid-principles",
"clean-architecture",
"conventional-commits"
],
"icon": "💻"
}Felder-Beschreibung:
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
string |
Ja |
Eindeutiger Identifier (kebab-case) |
|
string |
Ja |
Rollen-Name (EN) |
|
string |
Ja |
Rollen-Name (DE) |
|
string |
Ja |
Kurzbeschreibung (EN) |
|
string |
Ja |
Kurzbeschreibung (DE) |
|
number |
Ja |
Anzahl Anker für diese Rolle |
|
string[] |
Ja |
Liste von Anker-IDs |
|
string |
Nein |
Emoji oder Icon für UI |
{
"name": "Steve Freeman",
"publication": "Growing Object-Oriented Software, Guided by Tests",
"year": 2009,
"url": "https://www.growing-object-oriented-software.com"
}Felder-Beschreibung:
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
string |
Ja |
Name des Proponenten |
|
string |
Nein |
Hauptpublikation oder -werk |
|
number |
Nein |
Publikationsjahr |
|
string |
Nein |
Link zur Publikation oder Website |
{
"name": "Testing & Quality Practices",
"value": 12,
"children": [
{
"name": "TDD, London School",
"value": 1,
"anchorId": "tdd-london-school",
"roles": ["software-developer", "qa-engineer"]
},
{
"name": "Property-Based Testing",
"value": 1,
"anchorId": "property-based-testing",
"roles": ["software-developer", "qa-engineer"]
}
],
"itemStyle": {
"color": "#4CAF50"
}
}Liefert alle Kategorien mit Metadata.
Response:
{
"categories": [
{
"id": "testing-quality",
"name": "Testing & Quality Practices",
"nameDE": "Testing & Qualitätspraktiken",
"anchorCount": 12,
"anchors": ["tdd-london-school", "..."]
}
]
}Liefert alle Rollen mit Metadata.
Response:
{
"roles": [
{
"id": "software-developer",
"name": "Software Developer / Engineer",
"nameDE": "Software-Entwickler",
"anchorCount": 35,
"anchors": ["tdd-london-school", "..."]
}
]
}Liefert alle Anker mit vollständigen Metadata (ohne AsciiDoc-Content).
Response:
{
"anchors": [
{
"id": "tdd-london-school",
"name": "TDD, London School",
"categories": ["testing-quality"],
"roles": ["software-developer", "qa-engineer"],
"filePath": "docs/anchors/tdd-london-school.adoc"
}
]
}Liefert detaillierte Informationen zu einem spezifischen Anker.
Path Parameters:
| Parameter | Typ | Beschreibung |
|---|---|---|
|
string |
Eindeutige Anker-ID (z.B. "tdd-london-school") |
Response:
{
"id": "tdd-london-school",
"name": "TDD, London School",
"fullName": "Test-Driven Development, London School",
"categories": ["testing-quality"],
"roles": ["software-developer", "qa-engineer", "architect"],
"proponents": [...],
"coreConcepts": [...],
"whenToUse": [...],
"relatedAnchors": ["tdd-chicago-school", "hexagonal-architecture"],
"filePath": "docs/anchors/tdd-london-school.adoc"
}Error Responses:
-
404: Anker nicht gefunden
Liefert den rohen AsciiDoc-Content eines Ankers.
Response: AsciiDoc Plain Text
Rendert AsciiDoc zu HTML (clientseitig via asciidoctor.js).
Query Parameters:
| Parameter | Typ | Pflicht | Beschreibung |
|---|---|---|---|
|
string |
Ja |
ID des zu rendernden Ankers |
|
string |
Nein |
Sprache für UI-Elemente (en, de), Default: en |
Response:
{
"html": "<div class='sect1'>...</div>",
"metadata": {
"id": "tdd-london-school",
"name": "TDD, London School"
}
}Filtert Anker nach einer oder mehreren Rollen.
JavaScript Signatur:
/**
* Filtert Anker nach Rollen
* @param {string[]} roleIds - Array von Rollen-IDs
* @returns {Anchor[]} - Gefilterte Anker
*/
function filterByRole(roleIds) {
return anchors.filter(anchor =>
roleIds.some(roleId => anchor.roles.includes(roleId))
);
}Filtert Anker nach einer oder mehreren Kategorien.
JavaScript Signatur:
/**
* Filtert Anker nach Kategorien
* @param {string[]} categoryIds - Array von Kategorie-IDs
* @returns {Anchor[]} - Gefilterte Anker
*/
function filterByCategory(categoryIds) {
return anchors.filter(anchor =>
categoryIds.some(catId => anchor.categories.includes(catId))
);
}Durchsucht Anker nach Suchbegriff.
JavaScript Signatur:
/**
* Durchsucht Anker
* @param {string} query - Suchbegriff
* @returns {SearchResult[]} - Suchergebnisse mit Relevanz-Score
*/
function searchAnchors(query) {
const normalizedQuery = query.toLowerCase();
return anchors.map(anchor => {
let score = 0;
// Name match (höchste Priorität)
if (anchor.name.toLowerCase().includes(normalizedQuery)) score += 10;
// Proponents match
if (anchor.proponents.some(p =>
p.name.toLowerCase().includes(normalizedQuery))) score += 5;
// Core concepts match
if (anchor.coreConcepts.some(c =>
c.toLowerCase().includes(normalizedQuery))) score += 3;
// Tags match
if (anchor.tags?.some(t =>
t.toLowerCase().includes(normalizedQuery))) score += 2;
return { anchor, score };
})
.filter(result => result.score > 0)
.sort((a, b) => b.score - a.score)
.map(result => result.anchor);
}Generiert Treemap-Daten aus Ankern und Kategorien.
JavaScript Signatur:
/**
* Generiert ECharts Treemap-Daten
* @param {Anchor[]} anchors - Anker-Array
* @param {Category[]} categories - Kategorie-Array
* @returns {TreemapNode[]} - Treemap-Datenstruktur
*/
function generateTreemapData(anchors, categories) {
return categories.map(category => ({
name: category.name,
value: category.anchorCount,
itemStyle: { color: category.color },
children: anchors
.filter(a => a.categories.includes(category.id))
.map(anchor => ({
name: anchor.name,
value: 1,
anchorId: anchor.id,
roles: anchor.roles
}))
}));
}Liefert Meta-Informationen über die gesamte Datensammlung.
Response:
{
"totalAnchors": 60,
"totalCategories": 10,
"totalRoles": 12,
"lastUpdated": "2025-02-13T10:00:00Z",
"version": "2.0.0",
"languages": ["en", "de"],
"statistics": {
"anchorsByCategory": {
"testing-quality": 12,
"architecture-design": 8,
"design-principles": 10
},
"anchorsByRole": {
"software-developer": 35,
"architect": 25,
"product-owner": 15
}
}
}Liefert optimierten Suchindex für Client-Side Suche.
Response:
{
"index": [
{
"id": "tdd-london-school",
"tokens": ["tdd", "london", "school", "mockist", "outside-in", "steve", "freeman"],
"name": "TDD, London School"
}
],
"tokenMap": {
"tdd": ["tdd-london-school", "tdd-chicago-school"],
"testing": ["tdd-london-school", "property-based-testing", "mutation-testing"]
}
}Liefert UI-Übersetzungen für eine Sprache.
Path Parameters:
| Parameter | Typ | Beschreibung |
|---|---|---|
|
string |
Sprachcode (en, de) |
Response Beispiel (/i18n/de.json):
{
"nav": {
"home": "Startseite",
"categories": "Kategorien",
"roles": "Rollen",
"about": "Über"
},
"filter": {
"byRole": "Nach Rolle filtern",
"byCategory": "Nach Kategorie filtern",
"clear": "Filter zurücksetzen"
},
"search": {
"placeholder": "Semantische Anker durchsuchen...",
"noResults": "Keine Ergebnisse gefunden",
"resultsCount": "{count} Ergebnisse"
},
"anchor": {
"fullName": "Vollständiger Name",
"alsoKnownAs": "Auch bekannt als",
"coreConcepts": "Kernkonzepte",
"proponents": "Hauptvertreter",
"whenToUse": "Wann verwenden",
"relatedAnchors": "Verwandte Anker"
},
"theme": {
"light": "Heller Modus",
"dark": "Dunkler Modus",
"toggle": "Theme wechseln"
}
}Alle Daten-Zugriffe sollten folgende Fehlerbehandlung implementieren:
async function loadData(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
return await response.json();
} catch (error) {
console.error(`Failed to load data from ${url}:`, error);
// Fallback oder User-Notification
showError(`Daten konnten nicht geladen werden: ${error.message}`);
return null;
}
}Build-Time:
- Alle JSON-Dateien werden beim Build generiert
- Versionierung via Hash im Dateinamen (z.B. anchors.abc123.json)
Runtime: - Browser-Cache für statische JSON-Dateien (1 Tag) - localStorage für User-Präferenzen (Sprache, Theme, Filter) - Service Worker für Offline-Verfügbarkeit (optional)