Wie kann man verschiedene Teile einer Softwareanwendung sauber trennen?

9

Ich entwerfe eine neue Anwendung, die sich mit viel Geschäftslogik befasst.

Um die übliche Verstrickung zwischen verschiedenen Anwendungsebenen zu vermeiden, die sich im Laufe der Zeit häufig in solche Systeme einschleicht, möchte ich von Anfang an eine saubere Trennung von Bedenken implementieren. Im Großen und Ganzen möchte ich trennen:

  • Präsentationsfolie
  • Geschäftslogikschicht
  • Datenspeicherungs- und Persistenzschicht

Die Frage, mit der ich am meisten zu kämpfen habe, ist, wie das Verhalten an den Rändern tatsächlich sauber implementiert werden kann, insbesondere zwischen dem Unternehmen und der Datenschicht. Ich habe zu viele Anwendungen gesehen, bei denen die Datenschicht ORM-Objekte an die Kernschicht übergibt und die Geschäftslogik effektiv eng mit dem ORM verknüpft.

Sollte ich ORM-Objekte in ein serialisiertes Format (JSON?) Konvertieren und dieses dann in der Geschäftsschicht in eine Datenstruktur innerhalb dieser Schicht deserialisieren? Ist das nicht viel Aufwand?

Wie implementieren Sie die Trennung von Bedenken für mittelgroße Anwendungen sauber? Irgendein Rat?

BM
quelle
3
Was sind ORM-Objekte? Ein ORM ordnet Daten normalerweise Domänenobjekten zu, die nicht eng mit der Datenzugriffsschicht verbunden sind. Daher sollte es kein Problem geben, diese an die Geschäftsschicht weiterzuleiten. Natürlich sollte die ORM-Infrastruktur selbst nicht an die Geschäftsschicht übergeben werden.
JacquesB
Ich sehe eine Menge ORMs Auto-Generierung Klassen, die das Datenbankschema Karte 1: 1, zB article.getId(), article.getTimestamp()usw. Diese Zuordnungen scheinen häufiger als nicht spezifisch für die ORM sein verwendet.
BM
Sie sollten wahrscheinlich ORM wechseln. Welches ORM verwenden Sie?
JacquesB
Ich habe mich noch nicht für ein ORM für dieses Projekt entschieden, aber ich habe mit einigen gearbeitet: SQLAlchemy, SQLObject, Django ORM, Propel, ...
BM
1
Detaillierte Vorschläge dazu finden Sie in Onkel Bobs Beschreibung einer sauberen Architektur . Die Absätze "Grenzen überschreiten" und "Welche Daten überschreiten die Grenzen" befassen sich genau mit Ihrem Problem.
Doc Brown

Antworten:

5

Es gibt immer eine logische Kopplung zwischen Geschäftslogik und Datenbank. Ihre Bemühungen sollten sich darauf konzentrieren, eine physikalische Kopplung zu verhindern.

Nehmen Sie zum Beispiel die grundlegende Geschäftsregel, dass jeder Benutzer eine eindeutige Benutzer-ID haben muss. Sie können versuchen, diese Regel in der Geschäftsschicht durchzusetzen, aber es wird immer ein Szenario geben, in dem mehrere Benutzer gleichzeitig dieselbe Benutzer-ID versuchen können, und der einzige Ort, an dem Sie die Eindeutigkeit überprüfen und eine Benutzer-ID in einem reservieren können atomarer Weg ist in der Datenbank.

Jetzt sollte die Geschäftsschicht nicht mehr den Namen der Tabelle oder der Spalte kennen müssen oder sogar, dass Benutzer in einer Datenbank gespeichert sind (sie könnten beispielsweise stattdessen in Active Directory für eine Intranetanwendung gespeichert werden). Das sollte nur die Datenzugriffsschicht wissen. Aber eine Menge Aufwand zu betreiben, um das Schema von den Geschäftsregeln zu trennen, ist wahrscheinlich verschwendeter Aufwand.

John Wu
quelle
Guids gibt es schon eine Weile
Ewan
4

Stellen Sie sicher, dass sich Ihre Geschäftsmodellobjekte in ihrer eigenen Bibliothek befinden, die keine ORM- oder Datenbankclients referenziert.

Verwenden Sie das Repository-Muster und verweisen Sie nur auf Schnittstellen zu den Repositorys in Ihrem Hauptcode.

Verfügen Sie über eine vollständig separate konkrete Repository-Bibliothek, die für die Datenschicht spezifisch ist und auf die Schnittstellenbibliothek, die Geschäftsmodellbibliothek und den Datenbankclient verweist.

Ewan
quelle