Wie verwalte ich eine m:1-Beziehung in Java?

Algorithmen, Sprachunabhängige Diskussionen zu Konzepten, Programmiersprachen-Design
Antworten
Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Wie verwalte ich eine m:1-Beziehung in Java?

Beitrag von Orioner » Fr Apr 17, 2020 12:17 am

Hi. Ich schreibe gerade an einem kleinen Programm (Java), das Missionsbeschreibungen für ein Spiel bereitstellt. Diese werden aus Textbausteinen zusammengesetzt. Unter anderem wird aus einer Liste mit Sternensystemen eins (zufällig) gewählt und dann auf eine oder mehrere Installationen (Raumbasen, Sprungpunkte, ...) innerhalb dieses Sternensystems Bezug genommen. Jetzt stellt sich mir die Frage, wie ich die Installationen intern repräsentieren will. Ich könnte z.B. für jedes Sternensystem eine Datei anlegen und in diesen die Installationen auflisten. Oder - was ich für praktischer halte - ich lege für jedes Sternensystem einen enum an. In C hätte sich vielleicht ein struct angeboten. In Java gibt es das aber nicht in der Form.

Was meint ihr zu der Frage? Wie verwalte/organisiere ich die m:1-Beziehung am sinnvollsten?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Wie verwalte ich eine m:1-Beziehung in Java?

Beitrag von cloidnerux » Fr Apr 17, 2020 9:02 am

In einer Datenbank.
Du hast eine Liste an Sternensystemen und eine Liste an Raumbasen/Sprungpunkten etc. Jeder Eintrag hat eine eindeutige ID. Dann hast du noch eine dritte Liste an ID-ID Verknüpfungen. Wenn du eine Raumbasis lädst, musst du dir aus deiner dritten Liste alle zugehörigen Sternensysteme filtern.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Wie verwalte ich eine m:1-Beziehung in Java?

Beitrag von Orioner » Fr Apr 17, 2020 1:42 pm

Danke für deinen Vorschlag. Aber es handelt sich nicht um eine m:n-Beziehung, bei der man eine "Zwischentabelle" braucht, wie du meinst. MMn kann ich in der Tabelle mit Installationen immer das jeweils dazu passende Sternensystem referenzieren. Die Frage ist, wie ich das mit Java realisiere, ohne eine "echte" Datenbank anzubinden, denn das wäre ein wenig mit Kanonen auf Spatzen geschossen.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Wie verwalte ich eine m:1-Beziehung in Java?

Beitrag von cloidnerux » Fr Apr 17, 2020 2:14 pm

Ob du jetzt eine Liste führst oder eine Datenbank hast, ist jetzt von der Implementation nicht unbedingt so unterschiedlich.
Du kannst ja auch jedem Sternensystem eine Liste an Referenzen oder den Installationsobjekten geben, dann ist es wirklich nur die M:1 Beziehung.

Von der Datenseite her musst du dich natürlich fragen, wie du dein System Abbilden willst. Du kannst es natürlich Hardcoden, das würde ich aber nicht empfehlen. Stattdessen wäre mein Vorschlag, dass du die Listen jeweils in einer Datei hast und beim Start des Programms dir deine Sternensystemobjekte generierst und denen dann die entsprechenden Installationsobjekte in einer Liste gibst. Dann kannst du das schön aus Textdateien einfach einlesen und du kannst die Story von der Steuerlogik entkoppeln.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Wie verwalte ich eine m:1-Beziehung in Java?

Beitrag von Orioner » Fr Apr 17, 2020 2:48 pm

Deine Idee gefällt mir. Noch ist mir allerdings nicht klar, wie ich das umsetzen kann. Soll ich Schlüssel-Wert-Paare, in denen ich jeder Installation ein Sternensystem zuordne, (in Dateien) vorhalten und dann bei Programmstart die Sternensysteme, mit ihren zugehörigen Installationen (aus diesen Schlüssel-Wert-Paaren) generieren? Ist es das, was du meinst?

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Wie verwalte ich eine m:1-Beziehung in Java?

Beitrag von cloidnerux » Fr Apr 17, 2020 7:43 pm

So in etwa, ja.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Orioner
Beiträge: 102
Registriert: Mo Dez 10, 2012 10:52 am

Re: Wie verwalte ich eine m:1-Beziehung in Java?

Beitrag von Orioner » So Apr 19, 2020 5:46 pm

Ich habe es jetzt folgendermaßen gelöst:
In einer Datei halte ich die Planetenname vor. In einer zweiten Datei halte ich die Systemnamen vor und zwar in exakt der Reihenfolge der Planetennamen aus der ersten Datei.
Ich habe ferner 3 Klassen: Main, GetPlanet, GetLocation
In der Hauptmethode (main) instanziiere ich ein Objekt von GetPlanet. Der Konstruktor liest die Datei ein, speichert die Planeten in einer ArrayList und wählt zufällig einen aus, welcher in der Instanzvariablen planet der Klasse GetPlanet gespeichert wird. Desweiteren speichere in in einer Instanzvariblen den Wert der Position in der ArrayList. Dann instanziiere ich GetLocation in meiner Hauptklasse (Main) und übergebe 2 Parameter an den Konstruktor von GetLocation: den Namen der Datei in der die Sternensysteme stehen (passend zu den Planeten in der anderen Datei) und die Nummer des Planeten in der ArrayList (von GetPlanet). Wieder werden alle Namen in einer ArrayList gespeichert - diesmal jene der Systeme. Über die übergebene Planetennummer greife ich auf das richtigen Sternensystem zu. Er wird in einer Instanzvariablen gespeichert, die ich von mit pl.getLocation() in der main-Methode abfragen kann.
Dann setze ich in der main-Methode die Textfragmente zusammen: System.out.println(pl.getPlanet() + " in system " + loc.getLocation());
Das ist sicher nicht das rafinierteste Vorgehen, aber es erfüllt seinen Zweck.

Antworten