Das folgende Beispiel ist völlig künstlich und hat nur den Zweck, meinen Standpunkt zu verdeutlichen.
Angenommen, ich habe eine SQL-Tabelle:
CREATE TABLE rectangles (
width int,
height int
);
Domain-Klasse:
public class Rectangle {
private int width;
private int height;
/* My business logic */
public int area() {
return width * height;
}
}
Angenommen, ich möchte dem Benutzer die Gesamtfläche aller Rechtecke in der Datenbank anzeigen. Ich kann das tun, indem ich alle Zeilen der Tabelle abrufe, sie in Objekte verwandle und über sie iteriere. Aber das sieht einfach blöd aus, weil ich sehr viele Rechtecke in meinem Tisch habe.
Also mache ich das:
SELECT sum(r.width * r.height)
FROM rectangles r
Dies ist einfach, schnell und nutzt die Stärken der Datenbank. Es wird jedoch eine doppelte Logik eingeführt, da ich die gleiche Berechnung auch in meiner Domänenklasse habe.
In diesem Beispiel ist die Vervielfältigung der Logik natürlich überhaupt nicht fatal. Ich habe jedoch das gleiche Problem mit meinen anderen Domänenklassen, die komplexer sind.
quelle
Antworten:
Wie lxrec hervorhob, wird es von Codebasis zu Codebasis variieren. In einigen Anwendungen können Sie diese Art von Geschäftslogik in SQL-Funktionen und / oder Abfragen einfügen und sie ausführen, wann immer Sie diese Werte dem Benutzer anzeigen müssen.
Manchmal mag es dumm erscheinen, aber es ist besser, auf Korrektheit zu programmieren als Leistung als primäres Ziel.
Wenn Sie in Ihrem Beispiel den Wert des Bereichs für einen Benutzer in einem Webformular anzeigen, müssen Sie:
Es ist dumm für einfache Dinge wie die in der Stichprobe, aber es kann notwendig sein, komplexere Dinge wie die Berechnung des IRR einer Investition eines Kunden in ein Bankensystem.
Code für die Richtigkeit . Wenn Ihre Software korrekt, aber langsam ist, haben Sie die Möglichkeit, zu optimieren, wo Sie es benötigen (nach der Profilerstellung). Wenn dies bedeutet, dass ein Teil der Geschäftslogik in der Datenbank verbleibt, ist es auch so. Deshalb haben wir Refactoring-Techniken.
Wenn es langsam wird oder nicht mehr reagiert, müssen Sie möglicherweise einige Optimierungen vornehmen, z. B. das DRY-Prinzip zu verletzen. Dies ist keine Sünde, wenn Sie sich auf die ordnungsgemäße Prüfung der Einheit und der Konsistenz beschränken.
quelle
Sie sagen, dass das Beispiel künstlich ist, daher weiß ich nicht, ob das, was ich hier sage, zu Ihrer tatsächlichen Situation passt, aber meine Antwort lautet: Verwenden Sie eine ORM -Ebene (Object-Relational Mapping), um die Struktur und Abfrage / Manipulation von zu definieren Ihre Datenbank. Auf diese Weise haben Sie keine doppelte Logik, da alles in den Modellen definiert wird.
Wenn Sie beispielsweise das Django- Framework (Python) verwenden, definieren Sie Ihre Rechteckdomänenklasse als das folgende Modell :
So berechnen Sie die Gesamtfläche (ohne Filterung):
Wie bereits erwähnt, sollten Sie zunächst auf Korrektheit codieren und erst optimieren, wenn Sie wirklich einen Engpass feststellen. Wenn Sie also zu einem späteren Zeitpunkt entscheiden, dass Sie unbedingt optimieren müssen, können Sie zur Definition einer unformatierten Abfrage übergehen, z.
quelle
Ich habe ein albernes Beispiel geschrieben, um eine Idee zu erklären:
Also, wenn Sie eine Logik haben:
Sie können es in Domänenklassen wiederverwenden:
Oder in Ihrer SQL-Generierungsschicht:
Und natürlich können Sie es leicht ändern. Versuche dies:
quelle
Wie @Machado sagte, ist der einfachste Weg, dies zu vermeiden und die gesamte Verarbeitung in Ihrem Haupt-Java durchzuführen. Es ist jedoch weiterhin möglich, die Codebasis mit ähnlichem Code zu codieren, ohne dass Sie sich selbst wiederholen müssen, indem Sie den Code für beide Codebasis generieren.
Verwenden Sie beispielsweise cog enable, um die drei Ausschnitte aus einer gemeinsamen Definition zu generieren
Snippet 1:
Snippet 2:
Snippet 3:
aus einer Referenzdatei
quelle