Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

21

30.08.2018, 11:01

Er schrieb doch aber, dass jeder Beruf eigene Attribute hat. Genau das ist Vererbung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

22

30.08.2018, 11:26

Er schrieb doch aber, dass jeder Beruf eigene Attribute hat. Genau das ist Vererbung.
Folgendes wurde geschrieben:
es geht darum, tatsächliche Eigenschaften der Types aus externen Dateien zu laden.
Die Motivation kann ich gut verstehen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

23

30.08.2018, 11:34

Ich verlinke mal:
[Java] Problem mit statischen Methoden und Unit-Tests
Er hat eine offensichtliche Vererbungsstruktur (Eine Amtsposition IST eine Profession, dasselbe gilt für Smith und Teacher) und er will diese Daten dynamisch laden. Ersteres und letzteres sind unabhängig voneinander und von statischem Zugriff oder Dependency Injection sowieso. Dasselbe Problem hat er übrigens auch für andere seiner Daten. Aus meiner Sicht ist das ein ganz trivialer Fall für Vererbung und Serialisierung. Statischen Zugriff zu wollen, ist eher eine Konsequenz von schlecht strukturiertem oder schlecht geschnittenem Code.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

24

30.08.2018, 11:51

Nehmen wir mal an mit den Berufen muss nun Spiellogik implementiert werden. Vererbung hin oder her, wie greift man in den verschiedenen Teilen der Spiellogik auf die Berufe zu?

Ein Charakter kann direkt auf die entsprechenden Berufe verweisen, aber wie kommt die Referenz auf den Beruf in den Charakter?

Sagen wir mal ich will einen neuen Bäcker erschaffen, da muss ich ja dann sowas sagen: person.setBeruf( Berufe.BAECKER ).

In diesem Fall habe ich eine zentrale Registratur die Berufe heißt. Wenn ich nun die Attribute des dort hinterlegten Berufes aus einer Datei lade, kann ich das tun, aber spätestens wenn man Unittests implementiert, die alle eine andere Variante der zentralen Registratur benötigen, dann kann das lästig werden. Dafür wurde dann sowas wie PowerMock gebaut. Das hat ja der OP auch schon erwähnt.

Eine Alternative wäre, dass die Stelle, die den Beruf setzt, die Registratur als Instanz kennt: z.B. person.setBeruf( berufe.getBaecker() ). Wie kommt die Instanz der Berufsregistratur an die richtige Stelle? Das kann man manuell reinreichen, per DI lösen oder auch einen Kontext nutzen, der zumindest pro Thread flexibel ist: person.setBeruf( GameContext.getBerufe().getBaecker() ).

25

30.08.2018, 11:51

@BlueCobold Jetzt verstehe ich, warum du oben auf Vererbung hingewiesen hast... Das habe ich wohl in meinem Post, auf den du verlinkst, missverständlich ausgedrückt (Entschuldigung dafür!) - PositionType ist ein ganz anderer Type, keine Unterart der ProfessionTypes.

Chromanoid bringt mein Problem hier nochmal sehr präzise auf den Punkt:

Zitat von »Chromanoid«


Wenn ich das richtig sehe, gibt es keine eigenen Klassen je Beruf. Es gibt eine Berufstypklasse und eine Berufsklasse, die Berufstyp und die Erfahrung darin zuordnet.

Wenn ich das Problem richtig verstehe, geht es darum in einer Datei gespeicherte Werte zu laden und allen Teilen des Programms zur Verfügung zu stellen. Das wurde bisher über statische Variablen gelöst - die machen aber Ärger beim Test-Schreiben.


Edit: @Chromanoid Dein zweiter Post trifft dann nochmal den Nagel auf den Kopf.
Pewn - eine Plattform für alle, die an Indie-Spielen interessiert sind

26

30.08.2018, 13:13

@damios Wenn Du es schnell und einfach haben willst, und keine parallele Testausführung in einer JVM benötigst, löse es vielleicht so:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
abstract class Berufe {
  protected static Berufe INSTANCE = null;

  public static Beruf BAECKER = null;
  // ...
  public abstract Beruf getByName( String name );
  public void init() {
    INSTANCE = this;
    BAECKER = getByName("baecker");
  }
}

class JSONBerufe extends Berufe {
  Beruf getByName( String name ) { ... } 
}

Beim Start des Spiels oder eines Test:
new JSONBerufe().init(); bzw. new TestBerufe().init();

Das ist natürlich eher Holzhammer aber reicht denke ich für Deine Zwecke...

Edit: Etwas schöner fände ich glaube ich dann Methoden statt Variablen, also: Berufe.baecker() Das macht die Nutzung etwas sicherer.

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »Chromanoid« (30.08.2018, 13:55)


27

01.09.2018, 00:40

Danke an alle die geholfen haben, insbesondere Schorsch, BlueCobold und Chromanoid!
Nach etwas Nachdenken habe ich mich nun für die Lösung aus Post #8 entschieden. Dadurch werden die zahlreichen statischen Methoden und Variablen durch Enums und ein einziges Singleton ersetzt. Außerdem kann dadurch einiger redundanter Code beim Asset-Loading eingespart werden. Und dadurch wird natürlich auch das Symptom der vorigen Konstruktion gelöst, das überhaupt der Anlass für diesen Thread war: Die Klassenvariablen des Singletons können selbstverständlich gemocked werden.
Pewn - eine Plattform für alle, die an Indie-Spielen interessiert sind

28

17.10.2018, 23:30

Boar, echt jetzt? Bin ich der Einzige, der die Lösungsvorschläge immer gruseliger findet?


Um einfach mal auf diese Frage zu antworten:
Nein, bist du definitiv nicht! :D

@damios:
Am besten einfach gar nichts statisch außer eine Singleton Instanz.
Aber deine letzte Lösung ist auch (noch) akzeptabel.
Indie Game-Dev Programmierer beim 2D MMORPG Pentaquin | Pentaquin Foren Vorstellung

Werbeanzeige