Fragen zur Software-Architektur

AndiE

Top Contributor
Die Frage ist doch, ob das Domänenmodell die Realität abbildet. Bis jetzt ist das hier entwickelte Modell erst statisch. Dein Programm muss aber dynamisch sein. Dazu habe ich diese Use-Story entwickelt. Würde die das beschreiben, was du willst? Da die Anwendungsentwicklung domaingetrieben sein soll, wird es während der Entwicklung schon eine Veränderung des Domänenmodells geben. Natürlich könntest du als Fachexperte sagen: Bei einer bestehenden Datenlage erwarte ich 3 Ergebnisse beim Abruf "Finde 'Waschbenzin'". Dann könntest du so einen Ampeltest entwickeln und den ausprogrammieren.
 

mrBrown

Super-Moderator
Mitarbeiter
Was bestimmt denn die Identität von MaterialBooking? Die Referenzen auf Material und StorageLocation einzeln oder zusammen können es nicht sein, weil es mehrere Buchungen für das selbe Material im selben Lager geben kann.
Ich hätte MaterialBooking eher als ValueObject gesehen, weil es eigentlich nicht mehr darstellt, als eine Zusammenstellung von Fachwerten. Ähnlich ist es bei MaterialStock (wobei es hier die "lokale Identität" durch die MaterialId innerhalb einer StorageLocation gibt). Müssen dafür jetzt künstliche Identitäten geschaffen werden?

Nein, künstliche Identitäten braucht man nicht zwingend. Es könnte aber Hinweis darauf sein, dass das Model noch nicht fertig ist ;)

u.U. fehlt bei Buchungen noch etwas - wie kann man denn unterschiedliche aber gleiche Buchungen in der Realität unterscheiden?

QuantityUnit ist ein ValueObject und gehört zu Material. Hier gibt es u.U. ein kleines Problem, weil die QuantityUnit für das Material festgelegt wird, aber auch für die Berechnung der Bestände an anderer Stelle benötigt wird. Designfehler?
An welchen anderen Stellen wird es denn benutzt? Und wird es dort unabhängig von dem Material genutzt?


Immutable VOs können aber auch problemlos in mehreren ARs benutzt werden - es sind ja "nur" Werte ;)


Die Frage ist doch, ob das Domänenmodell die Realität abbildet. Bis jetzt ist das hier entwickelte Modell erst statisch. Dein Programm muss aber dynamisch sein. Dazu habe ich diese Use-Story entwickelt. Würde die das beschreiben, was du willst? Da die Anwendungsentwicklung domaingetrieben sein soll, wird es während der Entwicklung schon eine Veränderung des Domänenmodells geben. Natürlich könntest du als Fachexperte sagen: Bei einer bestehenden Datenlage erwarte ich 3 Ergebnisse beim Abruf "Finde 'Waschbenzin'". Dann könntest du so einen Ampeltest entwickeln und den ausprogrammieren.
Für nichts davon muss man aber über konkrete Implementierungen nachdenken ;)

Was ist ein "Ampeltest"?
 

AndiE

Top Contributor
"ample test" habe ich gelesen als Begriff für JUnit-Tests. Zuerst habe ich als Entwickler eine Erwartung, was bei einem Test zu einem roten Ergebnis führt, weil kein Code vorhanden. Dann sorge ich dafür, dass der Test erfüllt wird, also das Ergebnis grün wird. Rot und grün wie bei einer Ampel.
 

mrBrown

Super-Moderator
Mitarbeiter
"ample test" habe ich gelesen als Begriff für JUnit-Tests. Zuerst habe ich als Entwickler eine Erwartung, was bei einem Test zu einem roten Ergebnis führt, weil kein Code vorhanden. Dann sorge ich dafür, dass der Test erfüllt wird, also das Ergebnis grün wird. Rot und grün wie bei einer Ampel.
Ahh, Test-First das meinst du, generell super, aber in diesem Fall muss halt erstmal das Modell stehen, bis man damit anfangen würde ;)
 

temi

Top Contributor
fehlt bei Buchungen noch etwas - wie kann man denn unterschiedliche aber gleiche Buchungen in der Realität unterscheiden?

Da es durchaus legitim ist, dass genau dieselbe Menge des selben Materials zweimal hintereinander ausgelagert wird, wäre der einzige Unterschied der Zeitpunkt.

An welchen anderen Stellen wird es denn benutzt? Und wird es dort unabhängig von dem Material genutzt?
Es wird von "Quantity" benutzt, um den Bestand zu berechnen. Hintergrund ist, dass es bei der Mengeneinheit (QuantityUnit) eine Angabe der Nachkommastellen gibt. Berechnungen wollte ich nicht mit Gleitkommazahlen durchführen, um Probleme damit zu vermeiden.

Hab leider jetzt keine Zeit mehr, bin auf Arbeit und die Pause ist um...
 

mrBrown

Super-Moderator
Mitarbeiter
Da es durchaus legitim ist, dass genau dieselbe Menge des selben Materials zweimal hintereinander ausgelagert wird, wäre der einzige Unterschied der Zeitpunkt.
Dann würde ich den Zeitpunkt noch dazu nehmen.
Vermutlich ist dabei aber eine künstliche ID am sinnvollsten...

Es wird von "Quantity" benutzt, um den Bestand zu berechnen. Hintergrund ist, dass es bei der Mengeneinheit (QuantityUnit) eine Angabe der Nachkommastellen gibt. Berechnungen wollte ich nicht mit Gleitkommazahlen durchführen, um Probleme damit zu vermeiden.
Warum vermeidet das denn Rechnungen mit Gleitkommazahlen?
 

mrBrown

Super-Moderator
Mitarbeiter
Rechnen mit Integer und entsprechende Interpretation der Nachkommastellen. Ist doch aber im Prinzip egal, oder? Es gibt zwei Typen "Quantity" und "QuantityUnit", die wissen wie es geht. Die Implementationsdetails sind erst mal nicht relevant.
War nur aus Interesse ;)
Da du es als Grund für die Modellierung aufführst ist es ja auch mehr als nur Implementationsdetail ;)
 

mihe7

Top Contributor
Ein kleines Statement zu meinen Fragen in https://www.java-forum.org/thema/fragen-zur-software-architektur.182299/page-9#post-1160344 wäre noch nett, wenn es eure Zeit erlaubt. :)
Oops, ja das bin ich noch schuldig :)

Gibt es eine Fausregel, wie man hier generell vorgeht?
Meinst Du bzgl. der Bildung von Aggregates? Die sind für mich Transaktionseinheiten und gewissermaßen "Wächter über Geschäftsregeln". Dazu ein Beispiel: Du hast die Regel, dass Material an einem Lagerort nur an einem Lagerplatz liegen kann. Das kann weder Material noch MaterialStock durchsetzen. Du brauchst also etwas, das den Überblick über das Lager hat - hier bietet sich StorageLocation an.

Wenn Du eine weitere Regel hast, die über mehrere StorageLocations hinweg gilt, musst Du die wieder in etwas unterbringen, das den Überblick über StorageLocations besitzt - ggf. beispielsweise in einem DomainService.

Ich hätte MaterialBooking eher als ValueObject gesehen
Das kann durchaus sein. Wenn Du Dich später nicht mehr auf eine einzelne Buchung beziehen musst (oh, Buchung 0815 war fehlerhaft), sondern MaterialBooking nur als Ereignis betrachtest, das ggf. noch nicht einmal gespeichert wird, dann handelt es sich natürlich nicht um eine Entity. Es sind auch weitere Fälle vorstellbar: z. B. könnte man MaterialBooking selbst als VO modellieren und für z. B. eine Buchungshistorie eine Entity einführen, die ihrerseits als Wert MaterialBooking bekommt.

Was besser ist? KA - das stellt sich im Verlauf noch raus; man wird beim Modell nicht zum letzten Mal den Stift angelegt haben.

Ähnlich ist es bei MaterialStock (wobei es hier die "lokale Identität" durch die MaterialId innerhalb einer StorageLocation gibt)
MaterialStock ist ganz klar eine Entity.

Nehmen wir an, Du hättest für die Lagerplätze "Bestandszettel". Wenn Du am Bestand etwas ändern willst, musst Du das im zugehörigen(!) Bestandszettel ändern. Dazu muss jeder einzelne Zettel von jedem anderen Zettel unterscheidbar sein. Bei einer Änderung brauchst Du einen ganz bestimmten Zettel und nur diesen. Bevor ich mich jetzt "verzettel", kurz: MaterialStock hat Identität -> Entity :)
 

temi

Top Contributor
Da du es als Grund für die Modellierung aufführst ist es ja auch mehr als nur Implementationsdetail
Sagen wir mal so; da ich erst mal nicht wusste, wie ich es in der Implementation lösen würde, habe ich einfach einen Datentyp daraus gemacht, um mich nicht festlegen zu müssen. Genauso wie bei der "StorageLocationId" und bei "MaterialId". Da weiß ich auch nur, dass es sie gibt, aber noch nicht wie sie aussehen wird.

Das ist doch einigermaßen korrekt?

Oops, ja das bin ich noch schuldig
Von mir gibt's keine Schuldzuweisungen ;)

könnte man MaterialBooking selbst als VO modellieren und für z. B. eine Buchungshistorie eine Entity einführen, die ihrerseits als Wert MaterialBooking bekommt.
Das erscheint mir am natürlichsten. Das MaterialBooking ist ein immutabler Wert und eine Fehlbuchung würde sowieso nur durch eine "Gegenbuchung" geändert werden können. Die Historie könnte dagegen schon wichtig sein. Lassen wir es mal so stehen. Das gefällt mir!
MaterialStock ist ganz klar eine Entity.
Da bin ich mit dir einer Meinung. Mich hat halt die fehlende Identität gestört. Ist es denn legitim, wenn die Identität nur innerhalb eines Aggregates gegeben ist (hier StorageLocation) und nicht in der gesamten Domäne?

Kurz weitergedacht hat MaterialStock natürlich eine Identität, die sich aus "MaterialId" und "StorageLocationId" zusammensetzt.
 

mrBrown

Super-Moderator
Mitarbeiter
Das ist doch einigermaßen korrekt?
Ja, sinnvoll ist es schon, dass beides explizit zu modellieren ;)

Da bin ich mit dir einer Meinung. Mich hat halt die fehlende Identität gestört. Ist es denn legitim, wenn die Identität nur innerhalb eines Aggregates gegeben ist (hier StorageLocation) und nicht in der gesamten Domäne?

Kurz weitergedacht hat MaterialStock natürlich eine Identität, die sich aus "MaterialId" und "StorageLocationId" zusammensetzt.
Nur Aggregate-Roots müssen eine "globale" Identität haben, für alle reicht innerhalb des Aggregate-Roots eindeutig ;)

Die Zusammengesetzte ID würde bedeuten, dass ein Material nur maximal einmal an jeder Storage-Location liegen darf. War nicht auch mehrmals pro Storage-Location möglich?
 

temi

Top Contributor

temi

Top Contributor
An dieser Stelle würde ich das Domänenmodell mal abschließen. Die Vorgehensweise ist mir jetzt einigermaßen klar.

Die Aggregate, Entities und VOs sind identifiziert und müssen jetzt definiert werden.

Das ist "normale" Klassendefinition, oder? Mit öffentlichen Methoden, die die Geschäftsvorfälle abbilden?
 

mrBrown

Super-Moderator
Mitarbeiter
Das passt schon so. Bestand wird auf Lagerortebene verwaltet nicht auf Lagerplatzebene.
Also hat MaterialStock mittlerweile keine "storageBin(Info)" mehr, die sollte dich einen Lagerplatz innerhalb des Lagerortes angeben?
Kann sein, dass ich da irgendwas auf den letzten Seiten falsch verstanden hab...

Danke für die Klärung!
Es muss dann nur sichergestellt sein, dass eine Entität nicht allein außerhalb eines Aggregates verwendet wird, sondern nur mit diesem zusammen.
"global" hat es dann "quasi" eine zusammengesetzte ID aus Aggregat-Root-ID und Entity-ID
 

mrBrown

Super-Moderator
Mitarbeiter
Doch, die hat es weiterhin, aber sie ist nur ein Hinweis, wo das Material am Lagerort genau zu finden ist.
Hm, vielleicht sehe ich da Probleme, die gar nicht auftreten: aber angenommen das Material ist bisher an Lagerort "A" mit storageBinInfo "unten Rechts" gelagert, kann ich das gleiche Material auch weiterhin nur "unten Rechts" lagern, und nicht irgendwann noch "oben Links".

Würde dass dein ein Ändern des MaterialStocks ("unten Rechts" -> "unten Rechts und oben Links") bedeuten oder ist sowas eh nicht nötig?
 
Zuletzt bearbeitet:

temi

Top Contributor
Würde dass dein ein Ändern des MaterialStocks ("unten Rechts" -> "unten Rechts und oben Links") bedeuten oder ist sowas eh nicht nötig?
Das passiert definitiv und führt dazu, dass der Infotext im MaterialStock geändert werden muss. Dann liegt das Material ab diesen Zeitpunkt aber auch nicht mehr "unten rechts" sondern "oben links".
 

mrBrown

Super-Moderator
Mitarbeiter
Das passiert definitiv und führt dazu, dass der Infotext im MaterialStock geändert werden muss. Dann liegt das Material ab diesen Zeitpunkt aber auch nicht mehr "unten rechts" sondern "oben links".
Naja, das Material kann ja weiterhin "unten rechts" liegen, nur "oben links" liegt jetzt zusätzlich etwas :p

Aber ja, dann reicht die MaterialID als ID für MaterialStock innerhalb von StorageLocation.
 

temi

Top Contributor
Naja, das Material kann ja weiterhin "unten rechts" liegen, nur "oben links" liegt jetzt zusätzlich etwas
Dann hat derjenige, der es umgelagert hat, etwas falsch gemacht, denn so sollte es nicht sein. Tatsächlich machen wir gerade genau das. Wir sortieren Material neu und lagern es innerhalb eines Lagerortes, aber auch von einem Lagerort zu einem anderen Lagerort um. Ich nehme dann das Material und trage es an eine andere Stelle. Anschließend lasse ich den Lagerplatz (oder ggf. auch Lagerort) anpassen.
 

temi

Top Contributor
Der Domainlayer könnte dann ungefähr folgendermaßen aussehen:
domlayer.png
Wobei ein domain service Vorfälle übernimmt, die ein einzelnes Aggregat nicht allein abdecken kann. Richtig?
 

mrBrown

Super-Moderator
Mitarbeiter
Dann hat derjenige, der es umgelagert hat, etwas falsch gemacht, denn so sollte es nicht sein. Tatsächlich machen wir gerade genau das. Wir sortieren Material neu und lagern es innerhalb eines Lagerortes, aber auch von einem Lagerort zu einem anderen Lagerort um. Ich nehme dann das Material und trage es an eine andere Stelle. Anschließend lasse ich den Lagerplatz (oder ggf. auch Lagerort) anpassen.
Ah, danke für die Aufklärung :)
Kenne das bisher eher Gegenteilig, weg von "alles an einem Ort" hin zu "alles einfach irgendwo hin, wo grad platz ist".


Wobei ein domain service Vorfälle übernimmt, die ein einzelnes Aggregat nicht allein abdecken kann. Richtig?
Ja, genau.
 

temi

Top Contributor
Damit sind wir fast wieder an den Ausgangsfragen angekommen :) Was mich übrigens sehr freut!

Die UI (fxml, css, controller) interagiert mit den application services (möglicherweise (oder immer?) über UI-spezifische DTOs).

Die application services interagieren mit allen Beteiligten im domain layer (???) und mappen domain objects auf DTOs.

layers.png


aber auch von einem Lagerort zu einem anderen Lagerort

Da fällt mir doch gerade auf, dass dieser Fall von MaterialBooking nicht abgedeckt wird...:rolleyes:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
Zrebna Fragen zu Testabdeckungs-Metriken Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
K BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren) Allgemeine Java-Themen 141
V Ich hätte 2 Fragen Allgemeine Java-Themen 5
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
H Fragen zur Kraken Api Allgemeine Java-Themen 1
nonickatall Klassen Grundsätzliche Fragen zu geplanter Programmstruktur Allgemeine Java-Themen 5
W Ein paar Fragen zu .properties und .css Allgemeine Java-Themen 6
W Mal ein paar generelle Fragen zu InputStream und OutputStream Allgemeine Java-Themen 4
X Fragen zur Javamail API und Gmail Allgemeine Java-Themen 4
T Fragen bezgl. Lambdas Allgemeine Java-Themen 20
X Collections Fragen zu gleichen Elementen in TreeSet Allgemeine Java-Themen 35
A Neuerungen in Java 8 StreamAPI- Paar fragen Allgemeine Java-Themen 4
M Diverse Design-Fragen Allgemeine Java-Themen 6
J 2 Fragen zur Vererbung Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
M Fragen beantworten über Textfeldeingabe Allgemeine Java-Themen 5
D Grundsätzliche Fragen zum Heap Space Allgemeine Java-Themen 12
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
M Allgemeine Fragen meinerseits Allgemeine Java-Themen 4
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
R Es gibt keine dummen Fragen (hab ich mal gehört) Allgemeine Java-Themen 11
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
2 2 Klein Fragen Allgemeine Java-Themen 7
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
A Java Theorie-Fragen Allgemeine Java-Themen 7
K Java QUIZ-Spiel Fragen und Antworten generieren?! Allgemeine Java-Themen 5
R Socket Fragen zu UDP Allgemeine Java-Themen 1
B Noob-Fragen zu Tablets und PC kompatiblität... Allgemeine Java-Themen 6
D Ein paar allgemeine Fragen zu Java Allgemeine Java-Themen 19
L Fragen für Facharbeit: Analyse von Strings in Java Allgemeine Java-Themen 4
R Fragen zu Server + UI Allgemeine Java-Themen 2
U Vier Fragen zu Java Allgemeine Java-Themen 2
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
D Fragen zum erstellen einer ausführbaren Jar Datei Allgemeine Java-Themen 3
C Polymorphie Fragen zur Annotations von Persistenz Allgemeine Java-Themen 2
O Fragen über Fragen - Bei Änderung XML-Datei -> Anpassung GUI Allgemeine Java-Themen 7
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
Luk10 Fragen zum ByteBuffer (lwjgl - icons) Allgemeine Java-Themen 2
F Akkumulator Hough-Transformation offene Fragen Allgemeine Java-Themen 4
Luk10 Fragen zu Naming-Conventions Allgemeine Java-Themen 5
Z Einige Fragen Allgemeine Java-Themen 10
T OOP Einige Fragen zu UML-Klassendiagrammen Allgemeine Java-Themen 6
G Einige Fragen zu ResourceBundles Allgemeine Java-Themen 2
S Fragen zu verschiedenen Themen vom JCreator Allgemeine Java-Themen 2
DStrohma Grundsätzliche Fragen zum Aufbau eines komplexeren Programmes Allgemeine Java-Themen 8
Semox Grapheneditor - Allgemeine Fragen zum Logikdesign Allgemeine Java-Themen 3
O kleine Fragen eines Anfängers Allgemeine Java-Themen 2
X Executor fragen ob fertig Allgemeine Java-Themen 13
nrg Swing 2 Fragen zu Swing/AWT Allgemeine Java-Themen 7
K Reflections Fragen Allgemeine Java-Themen 7
S Fragen zum SCJD-Zertifikat Allgemeine Java-Themen 2
M Backend Entwicklung - Konzept fragen Allgemeine Java-Themen 3
E Fragen zu Scala Allgemeine Java-Themen 11
Daniel_L Fragen zu RegEx und URL umwandeln Allgemeine Java-Themen 4
J Diverse Fragen bezüglich Jasper Allgemeine Java-Themen 3
S Fragen zum ShutdownHook Allgemeine Java-Themen 7
V Fragen zu einem Java Browser Allgemeine Java-Themen 7
G Fragen zum eigenen Scheduler Allgemeine Java-Themen 4
M Drag and Drop: 3 Fragen Allgemeine Java-Themen 3
L Einige Fragen zu Java Allgemeine Java-Themen 9
F Linguistische Fragen zu Javadoc bzw. Englisch Allgemeine Java-Themen 4
E Einfache Fragen zu Dateien Allgemeine Java-Themen 7
E Thread Fragen in Verbindung mit Swing Allgemeine Java-Themen 4
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
X Einige Fragen zu Serialisierung Allgemeine Java-Themen 2
H Java Multiplicoice Test (10 Fragen) Allgemeine Java-Themen 11
J Viele Fragen. =) Hoffentlich könnt ihr helfen Allgemeine Java-Themen 9
D Grundsätzliche Fragen zur Grafikdarstellung in Spielen Allgemeine Java-Themen 2
J 2 Fragen zu JMF und eine Rechtsfrage Allgemeine Java-Themen 3
S Viele Fragen eines Umsteigers (von .NET) Allgemeine Java-Themen 6
C LinkedList Fragen Allgemeine Java-Themen 7
P Fragen zur JBuilder und den kosten. Allgemeine Java-Themen 7
reibi JVM fragen welche Apps geladen sind Allgemeine Java-Themen 7
I Fragen zum Internetseiten Einlesen/Auswerten Allgemeine Java-Themen 5
S 2 Fragen allgemeine fragen zu final und interface Allgemeine Java-Themen 13
M ein paar fragen über JBoss und Catalina Allgemeine Java-Themen 7
D Allgemeine Fragen zum Speichern Allgemeine Java-Themen 3
F allgemeine Fragen zu Java Allgemeine Java-Themen 9
S Fragen zu 4 speziellen Listen Allgemeine Java-Themen 4
U JFrame, JOptionPane - vor dem Schließen Benutzer fragen Allgemeine Java-Themen 10
I zwei simple fragen Allgemeine Java-Themen 22
G 2 Fragen Allgemeine Java-Themen 7
G Fragen zu ausführbaren JAR Files Allgemeine Java-Themen 23
G Fragen zu JTextField bzw. JTextArea Allgemeine Java-Themen 2
J 5 Fragen. Allgemeine Java-Themen 2
P Tausend Fragen... Allgemeine Java-Themen 3
Zrebna Zuverlässiges Automatisiertes Testen im eigenem Software-Unternehmen aufsetzen - How to? Allgemeine Java-Themen 12
I In Java geschriebene Software nach Mac OS portieren Allgemeine Java-Themen 7
OnDemand Software Zertifizierung Allgemeine Java-Themen 4
Zrebna Wieviele Testfälle muss man hier schreiben? (Software Engineering) Allgemeine Java-Themen 13
Kirby.exe Software Entwicklung Allgemeine Java-Themen 9
Kirby.exe Software für Graphische Visualisierung Allgemeine Java-Themen 20
B Multiuser Software Allgemeine Java-Themen 3
L Nach dem Login // Java Desktop Software Allgemeine Java-Themen 7
W Software-Lizenzen Allgemeine Java-Themen 13

Ähnliche Java Themen


Oben