Zum Hauptinhalt springen

Code Guidelines

Coding Guidelines fĂĽr das JayDee-Development-Team. Diese Regeln sollen dafĂĽr sorgen, dass unsere Codebases sauber, konsistent und fĂĽr alle im Team leicht lesbar bleiben.

Kernprinzip: KISS - Keep It Simple and Stupid. Einfacher, sauberer, lesbarer Code ist immer das Ziel. Wenn sich eine Lösung kompliziert anfühlt, einen Schritt zurückgehen und den einfacheren Weg suchen.

1. Allgemeine Denkweise​

Schreibe Code so, als hätte die nächste Person das Projekt noch nie gesehen. Sie sollte verstehen können, was passiert, ohne fünf andere Dateien öffnen zu müssen.

  • Bevorzuge geradlinige Lösungen statt cleverer Tricks. Cleverer Code ist schwer zu debuggen.
  • Baue nur das, was angefragt wurde. Keine spekulativen Features und keine "wenn ich schon dabei bin"-Verbesserungen.
  • Wenn etwas unklar ist, frage nach. Nicht raten und auf Annahmen aufbauen.
  • Wenn du bestehenden Code änderst, passe dich dem vorhandenen Stil an. Konsistenz innerhalb einer Datei ist wichtiger als persönliche Vorlieben.

Trade-off: Diese Guidelines bevorzugen Vorsicht gegenĂĽber Geschwindigkeit. Bei trivialen Aufgaben ist AugenmaĂź gefragt.

1.1 Think Before Coding​

Nichts annehmen. Verwirrung nicht verstecken. Trade-offs sichtbar machen.

Vor der Implementierung:

  • Annahmen explizit benennen. Bei Unsicherheit nachfragen.
  • Wenn mehrere Interpretationen möglich sind, diese nennen - nicht still eine auswählen.
  • Wenn ein einfacherer Ansatz existiert, darauf hinweisen. Bei Bedarf freundlich widersprechen.
  • Wenn etwas unklar ist, stoppen. Benennen, was verwirrt. Nachfragen.

1.2 Simplicity First​

So wenig Code wie möglich, um das Problem zu lösen. Nichts Spekulatives.

  • Keine Features ĂĽber die Anfrage hinaus.
  • Keine Abstraktionen fĂĽr Single-Use-Code.
  • Keine "Flexibilität" oder "Konfigurierbarkeit", die nicht verlangt wurde.
  • Kein Error Handling fĂĽr unmögliche Szenarien.
  • Wenn du 200 Zeilen schreibst und es auch 50 sein könnten, umschreiben.

Frage dich: "WĂĽrde ein Senior Engineer sagen, dass das ĂĽberkompliziert ist?" Wenn ja, vereinfachen.

1.3 Surgical Changes​

Nur das anfassen, was du wirklich musst. Nur den eigenen Schaden aufräumen.

Beim Bearbeiten bestehenden Codes:

  • Benachbarten Code, Kommentare oder Formatierung nicht "verbessern".
  • Nichts refactoren, was nicht kaputt ist.
  • Den vorhandenen Stil matchen, auch wenn du es anders lösen wĂĽrdest.
  • Wenn dir toter Code auffällt, erwähne ihn - aber lösche ihn nicht.

Wenn deine Änderungen Orphans erzeugen:

  • Imports/Variablen/Funktionen entfernen, die durch deine Ă„nderungen ungenutzt wurden.
  • Bereits vorher vorhandenen toten Code nicht ohne Auftrag löschen.

Der Test: Jede geänderte Zeile muss sich direkt auf die Nutzeranforderung zurückführen lassen.

1.4 Goal-Driven Execution​

Erfolgskriterien definieren. In Schleifen arbeiten, bis verifiziert ist, dass es funktioniert.

Aufgaben in ĂĽberprĂĽfbare Ziele verwandeln:

  • "Add validation" → "Write tests for invalid inputs, then make them pass"
  • "Fix the bug" → "Write a test that reproduces it, then make it pass"
  • "Refactor X" → "Ensure tests pass before and after"

FĂĽr mehrstufige Aufgaben eine kurze Planung formulieren:

1. [Step] → verify: [check]
2. [Step] → verify: [check]
3. [Step] → verify: [check]

Starke Erfolgskriterien erlauben eigenständige Schleifen. Schwache Kriterien wie "make it work" erzeugen ständigen Klärungsbedarf.

2. Naming Conventions​

BSH nutzt je nach Kontext gemischte Benennungsschemata. Folge diesen Mustern:

KontextKonventionBeispiel
PHP Controller / KlassenPascalCaseCustomerController, OrderService
PHP/JS VariablencamelCase$customerName, let orderTotal
Funktionsparameter, DB-nahe Variablensnake_case$from_attr, $to_attr
Datenbanktabellensnake_case mit Präfixenlu_gender, admin_users
Datenbankspaltentyppräfixiertes snake_casestr_name, dtm_created, bol_active
React/Vue-KomponentenPascalCaseCustomerList, OrderForm
Blade Views / Partialskebab-casecustomer-list.blade.php
CSS-Klassenkebab-caseorder-summary, nav-item

Im Zweifel gilt: Controller und Klassen bekommen PascalCase, Variablen camelCase und alles mit Datenbankbezug snake_case.

3. Git-Konventionen​

Branching​

Branch-Namen folgen dem Muster: user/stack/part

git checkout -b juri/laravel/customer-sync
git checkout -b anna/react/order-dashboard
git checkout -b max/shopware/product-import
  • user - dein Name oder ein kurzes KĂĽrzel
  • stack - der Technologie-Bereich (laravel, react, shopware, database usw.)
  • part - eine kurze Beschreibung, woran gearbeitet wird

Commit Messages​

Jede Commit Message startet mit einem Präfix, das die Art der Änderung beschreibt:

PräfixVerwenden für
FIX:Bugfixes
TASK:Neue Features, Verbesserungen, allgemeine Arbeit
DOCS:Dokumentationsänderungen

Beispiele:

FIX: resolve customer sync timeout on large datasets
TASK: add order export endpoint for Dental.Shop
DOCS: update database naming conventions

Commit Messages kurz halten, aber so beschreibend, dass im Git-Log klar ist, was geändert wurde und warum.

4. Datenbank-Konventionen​

Diese Konventionen gelten sowohl fĂĽr PostgreSQL- als auch fĂĽr MySQL-Projekte.

Tabellen-Präfixe​

Präfix/SuffixZweckBeispiel
admin_Administrative Funktionenadmin_settings
lu_Lookup-/Referenzdatenlu_gender, lu_country
_join SuffixMany-to-many-Beziehungencustomer_product_join
bs_Legacy-Mitarbeiterdaten (deprecated)bs_employees

Föderierte Quellen behalten ihre eigenen Präfixe: bj_ (Bluejects), ds_ (Dental.Shop), wds_ (WDS-App), done_ (Done), qmds_ (QM-Bausteine).

Spalten-Typ-Präfixe​

Spalten immer mit ihrem Datentyp präfixieren:

PräfixTypBeispiel
str_varchar/textstr_first_name
dtm_date/timedtm_appointment
_at SuffixTimestampscreated_at, updated_at
json_JSON-Felderjson_config
bin_Binarybin_document
int_Integerint_quantity
dec_Decimaldec_price
bol_Booleanbol_active
idPrimary Keyid
_id SuffixForeign Keycustomer_id

Index-Namen​

  • Standard: {table}_{column}_index
  • Foreign Key: {table}_{column}_foreign
  • Unique: {table}_{columns}_unique
  • Full-text: {table}_{column}_fulltext

Datenbank-Objekte​

ObjektPräfixBeispiel
Proceduresprc_prc_sync_customers
Functionsfnc_fnc_calculate_total
Eventsevent_event_daily_cleanup
Viewsview_view_active_orders

5. Laravel / PHP​

Pragmatisch bleiben - was funktioniert, solange es einfach und schnell bleibt.

  • Eloquent fĂĽr Datenbankabfragen verwenden. Das ORM ist da, um Dinge lesbar und sicher zu machen.
  • Form Requests verwenden, wenn Validierung komplex wird. FĂĽr einfache Checks reicht Inline-Validierung.
  • Controller schlank halten. Wenn eine Methode deutlich ĂĽber ~30 Zeilen wächst, kann das Auslagern in eine Service-Klasse sinnvoll sein - aber nur, wenn es die Lesbarkeit tatsächlich verbessert.
  • Erst Laravels eingebaute Features nutzen (Collections, Helpers, Middleware), bevor eigene Lösungen gebaut werden.
  • PSR-12 als PHP-Code-Style einhalten.

Blade & Livewire​

  • Blade-Templates sauber und lesbar halten. Wiederholtes Markup in Komponenten oder Partials auslagern.
  • Livewire fĂĽr interaktive UI-Elemente nutzen, die kein vollständiges SPA brauchen. Das hält die Dinge im Laravel-Ă–kosystem und vermeidet unnötige JavaScript-Komplexität.
  • Blade Views und Partials in kebab-case benennen: customer-list.blade.php, order-form.blade.php.
  • Livewire-Komponenten auf eine Interaktion fokussieren. Wenn eine Komponente zu viele Dinge macht, aufteilen.

6. Frontend​

React (Default für TypeScript-Projekte, Docusaurus)​

  • Funktionale Komponenten mit Hooks verwenden.
  • Komponenten fokussiert halten - eine klare Verantwortung pro Komponente.
  • Verwandte Dateien (Komponente, Styles, Types) zusammenhalten, wenn es sinnvoll ist.

Vue (Shopware-Projekte)​

  • Den Shopware-Konventionen und Komponentenmustern folgen.
  • FĂĽr neue Komponenten die Composition API nutzen.
  • Die Shopware-Plugin-Architektur respektieren - nicht gegen das Framework arbeiten.

Allgemeines Frontend​

  • Komponenten-Dateien kurz halten. Wenn eine Komponente deutlich ĂĽber ~150 Zeilen geht, nach sinnvollen Aufteilungen suchen.
  • Komponenten klar benennen, damit man versteht, was sie tun, ohne sie erst öffnen zu mĂĽssen.

7. Dinge, die du niemals tun darfst​

Diese Regeln existieren, weil sie bereits echte Probleme verursacht haben. Keine Ausnahmen.

  • Niemals Raw SQL Queries verwenden. Immer ORM (Eloquent) oder Query Builder nutzen. Raw SQL ist ein Sicherheitsrisiko und schwer wartbar.
  • Niemals Secrets in Code ablegen. Keine API Keys, Passwörter, Tokens oder Credentials in Source Files. DafĂĽr sind .env-Dateien und Config da.
  • Niemals Login-Daten committen. Weder im Code noch in Kommentaren oder eingecheckten Config-Dateien. Wenn du Credentials in einem Repo siehst, sofort markieren.
  • Niemals externe Ressourcen per CDN oder Remote-URL in Production laden. Alle Assets (JS, CSS, Fonts, Bilder) mĂĽssen von unseren eigenen Servern kommen. Lokal herunterladen und bĂĽndeln. Das geht um Zuverlässigkeit und Kontrolle.
  • Niemals .gitignore vernachlässigen. Sicherstellen, dass .env, vendor/, node_modules/ und Build-Artefakte nie committed werden.

8. Code-Qualitäts-Basics​

  • Toten Code entfernen. Nicht auskommentieren "fĂĽr später" - dafĂĽr gibt es Git-History.
  • Funktionen kurz und fokussiert halten. Wenn du einen Kommentar brauchst, um einen Block zu erklären, ist er oft besser als eigene Funktion mit aussagekräftigem Namen aufgehoben.
  • Aussagekräftige Variablennamen nutzen. $data, $temp, $x sind fast nie akzeptabel.
  • Fehler dort behandeln, wo es relevant ist, aber nicht aus Prinzip alles in Try-Catch-Blöcke packen.
  • Wenn du eine Datei anfasst, hinterlasse sie mindestens so sauber, wie du sie vorgefunden hast - aber starte keinen Refactoring-Ausflug in einem anderen Bereich.

9. Änderungen an bestehendem Code​

Beim Arbeiten an bestehendem BSH-Code:

  • Erst den umgebenden Code lesen. Verstehen, welche Muster bereits verwendet werden, bevor etwas geändert wird.
  • Chirurgische Ă„nderungen machen - nur das anfassen, was fĂĽr die Aufgabe nötig ist.
  • Wenn dir in der Nähe etwas Defektes oder Unsauberes auffällt, erwähne es. Nicht stillschweigend im selben Change mit reparieren.
  • Den Stil der vorhandenen Datei matchen. Wenn die Datei ein bestimmtes Muster nutzt und du ein anderes bevorzugst, gewinnt die Datei.