Fragen zur Software-Architektur

temi

Top Contributor
Hallo zusammen,

ich habe einige Fragen zur Softwarearchitektur bei denen ich mir trotz viel Recherche nicht sicher bin, ob ich das richtig handhaben möchte.

Es geht um eine Lagerverwaltung, d.h. es sollen Artikel die in unterschiedlichen Lagern liegen gesucht und ein-/ausgebucht werden können.


Damit es jetzt nicht zu umfangreich wird nur ein kleiner Auszug daraus und ich beginne auf der "Datenseite". Nehmen wir an es gibt die Datenbanktabellen "ItemTable" (die Artikel) und "BaseUnitTable" (die Mengeneinheit eines Artikels). Daten im ItemTable halten einen Fremdschlüssel auf die zugehörige BaseUnit. Weitere Tabellen wären z.B. StorageTable (Lager), ItemStockTable (in den Lagern gelagerte Artikel) usw.

In einem zugehörigen Domänenmodell gäbe es jetzt entsprechende Klassen (Aggregate? Entities?) "Item" und "BaseUnit", wobei ein Item ja auch eine BaseUnit hat.

Außerdem in der Datenzugriffsschicht die Repositories "ItemRepository" und "BaseUnitRepository" (wobei vom ItemRepository ebenfalls die zugehörige BaseUnit mitgeliefert wird, aber zur Stammdatenpflege von BaseUnits müssen diese auch unabhängig verfügbar sein). Viel Geschäftslogik wird es in diesen beiden Klassen nicht geben. Bei weiteren Domänenklassen, die z.B. Lagerbuchungen verwalten ist das dann spätestens der Fall.

Auf der UI-Seite haben wir sowas wie

"EditItemView.fxml" + "EditItemView.css" + "EditItemController.java"
"EditBaseUnitView.fxml" + "EditBaseUnitView.css" + "EditBaseUnitController.java"

Ist das soweit erst mal korrekt?

Die Controller benötigen ja nicht unbedingt Klassen aus dem Domänenmodell, sondern ggf. Datenobjekte mit speziell zusammengestellten Inhalten, z.B. eine Tabelle von Artikeln mit ihren Beständen in den unterschiedlichen Lagern.

Ist das so richtig, dass die UI-Schicht ihre eigenen Datenklassen für ihre Belange definiert?

Woher erhält die UI-Schicht diese Daten? Gibt es dafür noch eine zusätzliche Schicht zwischen UI und Domäne und wie wird diese im Normalfall realisiert? Oder greift die UI direkt auf Domänenobjekte zu?

Ich hoffe es findet sich jemand, der meine Fragen beantworten kann und bedanke mich schon mal dafür

Gruß,
Temi
 

temi

Top Contributor
Ich habe mal eine kleine Skizze dazu angefertigt und noch einen zusätzlichen Layer "Services" eingefügt. Demnach könnte die UI über einen (mehrere) Service z.B. "getItemListWithStorageAndStock" oder "insertNewItem" auf die darunter liegenden Daten zugreifen, die gesuchten Daten aus den Repositories anfordern und ggf. auf UI-DTOs mappen. Korrekt so?

Architecture.png
 

mrBrown

Super-Moderator
Mitarbeiter
Im wesentlichen klingt das passend.

Service kann man aber in dem Fall in zwei Service-Layer teilen: einmal Services im Domain-Layer, die dann auch Domänen-Logik enthalten, und einmal Application-Layer, welches die Logik der Applikation und auch das Mapping von Domäne<->DTO enthält, aber eben keine Domänen-Logik.

In einem zugehörigen Domänenmodell gäbe es jetzt
entsprechende Klassen (Aggregate? Entities?) "Item" und "BaseUnit", wobei ein Item ja auch eine BaseUnit hat.
Aus der knappen Beschreibung schwierig abzuleiten, aber spontan wäre Item ein Aggregate (und damit auch Entity), und BaseUnit könnte ein Value-Object sein (wenn es denn eine "Einheit" darstellt) oder eben auch eine Entität oder sogar Aggregate - hängt von der Verwendung ab ;)

Außerdem in der Datenzugriffsschicht die Repositories "ItemRepository" und "BaseUnitRepository" (wobei vom ItemRepository ebenfalls die zugehörige BaseUnit mitgeliefert wird, aber zur Stammdatenpflege von BaseUnits müssen diese auch unabhängig verfügbar sein). Viel Geschäftslogik wird es in diesen beiden Klassen nicht geben. Bei weiteren Domänenklassen, die z.B. Lagerbuchungen verwalten ist das dann spätestens der Fall.
Repositorys sollten generell keine Geschäftslogik enthalten, die gehört in Domänenobjekte und Services, sondern nur Speichern, Laden und Suchen ;)
 

temi

Top Contributor
Aus der knappen Beschreibung schwierig abzuleiten, aber spontan wäre Item ein Aggregate (und damit auch Entity), und BaseUnit könnte ein Value-Object sein (wenn es denn eine "Einheit" darstellt) oder eben auch eine Entität oder sogar Aggregate - hängt von der Verwendung ab ;)

Die beiden Datenbanktabellen würden ungefähr so aussehen:
Code:
//ItemTable
UID id
String shortName
String description
UID fkBaseUnit

//BaseUnit
UID id
String shortName // z.B. "ST"
String description // z.B. "Stück"
int decimals // Anzahl der Nachkommstellen, im Beispiel "0"
BaseUnit legt sozusagen fest, wie Ein-/Ausbuchungen verrechnet, bzw. angezeigt werden (z.B. damit man nicht nur ganze Meter ausbuchen kann), ist aber im Prinzip immutabel.

Da wäre auch gleich eine Frage, BaseUnit hat ja allein für die DB eine Identität (die id). Macht es das allein schon zum Entity? Dürfte ja eigentlich nicht so sein, weil sonst ja grundsätzlich alles was in der DB gespeichert wird ein Entity wäre.[/code]
 
Zuletzt bearbeitet:

temi

Top Contributor
Repositorys sollten generell keine Geschäftslogik enthalten, die gehört in Domänenobjekte und Services, sondern nur Speichern, Laden und Suchen ;)
Ja, war von mir falsch formuliert, bzw. im falschen Zusammenhang. Aber dafür gleich noch eine Frage: Wo "leben" denn die Domänenobjekte? Im Repository?

Ich hoffe man versteht die Frage: Die Domänenobjekte sind ja nicht einfach so da. In der Software sind sie ja auch in einer Collection gespeichert, die irgendwo enthalten ist.
 

temi

Top Contributor
Service kann man aber in dem Fall in zwei Service-Layer teilen: einmal Services im Domain-Layer, die dann auch Domänen-Logik enthalten, und einmal Application-Layer, welches die Logik der Applikation und auch das Mapping von Domäne<->DTO enthält, aber eben keine Domänen-Logik.
Könnte man dann sagen:
Der Domain-Layer enthält Domänenobjekte, Domain-Services und Repositories.
Der Application-Layer enthält DTOs, UI-Controller und UI-Services.
Der Application-Layer ist demnach zusammen mit den deklarativen Teilen (fxml, css) die eigentlich ausgeführte Applikation (und womöglich im Gesamtprojekt ein separates Unterprojekt)?

Würde man die speziell für die UI bestimmten Datenobjekte korrekt als DTO bezeichnen, oder anders?
 

mrBrown

Super-Moderator
Mitarbeiter
BaseUnit legt sozusagen fest, wie Ein-/Ausbuchungen verrechnet, bzw. angezeigt werden (z.B. damit man nicht nur ganze Meter ausbuchen kann).

Da wäre auch gleich eine Frage, BaseUnit hat ja allein für die DB eine Identität (die id). Macht es das allein schon zum Entity? Dürfte ja eigentlich nicht so sein, weil sonst ja grundsätzlich alles was in der DB gespeichert wird ein Entity wäre.
So in etwa ist es. Ergibt sich die Identität aus der ID -> Entity. (Werte können sich ändern, es ist aber das gleiche)
Ergibt sich die Identität aus den Werten -> Value-Object. (Wenn die Werte sich ändern, ist es was anderes)

Bei der Verwendung von DBs vermischt sich das leider schnell schnell. Leichter macht man das, wenn man dabei alle Spalten immutable macht.

BaseUnit dürfte ein Value-Object sein: Wenn man irgendwas ändert, ist es ja eine andere Unit.


Ja, war von mir falsch formuliert, bzw. im falschen Zusammenhang. Aber dafür gleich noch eine Frage: Wo "leben" denn die Domänenobjekte? Im Repository?
Jein, es ist eher ein Wann als ein Wo.
Stell dir ein Repo als eine Collection vor, du kannst Werte reinlegen und rausnehmen, wie bei einer Liste.
Das lebt, bevor es drin ist, das lebt, solange es drin ist, das lebt wenn du es wieder rausnimmst, das lebt, bis du es irgendwann explizit "tötest".

Könnte man dann sagen:
Der Domain-Layer enthält Domänenobjekte, Domain-Services und Repositories.
Der Application-Layer enthält DTOs, UI-Controller und UI-Services.

Würde man die speziell für die UI bestimmten Datenobjekte korrekt als DTO bezeichnen, oder anders?
Das dürfte alles so passen ;)
 

temi

Top Contributor
Jein, es ist eher ein Wann als ein Wo.
Stell dir ein Repo als eine Collection vor, du kannst Werte reinlegen und rausnehmen, wie bei einer Liste.
Das lebt, bevor es drin ist, das lebt, solange es drin ist, das lebt wenn du es wieder rausnimmst, das lebt, bis du es irgendwann explizit "tötest".
In meinen Worten: Der Benutzer fordert z.B. eine Liste von Items aus dem Repository an. Die Items werden aus der DB gelesen, im Repository (erzeugt und) gespeichert und dem Application-Layer zum Mapping, Anzeigen usw. weiter gegeben.

So ich merke gerade, jetzt wird es komplizierter, weil das Domänenmodell noch zu rudimentär ist:

Repositorys sollten generell keine Geschäftslogik enthalten, die gehört in Domänenobjekte und Services, sondern nur Speichern, Laden und Suchen

Der Benutzer nimmt eine Buchung für ein Item vor. Wie geht es jetzt weiter?

Ich versuche es mal selbst:
Der entsprechende Service holt sich die notwendigen Daten aus einem oder mehreren Repositories. Der Service ruft die entsprechenden Methoden auf den Domänenobjekten auf, um die Buchung vorzunehmen und speichert sie in die Repos zurück.
Es gälte jetzt noch eine Strategie festzulegen, wann die Daten wieder aus den Repos entfernt werden. Sofort wenn die Transaktion beendet wurde oder z.B. nach einer gewissen Zeit der Nichtbenutzung.
 
Zuletzt bearbeitet:

temi

Top Contributor
Wie können denn ungültige Units entstehen?
Ungültig ist das falsche Wort, etwas besseres fällt mir gerade nicht ein. Es geht darum dass für ein erzeugtes Item mit einer bestimmten BaseUnit immer diese BaseUnit verwendet werden muss, um die Konsistenz sicher zu stellen.
Es ist aber vorstellbar, dass eine neue BaseUnit "Meter" erstellt wird, die nun eine anstatt zwei Nachkommastellen verwendet. Für neue Items ist diese dann die "gültige" BaseUnit. Der ursprüngliche zweistellige "Meter" steht für neue Items dann nicht mehr zur Verfügung.
 

mrBrown

Super-Moderator
Mitarbeiter
In meinen Worten: Der Benutzer fordert z.B. eine Liste von Items aus dem Repository an. Die Items werden aus der DB gelesen, im Repository (erzeugt und) gespeichert und dem Application-Layer zum Mapping, Anzeigen usw. weiter gegeben.
Auf reiner Code Ebene: ja, das Repo lädt bestehende Entitäten aus der DB und gibt sie weiter.

Der Benutzer nimmt eine Buchung für ein Item vor. Wie geht es jetzt weiter?

Ich versuche es mal selbst:
Der entsprechende Service holt sich die notwendigen Daten aus einem oder mehreren Repositories. Der Service ruft die entsprechenden Methoden auf den Domänenobjekten auf, um die Buchung vorzunehmen und speichert sie in die Repos zurück.
Kommt drauf an, was eine "Buchung" ist ;)

Aber ja, generell: die Applikation bekommt die Daten von einem Repo, ruft entsprechende Methode auf, und gibt sie in an das Repo zurück.

Es gälte jetzt noch eine Strategie festzulegen, wann die Daten wieder aus den Repos entfernt werden. Sofort wenn die Transaktion beendet wurde oder z.B. nach einer gewissen Zeit der Nichtbenutzung.
Das wäre Domänen-Logik, das Repo hat da nichts mit zu tun ;)

Müssen Daten überhaupt gelöscht werden? Was wäre denn in Domänensprache ein löschen? Gibt es dort überhaupt ein "löschen"? ;)

Ungültig ist das falsche Wort, etwas besseres fällt mir gerade nicht ein. Es geht darum dass für ein erzeugtes Item mit einer bestimmten BaseUnit immer diese BaseUnit verwendet werden muss, um die Konsistenz sicher zu stellen.
Es ist aber vorstellbar, dass eine neue BaseUnit "Meter" erstellt wird, die nun eine anstatt zwei Nachkommastellen verwendet. Für neue Items ist diese dann die "gültige" BaseUnit. Der ursprüngliche zweistellige "Meter" steht für neue Items dann nicht mehr zur Verfügung.
Also gibt es unterschiedliche "Typen" von BaseUnits (Meter wäre so ein Typ), und zu einem Zeitpunkt gibt es jeweils eine aktuelle Definition des Types?
 

temi

Top Contributor
Also gibt es unterschiedliche "Typen" von BaseUnits (Meter wäre so ein Typ), und zu einem Zeitpunkt gibt es jeweils eine aktuelle Definition des Types?
Genau, im Regelfall gibt es eine Anzahl von BaseUnits, die nicht mehr verändert werden: ST (Stück, 0 Nachkommastellen), PK (Pack, 0 NK), M (Meter, 2 NK), usw. Falls eine dieser Einheiten verändert wird, würde ich die "alte" Einheit als "deprecated" markieren und für neue Items nicht mehr verwendbar.
Wenn ich noch einmal darüber nachdenke, dürfte die Auswahl an unterschiedlichen Basismengeneinheiten doch arg begrenzt sein, so dass es möglicherweise sinnvoll ist diese gar nicht in der DB vor zu halten, sondern fest zu hinterlegen als eine Art Set von BaseUnits.
 

temi

Top Contributor
Kommt drauf an, was eine "Buchung" ist

Eine Buchung ist das Hinzufügen oder das Entnehmen von Artikeln in oder aus einem Lagerort. Artikel können an unterschiedlichen Orten oder möglicherweise mehrfach gelagert sein. Das ist in der DB durch eine Tabelle mit Fremdschlüsselbeziehungen realisiert:
fkItem, fkStorage, Amount. Im einfachsten Fall wird für eine Buchung also nur die Menge erhöht oder verringert (sofern > 0). Im gleichen Zug wird eine Prüfung durchgeführt, ob ein definierter Mindestbestand unterschritten wurde und ggf. ein Eintrag in eine entsprechende Tabelle vorgenommen. Daraus können dann sofort oder später Bestellungen generiert werden.

Was könnte also genau ablaufen:

Der User sucht nach einem bestimmten Artikel, z.B. über einen Suchbegriff
=> Aufruf Applikations-Service mit Suchbegriff
=> Aufruf Domänen-Service mit Suchbegriff
=> Aufruf Repo mit Suchbegriff
=> Rückgabe der Daten über Dom-Service an App-Service an UI-Controller
Der User nimmt eine Buchung (in diesem Fall eine Entnahme) vor:
=> Aufruf App-Service mit Item-Id, Lagerort-Id und Menge
=> Aufruf Dom-Service mit Item-Id, Lagerort-Id und Menge
=> Aufruf ItemStock-Repo und Prüfen des Bestands
=> Aufruf ItemStock-Repo und Ändern des Bestands
=> Ggf. Aufruf AlertRepo und Hinzufügen eines Alerts (Menge unterschritten)​

In diesem Szenario leitet der Applikations-Service Anfragen einfach an den Domänen-Service weiter. Bei der Rückgabe von Daten nimmt er zusätzlich noch ein Mapping auf UI-DTOs vor.

Wenn ich mir das so durchlese, dann steckt jetzt die gesamte Logik in den Services und die Domänenobjekte haben eigentlich gar nichts zu tun. Das kommt mir falsch vor.
 

mrBrown

Super-Moderator
Mitarbeiter
Die Typen in der Datenbank zu halten hat durchaus auch Vorteile, zB kann man neue hinzugefügt ohne alles neu bauen zu müssen.
Das „deprecated“ kann man zB übers Datum lösen.


Wenn ich mir das so durchlese, dann steckt jetzt die gesamte Logik in den Services und die Domänenobjekte haben eigentlich gar nichts zu tun. Das kommt mir falsch vor.
Naja, ich les da überhaupt keine Geschäftslogik raus, von daher nicht verwunderlich ;)

Das Menge erhöhen ist da mMn zu knapp erklärt, als dass man da ableiten könnte, wo und wie viel Logik da drin steckt.

Schon ein Domänen-Modell erstellt?
 

temi

Top Contributor
Die Typen in der Datenbank zu halten hat durchaus auch Vorteile, zB kann man neue hinzugefügt ohne alles neu bauen zu müssen.
Das war die ursprüngliche Grundidee.
Das „deprecated“ kann man zB übers Datum lösen.
Timestamp ist eine gute Idee. Die wird es sowieso geben.
Naja, ich les da überhaupt keine Geschäftslogik raus, von daher nicht verwunderlich. Das Menge erhöhen ist da mMn zu knapp erklärt, als dass man da ableiten könnte, wo und wie viel Logik da drin steckt.
Naja, sehr viel steckt auch nicht dahinter. Ich fang halt mal klein an. Für den Einstieg ist das für mich schon einigermaßen "anspruchsvoll". Mehr als prüfen, ob die Menge die entnommen werden soll auch im Lager liegt, fällt mir erst mal nicht ein.
Schon ein Domänen-Modell erstellt?
Ich habe da noch recht wenig Ahnung davon (also nur, was ich bereits darüber gelesen habe), aber ich kann es mal versuchen und zur Diskussion stellen.
Wo ist denn z. B. das Lager modelliert?
Ich hab für die Einstiegsfrage einiges weggelassen, aber die Lager an sich sind eine recht simple DB-Tabelle:
Code:
//StorageTable
UID id
String shortName // z.B. "02004"
String description // z.B. "Gebäude 2, EG, Raum 4"
Das gelagerte Material in einer weiteren Tabelle:
Code:
//ItemStockTable
UID id
UID fkItem
UID fkStorage
int amount
int limit // Mindestbestand
Frage am Rande: Der shortName der Lagerorte stellt eigentlich bereits eine Identität dar, da er eindeutig ist. Ich würde für die Datenbanktabellen trotzdem gerne einen zusätzlichen eindeutigen Schlüssel verwenden, in diesem Fall die UID, wobei die auch eine von der DB erzeugte fortlaufende Nummer sein könnte. Ist daran etwas auszusetzen?
 

mrBrown

Super-Moderator
Mitarbeiter
die Lager an sich sind eine recht simple DB-Tabelle
Das gelagerte Material in einer weiteren Tabelle
Frage am Rande: Der shortName der Lagerorte stellt eigentlich bereits eine Identität dar, da er eindeutig ist. Ich würde für die Datenbanktabellen trotzdem gerne einen zusätzlichen eindeutigen Schlüssel verwenden, in diesem Fall die UID, wobei die auch eine von der DB erzeugte fortlaufende Nummer sein könnte. Ist daran etwas auszusetzen?

Das ist alles kein Domänen-Modell, sondern Datenbank-Details ;)

Domänen-Modell wäre eher sowas wie "Es gibt Lager, Lager haben einen Ort und eine Beschreibung. In einem Lager ist eine bestimmte Menge an Materialien gelagert. Pro Lager gibt es dabei einen Mindestbestand eines Materials."

Das ganze halt im Idealfall noch grafisch dargestellt ;)
 

mrBrown

Super-Moderator
Mitarbeiter
Ein Beispiel wäre nett.
zB was BaseUnit mit Material zu tun hat. In dem Fall könnte es ein "wird gehandelt in Einheit"

Gibt es dafür eine empfehlenswerte und leicht bedienbare Software, die unter Linux läuft? Mit LibreOffice ist das etwas beschwerlich.
Lucidchart (wobei man das nur wirklich Sinn hat, wenn man als Student die Pro-Version gratis bekommt) oder Draw.io, sind beide Web-basiert ;)
 

mihe7

Top Contributor
Gibt es dafür eine empfehlenswerte und leicht bedienbare Software
Für schnelle, einfache Sachen nehme ich UMLet.
Ich hab für die Einstiegsfrage einiges weggelassen, aber die Lager an sich sind eine recht simple DB-Tabelle:
Das Lager kam in der Einstiegsfrage vor, wurde dann aber nicht weiter berücksichtigt. Hintergrund für das Lager war Deine Frage nach der Geschäftslogik. Die Frage wäre, ob das Lager nicht für einen Teil der Logik zuständig ist. Unabhängig davon bist Du zu sehr auf die DB fokussiert. Die interessiert erst einmal überhaupt nicht.
 

temi

Top Contributor
draw.io funktioniert gut für mich. Hier ein neuer Versuch:

domain.png

Unabhängig davon bist Du zu sehr auf die DB fokussiert. Die interessiert erst einmal überhaupt nicht.
Damit hast du wohl recht.

Übrigens: Ein herzliches Dankeschön an euch beiden, dass ihr euch die Zeit nehmt meine Fragen zu beantworten. Für einen Autodidakten, der das nur aus Freude am Programmieren macht, ist es nicht so leicht, wenn man keinen Ansprechpartner hat.

Wenn ich mein Werk so betrachte, dann ist es schon eher ein Klassendiagramm. Ist das so richtig? "MaterialStock" könnte anstatt der Aggregation mit "StorageLocation" auch einfach ein Feld besitzen "storageLocation: StorageLocation".
 
Zuletzt bearbeitet:

temi

Top Contributor
So, ich habe noch mal etwas weiter gemacht. Hier würde ich erst mal stoppen und eure Kommentare abwarten.

domain.png

Was noch fehlt: Bestellungen, Lageretiketten, ???
 

temi

Top Contributor
Ich habe jetzt noch einen etwas erweiterten Ansatz versucht und dabei berücksichtigt, was ich vom Material erwarte, dass es tun kann:

domain.png

Wie verfährt man im DomainModel mit Hilfsklassen wie State, StateType oder Quantity? So wie ich es jetzt gemacht habe, indem ich sie einfach als Typ angebe oder als separate Klasse mit Assoziation (wie bei State im Beitrag darüber)?

Ist das jetzt "too much" für das Material?

Alternativ könnten z.B. die Lagerplätze erst aus einem Repository geladen werden, wenn sie angefordert werden. Würde das Material dann das entsprechende Repository kennen und das selbst erledigen?

Bin ich schon wieder zu schnell, bzw. zu tief in der Implementierung?
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn ich mein Werk so betrachte, dann ist es schon eher ein Klassendiagramm. Ist das so richtig? "MaterialStock" könnte anstatt der Aggregation mit "StorageLocation" auch einfach ein Feld besitzen "storageLocation: StorageLocation".
Ja, Domänenmodelle sind rein technisch Klassendiagramm, allerdings nur mir konzeptionellen Klassen und ohne Methoden ;)
Als Feld würde man es nur modellieren, wenn es ein primitiver Typ ist, alle anderen als Assoziationen ;)

Wie verfährt man im DomainModel mit Hilfsklassen wie State, StateType oder Quantity? So wie ich es jetzt gemacht habe, indem ich sie einfach als Typ angebe oder als separate Klasse mit Assoziation (wie bei State im Beitrag darüber)?
Als eigene Klassen ;)
 

temi

Top Contributor
und ohne Methoden
Ok, dann nehm ich die wieder raus.
Als Feld würde man es nur modellieren, wenn es ein primitiver Typ ist, alle anderen als Assoziationen
Das wird aber evtl. recht unübersichtlich.

warehouse_ref2.png

Ich möchte für alle Klassen einen State realisieren, d.h. ich müsste jetzt von State ausgehen Assoziationen zu allen Klassen einzeichnen. Was mache ich, z.B. mit Quantity in MaterialStock? Das wird dort für zwei Felder verwendet.

Ist das jetzt ein brauchbares DomainModel, oder fehlt etwas wichtiges?
 

mihe7

Top Contributor
Die Angabe der Multiplizitäten sind auf der falschen Seite.
Das wird aber evtl. recht unübersichtlich.
Ich denke, @mrBrown meinte mit "primitive Typen" etwas anderes als int usw. Es geht mehr darum, ob es sich um ein Attribut einer Klasse (bzw. deren Objekten) handelt, oder um Beziehungen. Das Alter einer Person kann man als Attribut der Klasse Person darstellen, egal ob man "int" oder eine "Age"-Klasse verwendet.

Gibt es dagegen eine Beziehung zu einer anderen Klasse, sagen wir mal Adresse, dann stellt man so etwas gerade in der Analyse nicht mehr als Feld dar. Erstens gehen die Multiplizitäten ggf. verloren, zweitens kann man die Beziehung dann nicht vernünftig beschreiben und drittens ist die Frage, ob im Entwurf die Beziehung tatsächlich noch so umgesetzt wird.

So sehe ich die Sache zumindest :)
 

AndiE

Top Contributor
Ich würde an dieser Stelle mal eingreifen. Wie der TE ist es auch mir nicht so sehr gelungen, Vorlagen zur DDD zu finden. Ich habe mir deshalb das Kompakt-Buch von Vernon besorgt.

Ich würde mal den Blick auf die Fach-Seite werfen.

Momentan scheint es darauf hinauszulaufen, dass das Programm die Lagerverwaltung komplett abdecken soll. Ich würde mir dem oben angegebenen Buch vorschlagen, dass hier eine Use-Story erstellt wurde, am besten angelehnt an eine reale Einrichtung.

Beispielsweise kann ich mir eine Firma mit zwei Filialen vorstellen. An das Hauptwerk gelieferte Materialien werden intern an die Filialen versandt oder in Lager am Hauptwerk eingelagert. Wenn es eine Getränkefirma ist, ist die Anzahl der Materialien und deren Abpackung schon recht eingeschränkt. In der Regel werden aus einem Lager auch Teile entnommen, so dass immer ein Bestand vorhanden ist.

Ich würde das Modell dahingehend noch mal überprüfen.
 

temi

Top Contributor
Ich habe mir deshalb das Kompakt-Buch von Vernon besorgt.
Das Buch hab ich auch - ist schon ziemlich kompakt. Irgendwie fehlt mir da noch was (vielleicht bin ich aber auch zu doof)
am besten angelehnt an eine reale Einrichtung.
Ich habe schon einen realen Hintergrund. Allerdings geht es eher um Ersatz- und Verbrauchsmaterial, das wir nicht über SAP verwalten können (dürfen). Aktuell machen wir das manuell: Fach ist leer => Katalog aufschlagen => Material bestellen. Das Problem ist häufig, dass wir Material nicht mehr finden (wir haben ein Lager im Wert von mehreren 100 T€), mit mehreren Lagerorten (z.B. Werkstatt, Keller, Dach) und vielen vielen Fächern (z.B. 001/003 => Schrank 1, Fach 3). Außerdem ist es nicht sehr praktisch, wenn man jedes mal wieder die Bestelldaten raus suchen muss und zu guter Letzt ist SAP zu doof ein Lageretikett zu drucken.

Eine User-Story ist also grob:
  1. Material im System suchen (Volltext, Hersteller, Hersteller-Artikelnummer)
  2. Lagerort und -platz anzeigen
  3. Material entnehmen
  4. Entnommene Menge aus dem Bestand ausbuchen
Sollte der Mindestbestand unterschritten werden, wird eine Bestellanforderung für diesen Artikel generiert. Die Bestellanforderung kann entweder sofort zu einer Bestellung führen oder es wird später eine "Sammelbestellung" aus aufgelaufenen Anforderungen gemacht. Die Bestellung selbst läuft über ein anderes System.

Weitere Anforderungen sind noch: Geliefertes Material in den Bestand einbuchen, Etikett für einen bestimmten Artikel oder mehrere Etiketten (z.B. Nummernbereich (Lagerort-/platzbezogen). Dazu muss zusätzlich das SAP-geführte Material aus einer CSV in dieses System importiert werden => Nummer, Kurztext, Langtext, Hersteller (nur Name), Hersteller-Artikelnummer, Lagerort, Lagerplatz, Mengeneinheit.

Vorschläge sind mir willkommen, das ist der aktuelle Stand:

warehouse_ref2.png
 
Zuletzt bearbeitet:

AndiE

Top Contributor
So ist das noch nicht ideal. Vielleicht sagen dir "Lagerfachkarten" was. Im Prinzip heißt das, dass jede Entnahme zeitnah nachgewiesen wird. Diese wird dann anschließend verbucht. Sind Inhalte unter den Limit gesunken, werden dann neue zur Bestellung ausgeschrieben.

Daraus ergeben sich für mich diese Use-Cases:
1. Aufteilung: Zuerst kann man festlegen, welche Fächer es wo gibt.
2. Inventur: Nun legt man fest, wo was liegt und in welchem Umfang.
3. Zugang: Eine Lieferung von einem Lieferanten kommt. Diese wird auf die Fächer aufgeteilt
4. Entnahme: jemand schreibt eine Anforderung. Aus den entsprechenden Fächern werden die angeforderten Mengen entnommen
5. Bestand überprüfen: Der Lagerverwalter überprüft den Bestand. Ist der Bestand einer Sache unter Soll gesunken, neu bestellen.

Das würde aber einen Lagerverwalter erfordern, an den Anforderungen (Materialentnahmescheine) gestellt werden, der die Lieferungen dann entsprechend zusammenstellt.
 

Meniskusschaden

Top Contributor
und zu guter Letzt ist SAP zu doof ein Lageretikett zu drucken.
Da wird wohl nicht SAP die Partei sein, die zu doof ist, ein Etikett zu drucken.;)
das wir nicht über SAP verwalten können (dürfen).
Vorschläge sind mir willkommen
Falls es wirklich einen guten Grund dafür geben sollte, dass die Standard-SAP-Prozesse nicht in Betracht kommen (Schwierigkeiten beim Etikettendruck würde ich nicht dazu zählen), bleibt trotzdem noch die Option, auf Basis der SAP-Entwicklungstools eine eigene Lösung zu entwickeln. Die wäre dann vernünftig im SAP-GUI integriert und den Datenaustausch per csv-könnte man sich auch sparen.
 

temi

Top Contributor
Falls es wirklich einen guten Grund dafür geben sollte, dass die Standard-SAP-Prozesse nicht in Betracht kommen (Schwierigkeiten beim Etikettendruck würde ich nicht dazu zählen), bleibt trotzdem noch die Option, auf Basis der SAP-Entwicklungstools eine eigene Lösung zu entwickeln. Die wäre dann vernünftig im SAP-GUI integriert und den Datenaustausch per csv-könnte man sich auch sparen.
Vergiss es. Das wird in nächster Zeit nicht passieren. Ist aber auch egal und soll hier nicht das Thema sein. Ich möchte das Programm umsetzen, weil es ein sinnvolles Ziel ist und ich möchte es "gut" machen, weil ich "schöne" Software mag.
 

temi

Top Contributor
So ist das noch nicht ideal. Vielleicht sagen dir "Lagerfachkarten" was. Im Prinzip heißt das, dass jede Entnahme zeitnah nachgewiesen wird. Diese wird dann anschließend verbucht. Sind Inhalte unter den Limit gesunken, werden dann neue zur Bestellung ausgeschrieben.

Daraus ergeben sich für mich diese Use-Cases:
1. Aufteilung: Zuerst kann man festlegen, welche Fächer es wo gibt.
2. Inventur: Nun legt man fest, wo was liegt und in welchem Umfang.
3. Zugang: Eine Lieferung von einem Lieferanten kommt. Diese wird auf die Fächer aufgeteilt
4. Entnahme: jemand schreibt eine Anforderung. Aus den entsprechenden Fächern werden die angeforderten Mengen entnommen
5. Bestand überprüfen: Der Lagerverwalter überprüft den Bestand. Ist der Bestand einer Sache unter Soll gesunken, neu bestellen.

Das würde aber einen Lagerverwalter erfordern, an den Anforderungen (Materialentnahmescheine) gestellt werden, der die Lieferungen dann entsprechend zusammenstellt.
Ehrlich gesagt, weiß ich nicht genau was du mir sagen möchtest. Soll ich einen Karteikasten kaufen?
 

AndiE

Top Contributor
Vielleicht habe ich auch einen Denkfehler. Ich würde mal einen "Schreibtischtest" durchführen.
"Transport Timm liefert 10 Büchsen Farbe von "Bunt& Klar", 5 Rollen Kabel von "Elektro-Meier" und 5 Kisten Schrauben von "Schrauben-Paul". Diese Dinge werden in die Lagerfächer 1 bis 3 einsortiert. Am Ende des Tages sind 2 Büchsen Farbe entnommen, 1 Rolle Kabel und 1 Kiste Schrauben. Nach einer Woche sind nur noch 2 Dosen Farbe da- Sie muss nachbestellt werden."

Kann das Modell diese Vorgänge abbilden? Momentan ist es auch nicht sichtbar, wer was entnimmt, glaube ich. Ist das nicht wichtig? Soweit ich das sehe, kann die wichtige Frage: "Was haben wir noch an Material X an den 3 Standorten" nochjt geklärt werden.

Sorry, wenn ich falsch liege, aber das ist mein Eindruck.
 

mihe7

Top Contributor
Soweit ich das sehe, kann die wichtige Frage: "Was haben wir noch an Material X an den 3 Standorten" nochjt geklärt werden.

Zwischen StorageLocation und MaterialStock dürfte eine 1:n-Beziehung bestehen (die wäre im Diagramm falsch). Zwischen MaterialStock und Material eine n:1-Beziehung.

In SQL: SELECT location_id, material_id, sum(amount) FROM material_stock GROUP BY location_id, material_id;
 

mrBrown

Super-Moderator
Mitarbeiter
Ich denke, @mrBrown meinte mit "primitive Typen" etwas anderes als int usw. Es geht mehr darum, ob es sich um ein Attribut einer Klasse (bzw. deren Objekten) handelt, oder um Beziehungen. Das Alter einer Person kann man als Attribut der Klasse Person darstellen, egal ob man "int" oder eine "Age"-Klasse verwendet.

Gibt es dagegen eine Beziehung zu einer anderen Klasse, sagen wir mal Adresse, dann stellt man so etwas gerade in der Analyse nicht mehr als Feld dar. Erstens gehen die Multiplizitäten ggf. verloren, zweitens kann man die Beziehung dann nicht vernünftig beschreiben und drittens ist die Frage, ob im Entwurf die Beziehung tatsächlich noch so umgesetzt wird.

So sehe ich die Sache zumindest :)
Ja, so meinte ich das ;)
 

temi

Top Contributor
Zwischen StorageLocation und MaterialStock dürfte eine 1:n-Beziehung bestehen
Das ist nicht richtig. Bei MaterialStock handelt es sich um die lagerplatzbezogene Menge, d.h. 1:1.
Kann das Modell diese Vorgänge abbilden?
Ich denke doch: Beim Einbuchen des Materials ist es nicht relevant, wer liefert oder von wem geliefert wurde. Das Material mit einer bestimmten Materialnummer wird in den (die) vorgesehenen Lagerorte/-plätze eingelagert und eingebucht. Entnahmen erfolgen analog. Wer das Material entnimmt oder einlagert ist nicht relevant, könnte aber in der PostTransaction erfasst werden, falls erforderlich.
Soweit ich das sehe, kann die wichtige Frage: "Was haben wir noch an Material X an den 3 Standorten" nochjt geklärt werden.
Standorte wären z.B. Werke. Das ist nicht vorgesehen und nicht erforderlich. Ich nehme an du meinst Lagerorte. Insofern bei einer Entnahme korrekt gebucht wurde, ist das abgedeckt.
 
Zuletzt bearbeitet:

temi

Top Contributor
die 1 gehört auf die Seite von StorageLocation
Ist sie schon... (#48 - die hatte ich übersehen)
Zu einem Lagerplatz gibt es mehrere MaterialStocks
Ich denke eher: Zu einem Material gibt es mehrere MaterialStocks und das steht doch auch da.
Oder verstehe ich hier generell etwas falsch?

Edit: Vielleicht gibt es ja für euch auch einen guten Grund, das von der anderen Seite zu sehen. Für mich ist das Material der zentrale Punkt.
 
Zuletzt bearbeitet:
Ä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

Neue Themen


Oben