Winterschlaf: wie man kocht

Gute Nacht, Habr.

Dieser Artikel ist ein Versuch, die Suche nach Personen zu erleichtern, die im Ruhezustand beginnen und mit der gleichen Frage konfrontiert sind wie ich - nämlich, wie man mit diesem Tool richtig schreibt . (Dies ist besonders nützlich für Programmierer, die aus schwach getippten Sprachen nach Java kommen.) Es wird keinen Code geben, es wird Grundprinzipien für den produktiven Einsatz dieser Technologie geben. Alles, was unter dem Kürzel steht, ist meiner Meinung nach nicht die einzig mögliche Lösung für das Problem.

Also



Machen Sie sofort eine Reservierung, die meine Erfahrung mit Spring Data JPA war .

Da es sich bei Hibernate um ein Enterprise-Framework handelt, ist es schwierig, Codebeispiele zu finden, die tiefer liegen als das normale CRUD. Diese Tatsache erschwert das Verständnis, wie man in Hiber schreibt und wie sich die Entwickler des Frameworks selbst guten Code vorgestellt haben, erheblich. Daher musste ich selbst über dieses Problem nachdenken. Ich bin mir sicher, dass ich nicht alleine bin.

@


Das Erste, was Sie bemerken können, ist, dass es keine Datenbank als Abstraktion gibt. Im Ruhezustand wurde alles getan, um die vollständige Kontrolle über die Datenbank im Code zu erlangen (Sie können Entity Management googeln). Ihre Datenbank besteht aus Domänenobjekten, die die Funktion eines fast dummen Speichers erfüllen. Daher eine wichtige Regel: Verwenden Sie sie nur zur Aufbewahrung. Sie sollten nicht die Funktionen eines DTO ausführen, der Benutzereingaben akzeptiert, und sollten während der Serialisierung nicht als Anzeige dienen. Sie haben Pfoten.

Unglaublich aber wahr
Im Allgemeinen ist es überraschend, dass ich im Bildungsbereich des Internets (einschließlich Englisch) kein Beispiel für die Verwendung zusätzlicher Klassen für die Serialisierung gesehen habe, zum Beispiel in json. Wer hat jemals gesagt, dass Sie sich keine Gedanken über Anzeigeklassen machen müssen, wenn Sie einen REST-Service haben?)

Ja, und nicht für REST, Intuition legt nahe, dass in einem guten Ton dem Client nur die Daten ausgegeben werden, die er benötigt, während alle Daten bereit sind (und keine Getter für eine verzögerte Initialisierung beim Client aufrufen mussten).

@


Dies impliziert die folgende Regel - sie sollten sich nicht um das Verwendungsformat kümmern. Unabhängig davon, ob wir eine Produktliste (nur Name und Beschreibung) oder eine Produktseite (mit Fotos und Bewertungen) SimpleProductViewer (id, name, description) - der Kunde erhält in einem Fall eine List von SimpleProductViewer (id, name, description) und im anderen ExtendedProductViewer (id, name, description, List(photos), List(reviews), rating) , die in den Methoden der ProductService Klasse ProductService und die Domänenklassen nur als Datenquelle verwenden.

Gleiches gilt für die Eingabe. Dies ist Java, hier ist es in Ordnung, DTO mit verschiedenen Feldern für jeden Fall durchzuführen :)

Als Beispiel werde ich die Klassenbasis für die abgedroschene Produktdomäne erhöhen. Was wir schon haben:

  1. Produkt (Domäne)
  2. Viewer (Klassen für die Client-Anzeige von Informationen, können eine beliebige Anzahl sein)
  3. Dto (Klassen zum Abrufen von Informationen können auch eine beliebige Anzahl sein)
  4. Repository (zum Empfangen von Daten)
  5. Service (oder Manager) - eine Blackbox für unkontrollierte Geschäftslogik, die alle vorherigen Punkte kombiniert.

@


Mir scheint, dass Java Enterprise nicht sehr optimiert ist (dies lässt sich bereits auf Anforderung des Ruhezustands und der Tatsache, dass OOP (Ruhezustand) die Obergrenze für die Verwaltung von Datenbankentitäten übernommen hat, feststellen). Aus diesem Grund glaube ich, dass in diesem Zusammenhang vor allem die Einhaltung des Codes durch die Framework-Entwickler im Vordergrund steht und nicht die optimale Strategie.

@


Wenn Sie Ruhezustandsdomänen auf diese Weise betrachten (nur Datenspeicherung), scheint @ManyToOne ein Mechanismus zu sein, der nicht so häufig verwendet wird und nur für vollständig abhängige Tabellen gilt - Bilder, Überprüfungen, Kommentare. Im Prinzip ist das normal - meiner Meinung nach ist es nicht notwendig, ihre Wirkung auf die Kerntabellen Ihrer Datenbank auszudehnen.

Zusammenfassend


  • Verwenden Sie die Domäne nur zur Datenspeicherung. Es ist wünschenswert, dass die Klasseneigenschaften in der Zieldatenbanktabelle enthalten sind, dh, dass nichts überflüssig ist (diktiert durch die Geschäftslogik).
  • Sie müssen nicht versuchen, die Domäne zu erweitern. Erweitern Sie die Anzeigeklassen und verwenden Sie die Domänenklassen nur als Datenprovider.
  • Haben Sie keine Angst, die gleiche Art von Unterricht zu geben - Verständlichkeit und Flexibilität sind wichtiger. Das Maximum, das getan werden kann, um die Codemenge zu reduzieren, besteht darin, sie von der Domäne zu erben.
  • Jagen Sie nicht der Optimierung hinterher. Für Java-Jungs ist das nicht wichtig, obwohl es natürlich alles vom Kontext abhängt.

Irgendwie so.

Source: https://habr.com/ru/post/de484772/


All Articles