CommunityCodierung & Entwicklunggithub.com

yutna/oo-design

Verwenden Sie diese Fähigkeit, wenn Sie ein neues Modul, eine neue Funktion oder ein neues System in einer objektorientierten Codebasis beginnen, den Entwurf dimensionieren oder unsicher sind, welche Objektregel zutrifft.

Was ist oo-design?

Dieses Skill-Paket bietet eine umfassende Sammlung von Entwurfsregeln für objektorientierte Codebasen. Es ist kein universeller Rat, sondern spezifisch für OO-Stile und respektiert projekteigene Konventionen. Das Paket hilft dabei, den Umfang einer Entwurfsaufgabe zu bestimmen, indem es eine Tabelle bereitstellt, die zeigt, wie viel Aufwand für verschiedene Aufgabentypen angemessen ist (von einer einmaligen Antwort bis zu einem kompletten System). Vor dem Entwurf muss der Entwickler eine zentrale Regel (Gate) definieren, die die Software befolgen muss, mit einem akzeptierten und einem abgelehnten Beispiel – nur wenn dies möglich ist, sollte der Entwurf beginnen. Der Kern ist der „Design-Loop“, ein schrittweiser Prozess, der die Domänensprache, Verantwortlichkeiten, Aggregate, Domänenlogik, Nachrichtenentwurf, Abhängigkeitsinversion, Benennung und Überprüfung auf rote Flaggen abdeckt. Jede Regel ist als „Regel“ (Verstoß ist ein Fehler), „Standard“ (es sei denn, eine Bedingung gilt) oder „Beurteilung“ (zwei Antworten sind vertretbar) gekennzeichnet. Das Paket ordnet Symptome (z. B. „Diese Klasse tut zu viel“) spezifischen Skills zu (z. B. „Verantwortlichkeiten zuweisen“) und enthält sprachspezifische Skills für Java, Kotlin, TypeScript, JavaScript und Python, die Kernregeln mit sprachspezifischen Konstrukten ergänzen.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/yutna/object-oriented-design-skills/tree/HEAD/plugins/core/skills/oo-design

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Objektorientierter Entwurf

Überblick

Das Paket enthält Entwurfsregeln für Codebasen, die in einem objektorientierten Stil geschrieben sind, kein universeller Rat. Die eigenen schriftlichen Konventionen eines Projekts haben Vorrang vor dem Paket. Folgen Sie dem Idiom des Moduls, das geändert wird. Diese Fähigkeit dimensioniert die Aufgabe und benennt die Fähigkeit, die passt.

Laden Sie die Fähigkeit, die dieser Index nennt, bevor Sie antworten: Ihre Regeln und Beispiele leben dort, nicht hier.

Wie viel Entwurf eine Aufgabe rechtfertigt

AufgabeVerwendenÜberspringen
Eine Antwort, die einmal verwendet und dann weggeworfen wirdNichtsAlles
Eine Methode in einer Klasse, die existiertIhr Name und ihr VertragUmgestaltung
Eine Funktion innerhalb eines bestehenden AblaufsDas Idiom, das dieser Ablauf verwendetNeue Grenzen
Eine neue Klasse oder ModulDie EntwurfsschleifeNichts
Ein neuer KontextDie Schleife, dann ihre GrenzenNichts
Ein neues System aus dem NichtsDie Schleife, Kontexte, dann StrukturNichts

Vor dem Entwurf

Vor dem Entwurf geben Sie das Tor an: eine Regel, die die Software befolgen muss, mit einem Beispiel, das sie akzeptiert, und einem, das sie ablehnt. Zum Beispiel: „Ein Slot kann höchstens einen Termin enthalten.“ Es akzeptiert, einen zweiten Patienten in einen anderen Slot zu buchen, und lehnt es ab, einen zweiten Patienten in denselben Slot zu buchen. Wenn Sie die Regel aufschreiben können, beginnen Sie. Wenn nicht, fehlt etwas, das nicht der Entwurf ist, und dieses Paket kann es nicht liefern.

Die Entwurfsschleife

  1. Sagen Sie, was die Software in den Worten der Domäne tun muss (die Domänensprache sprechen), und finden Sie das Objekt, das weiß, was jedes Verhalten braucht (Verantwortlichkeiten zuweisen).
  2. Finden Sie die Konsistenzgrenze: was in einer Transaktion zusammen wahr sein muss (Aggregate entwerfen).
  3. Entscheiden Sie, wo jede Regel lebt: eine Entität, ein Wertobjekt oder ein Domänendienst (Domänenlogik platzieren).
  4. Entwerfen Sie die Nachrichten, die jedes Objekt beantwortet (Zustand und Verhalten kapseln), und machen Sie illegale Zustände unmöglich zu konstruieren (illegale Zustände unmöglich machen).
  5. Kehren Sie Abhängigkeiten um, sodass die Domäne nichts von der Datenbank oder dem Framework weiß (Abhängigkeiten umkehren, das System schichten).
  6. Benennen Sie Dinge in den Worten der Domäne und kommentieren Sie nur das, was der Code nicht sagen kann (Klassen und Methoden benennen, kommentieren, was der Code nicht sagen kann).
  7. Überprüfen Sie das Ergebnis anhand der roten Flaggen unten (Objektentwurf überprüfen).

Wie streng eine Regel gemeint ist

Jede Kernregel in diesem Paket trägt eines von drei Etiketten, und das Etikett sagt, wie streng sie gemeint ist.

  • Regel. Ein Verstoß ist ein Fehler. Kein Framework entschuldigt ihn.
  • Standard. Tun Sie dies, es sei denn, eine angegebene Bedingung gilt. Die Bedingung ist ihr eigener Satz, niemals eine nachgestellte Klausel.
  • Beurteilung. Zwei Antworten sind vertretbar. Die Fähigkeit sagt, was die Waage kippt.

Symptome zu Fähigkeiten

Symptome verweisen auf die Fähigkeit, die sie behandelt, und diese Tabelle wächst, wenn Fähigkeiten hinzukommen.

SymptomFähigkeit
Welche Klasse sollte das tun?Verantwortlichkeiten zuweisen
Diese Klasse tut zu vielVerantwortlichkeiten zuweisen
Eine Änderung wirkt sich auf viele Klassen ausKopplung diagnostizieren
Wie eng sind diese beiden Teile verbunden?Kopplung diagnostizieren
Ist das ein Objekt oder nur Daten?Objekt oder Daten entscheiden
Unser Domänenmodell ist anämischObjekt oder Daten entscheiden
Anderer Code entscheidet für dieses ObjektZustand und Verhalten kapseln
Setter lassen dieses Objekt seine Regeln brechenZustand und Verhalten kapseln
Dieses Objekt kann halb aufgebaut existierenGültige Objekte konstruieren
Dieser Konstruktor nimmt zu viele ArgumenteGültige Objekte konstruieren
Jeder neue Fall bedeutet, funktionierenden Code zu bearbeitenWas variiert, einkapseln
Wie viel Flexibilität sollte dies haben?Was variiert, einkapseln
Ist das ein Wert oder eine Entität?Werte und Entitäten modellieren
Rohe Zeichenketten und Zahlen tragen DomänenregelnWerte und Entitäten modellieren
Sollte dies jene Klasse erweitern oder sie halten?Komposition über Vererbung wählen
Das Ändern einer Basisklasse bricht ihre UnterklassenKomposition über Vererbung wählen
Eine Unterklasse bricht, was ihr Elternteil versprichtSubstituierbarkeit einhalten
Code überprüft, welchen Subtyp er hältSubstituierbarkeit einhalten
Die gleiche Switch-Anweisung über einen Typ kommt immer wiederBedingungen durch Polymorphie ersetzen
Unterklassen oder Pattern Matching?Bedingungen durch Polymorphie ersetzen
Code reicht durch eine Kette von ObjektenBegrenzen, was ein Objekt weiß
Diese Klasse leitet nur Aufrufe weiterBegrenzen, was ein Objekt weiß
Wie sollte diese Klasse oder Methode heißen?Klassen und Methoden benennen
Namen wie Manager, Helper oder UtilKlassen und Methoden benennen
Aufrufer hängen von Schnittstellenmethoden ab, die sie nie verwendenSchnittstellen entwerfen
Schnittstelle oder abstrakte Basisklasse?Schnittstellen entwerfen
Domänencode hängt von einer Datenbank oder einem Framework abAbhängigkeiten umkehren
Wo werden Objekte erstellt und verdrahtet?Abhängigkeiten umkehren
Aufrufer wissen, wie eine andere Klasse Daten speichert oder formatiertImplementierung verbergen
Eine Klasse gibt ihre internen Fehler oder Schritte preisImplementierung verbergen
Flags oder optionale Felder erlauben unmögliche KombinationenIllegale Zustände unmöglich machen
Ein Typ lässt Werte zu, die die Domäne nie hatIllegale Zustände unmöglich machen
Die Worte des Codes unterscheiden sich von denen des PersonalsDie Domänensprache sprechen
Ein Wort bedeutet für zwei Teams unterschiedliche DingeDie Domänensprache sprechen
Welche Objekte müssen sich zusammen ändern?Aggregate entwerfen
Speichervorgänge kollidieren oder ein Laden zieht zu vielAggregate entwerfen
Welche Statusänderungen sind erlaubt?Lebenszyklen modellieren
Ein abgebrochenes oder geschlossenes Objekt ändert sich erneutLebenszyklen modellieren
Wie sollten Domänenobjekte gespeichert und gefunden werden?Repositories entwerfen
Das Repository hat eine Find-Methode pro BildschirmRepositories entwerfen
Anwendungsfälle wiederholen die gleiche GeschäftsprüfungDomänenlogik platzieren
Domänendienst, Entitätsmethode oder Anwendungsdienst?Domänenlogik platzieren
Andere Teile müssen reagieren, nachdem eine Änderung gespeichert wurdeDomänenereignisse veröffentlichen
Eine Nachricht wurde für eine Änderung gesendet, die zurückgesetzt wurdeDomänenereignisse veröffentlichen
Wo endet das Modell eines Teams und das eines anderen beginnt?Kontexte abgrenzen
Welche Teile sind Kern und welche können wir kaufen?Kontexte abgrenzen
In welche Richtung sollten die Schichten abhängen?Das System schichten
Ein Bildschirm oder Job kann nicht ohne sein Framework getestet werdenDas System schichten
Module hängen zyklisch voneinander abModule organisieren
Modularer Monolith oder separate Dienste?Module organisieren
Eine Änderung an unserer API bricht die Apps, die sie aufrufenSystemgrenzen überschreiten
Wie sollten wir diese API oder Nachricht versionieren?Systemgrenzen überschreiten
Das Mapping-Werkzeug formt unsere DomänenklassenPersistenz bändigen
Eine Liste führt eine Abfrage pro Zeile durchPersistenz bändigen
Bildschirme benötigen Daten, die anders geformt sind als das ModellLesevorgänge von Schreibvorgängen trennen
Read Model, Projection oder Event Sourcing?Lesevorgänge von Schreibvorgängen trennen
MVC, MVP oder MVVM für diesen Bildschirm?Darstellung von Domäne trennen
Ein Bildschirm bearbeitet Domänenobjekte direktDarstellung von Domäne trennen
Welches Entwurfsmuster passt zu diesem Problem?Ein Muster wählen
Ein Muster wurde vor seinem Problem hinzugefügtEin Muster wählen
Diese Musterklassen könnten eine Funktion seinMuster, die die Sprache bereitstellt
Visitor oder eine geschlossene Menge mit Matching?Muster, die die Sprache bereitstellt
Eine Methode gibt null zurück, wenn sie nichts findetFehlerverhalten entwerfen
Ablehnungen kommen als Codes zurück, die Aufrufer ignorierenFehlerverhalten entwerfen
Threads teilen ein Objekt und verlieren oder vermischen seine ÄnderungenGemeinsamen Zustand verwalten
Ein Lock oder ein einzelner Besitzer für diesen Zustand?Gemeinsamen Zustand verwalten
Ein Aufruf an ein anderes System hängt oder schlägt fehlArbeit zuverlässig machen
Ein Wiederholungsversuch hat die Arbeit zweimal erledigtArbeit zuverlässig machen
Wir können einen Vorfall nicht aus unseren Aufzeichnungen erklärenEntwerfen, was aufgezeichnet wird
Was sollten wir protokollieren, zählen oder prüfen?Entwerfen, was aufgezeichnet wird
Eine Überprüfung fand eine Gottklasse oder einen LavaflussAntipatterns erkennen
Welches Antipattern sollten wir zuerst beheben?Antipatterns erkennen
Tests brechen, obwohl sich das Verhalten nicht geändert hatObjektorientierten Code testen
Mock, Stub oder Fake für diesen Kollaborateur?Objektorientierten Code testen
Tests hängen von der Zeit oder zufälligen Werten abFür Testbarkeit entwerfen
Code wird nur öffentlich gemacht, damit Tests ihn erreichen könnenFür Testbarkeit entwerfen
Wie strukturieren wir diesen Code sicher um?Hin zum Objektentwurf umgestalten
Eine Umgestaltung wurde zu groß, um sie abzuschließenHin zum Objektentwurf umgestalten
Wir müssen Code ändern, der keine Tests hatMit Legacy-Code arbeiten
Ersetzen Sie ein altes System Stück für StückMit Legacy-Code arbeiten
Was sollte diese Überprüfung prüfen?Objektentwurf überprüfen
Welche Überprüfungsbefunde blockieren einen Merge?Objektentwurf überprüfen
Niemand erinnert sich, warum der Code so geformt istEntwurfsentscheidungen dokumentieren
Was sollten wir zeichnen und auf welcher Ebene?Entwurfsentscheidungen dokumentieren
Kommentare wiederholen den Code oder widersprechen ihmKommentieren, was der Code nicht sagen kann
Wo erklären wir, warum dieser Code seltsam aussieht?Kommentieren, was der Code nicht sagen kann
Ein Framework-Hook oder -Marker enthält eine GeschäftsregelInnerhalb eines Frameworks arbeiten
Wie weit sollten wir mit dem Framework gehen?Innerhalb eines Frameworks arbeiten
Eine Berechnung speichert auch, sendet oder ändert ihre EingabenFunktionale Techniken anwenden
Welche funktionalen Techniken passen zu Objektcode?Funktionale Techniken anwenden

Sprachfähigkeiten

Eine Sprachfähigkeit hält die Kernregeln in einer Sprache und ersetzt sie nie. Eine Basis-Sprachfähigkeit ist für Code ohne Framework.

  • oo-java, aus object-oriented-design-java: Records, versiegelte Typen, equals und hashCode, geprüfte Ausnahmen, Optional, und Klassen, die für Erweiterungen geschlossen sind.
  • oo-kotlin, aus object-oriented-design-kotlin: Datenklassen, versiegelte Typen, nullable Typen, Delegation mit by, und Erweiterungsfunktionen.
  • oo-typescript, aus object-oriented-design-typescript: Markierte Bezeichner, #private-Zustand, abstrakte Klassen, Dekorateure, diskriminierte Vereinigungen und eine Kompositionswurzel.
  • oo-javascript, aus object-oriented-design-javascript: Klassenmitglieder mit #, Fabrikfunktionen, optionale Verkettung, Nullish Coalescing, und Module.
  • oo-python, aus object-oriented-design-python: @dataclass, @property, typing.final, NamedTuple, Abstract Base Classes und @staticmethod.

Verwandte Skills