LiDo - Anwendungscode gut strukturieren.

LiDo - Anwendungscode gut strukturieren

Lido: Eine leichtgewichtige Alternative zu DDD

Wenn es um die Strukturierung einer Anwendung geht, wird Domain-Driven Design (DDD) oft als der Goldstandard gepriesen. Allerdings kann DDD für einfachere Anwendungen manchmal zu starr und komplex sein. Dieser Blogbeitrag stellt eine unkomplizierte und leichtgewichtige Alternative vor, die Ihnen hilft, eine saubere und organisierte Codebasis zu pflegen, ohne den Overhead eines vollständigen DDD: LiDo - LightDomain.

Paketstruktur

Eine gut strukturierte Pakethierarchie ist entscheidend für die Wahrung von Klarheit und einfacher Navigation in Ihrer Codebasis. Hier ist ein einfacher Ansatz:

  1. Domänenbasierte Pakete: Erstellen Sie separate Pakete für jede Domäne. Dies stellt sicher, dass alle zugehörigen Komponenten (Controller, Services, Repositories und POJOs/DTOs) zusammen gruppiert sind, was das Verständnis und die Verwaltung erleichtert.

  2. Domänen nicht mischen: Mischen Sie niemals verschiedene Domänen innerhalb desselben Pakets. Das kann zu Verwirrung führen und die Codebasis schwerer navigierbar machen.

Beispiel-Paketstruktur

myapp
├── user
│   ├── UserController
│   ├── UserService
│   ├── UserRepository
│   ├── UserDb
│   └── UserDto
├── product
│   ├── ProductController
│   ├── ProductService
│   ├── ProductRepository
│   ├── ProductDb
│   └── ProductDto
└── order
    ├── OrderController
    ├── OrderService
    ├── OrderRepository
    ├── OrderDb
    └── OrderDto

Dateiverantwortlichkeiten

Controller

Controller sind verantwortlich für die Verarbeitung eingehender HTTP-Anfragen und deren Zuordnung zu den entsprechenden Services. Sie übernehmen auch Sicherheitsprüfungen, Request-Validierung und Fehlerbehandlung.

  • HTTP-Anfragen zuordnen: Eingehende HTTP-Anfragen auf Service-Aufrufe abbilden.
  • Sicherheitsprüfungen: Sicherstellen, dass der Benutzer Zugriff auf den Endpunkt hat.
  • Request-Validierung: Eingehende Anfragen validieren, um sicherzustellen, dass sie die erforderlichen Kriterien erfüllen.
  • Service-Aufrufe: Die eigentliche Arbeit an die Services delegieren.
  • Fehlerbehandlung: Service-Fehler in saubere HTTP-Fehlerantworten umwandeln.

Services

Services fungieren als Vermittler zwischen der HTTP-Schicht und der Datenbank. Sie führen die eigentliche Geschäftslogik aus und konvertieren oft zwischen DTOs wie OrderDto (verwendet in der HTTP-Schicht) und Datenbankentitäten wie OrderDb.

  • Geschäftslogik: Die eigentliche Arbeit mit den Daten ausführen, oft unter Kombination mehrerer Repositories.
  • DTO-zu-Entity-Konvertierung: Zwischen HTTP-DTOs und Datenbankentitäten konvertieren.

Repositories

Repositories übernehmen den reinen Datenbankzugriff. Die Verwendung von reinem SQL mit minimalem Overhead ist langfristig oft besser als die Abhängigkeit von komplexen ORM-Frameworks wie JPA.

  • Datenbankzugriff: CRUD-Operationen auf der Datenbank ausführen.
  • Reines SQL: Reine SQL-Abfragen für die Interaktion mit der Datenbank verwenden, um Overhead und Boilerplate-Code zu minimieren.

Datenbankentitäten

Datenbankentitäten repräsentieren Zeilen in der Datenbank und werden vom Repository erstellt.

  • Repräsentation: Repräsentieren eine Datenbankzeile.

DTO-Entitäten

DTO-Entitäten repräsentieren die über HTTP übertragenen Daten und werden vom Controller erstellt.

  • Repräsentation: Repräsentieren Daten, die in der HTTP-Schicht empfangen oder gesendet werden.

Über das Testen

Testen ist entscheidend für die Aufrechterhaltung einer zuverlässigen Anwendung. Hier sind einige Best Practices:

  • End-to-End-Tests: Verwenden Sie Testcontainers für End-to-End-Tests. Container wiederverwenden für schnellere Tests.
  • Controller-Tests: Während vollständiges End-to-End-Testing großartig ist, ist es manchmal auch schön, einfach zu verifizieren, dass die Entity-Konvertierung von HTTP zu DTOs funktioniert und dass z.B. die Sicherheit korrekt validiert wird. Dafür können die Controller getestet und der Rest (Services und darunter) gemockt werden.
  • Service-Tests: Services mit einem echten Repository unter Verwendung eines Testcontainers testen.
  • Schicht-für-Schicht-Tests: Bei Bedarf jede Schicht (Controller, Service, Repository) separat testen.

Fazit

Dieser leichtgewichtige Ansatz zur Strukturierung Ihrer Anwendung bietet ein Gleichgewicht zwischen Einfachheit und Organisation. Durch die Verwendung domänenbasierter Pakete und die klare Definition der Verantwortlichkeiten jedes Dateityps können Sie eine saubere und verständliche Codebasis pflegen.

LiDo ist eine perfekte Wahl für jedes moderne Web-Framework wie Express, Spring Boot und viele mehr.

Passen Sie diese Struktur gerne an Ihre spezifischen Bedürfnisse und Projektanforderungen an. Viel Spaß beim Programmieren!

Related posts