Labyrinth über MazeGameServer visualisieren

Diskutiere Labyrinth über MazeGameServer visualisieren im Softwareentwicklung Bereich.
J

jono

@JustNobody
Java:
if (parts[0].equals("PSCO")){
                
            }
das parts-Array ist das CSV-Array welches die Servernachricht enthält und durch ";" gesplitet wird.
Nun möchte ich der if-Anweisung sagen, wenn parts[0] "PSCO" ist, dann möchte ich dass die Command Klasse "X" angesprochen wird, bzw. ihre Methdoe ausführt?
 
J

JustNobody

@JustNobody
Java:
if (parts[0].equals("PSCO")){
               
            }
das parts-Array ist das CSV-Array welches die Servernachricht enthält und durch ";" gesplitet wird.
Nun möchte ich der if-Anweisung sagen, wenn parts[0] "PSCO" ist, dann möchte ich dass die Command Klasse "X" angesprochen wird, bzw. ihre Methdoe ausführt?
Hast Du eine Instanz der Klasse "X" oder ist die Methode statisch? Dann kannst Du da den Aufruf einbauen. (Statisch ist aus Sicht von Java technisch möglich, aber aus Sicht der Objektorientierung ist es eher keine Option. Wobei ich jetzt nicht den Überblick habe, was Du da wie an Code hast und so.

Anregung (Wenn Du es nicht verstehst, dann bau es erst so, wie Du es verstanden hast - das kannst Du komplett ignorieren):
Generell scheint mir das schon fast etwas zu sein, dass man recht schön aufbauen kann mit einer Map also etwas in der Art:
commandMap.get(parts[0]).execute()
Die commandMap hat dann halt den Zusammenhang zwischen "PSCO" und einer "Command Klasseninstanz" und ich habe da die Methode, die aufgerufen wird, einfach mal execute genannt. Das kann natürlich in Deinem konkreten Fall etwas anders aussehen.

Oder wie schon so oft auf den Seiten dieses Threads erwähnt: Enum kann man auch nutzen, um sowas aufzubauen (So die Elemente fix sind, denn im Gegensatz zu der map kann man einer Enum zur Laufzeit keine Member hinzufügen).
 
J

jono

Den oben genannten commandMap-Befehl würde ich dann in die if-Anweisungen schreiben. Die if-Anweisungen kommen in die Klasse des MazeGameProtocol's, die die Servernachrichten einlesen. Der Code hier stellt ja die Befehlsklasse dar, die die PSCO Nachricht aktivieren soll. Wenn ich das jetzt so mache:
Java:
if (parts[0].equals("PSCO")){
            commandMap.get(parts[0]).execute()    
            }
wäre das ja noch nicht korrekt, wie mache ich das jetzt, dass die ScoreCommand-Befehlsklasse angesprochen wird.
Java:
public class ScoreCommand implements Command {

    private int score = parts[2];

    @Override
    public int execute() {

        return score.addToScore();
    }

}
addToScore ist dann hier die Methode aus der Empfängerklasse, wie z.B. die Playerklasse in der der Score verändert werden soll.
Die Befehlsklasse "ScoreCommand" soll ja jetzt nur die addToScore-Methode in "Player" ausführen, ist ja die Aufgabe einer Befehlsklasse...
Wie mache ich jetzt hier richtig, eher gesagt wie kann ich der Befehlsklasse das parts-array ansprechen, welches ich in der Readerklasse des MazeGameProtocols definiert habe:
Java:
try(
    LineNumberReader read = new LineNumberReader(new StringReader())){
        read.lines()
        .filter(line -> read.getLineNumber() = 0)
        .forEach(line -> {
            String [] parts = str.split(";");
            
            if (parts[0].equals("PSCO")){
                commandMap.get(parts[0]).execute();
 
J

JustNobody

Also ich habe keinen Überblick über dein Design und kann daher nur sagen:
a) Das mit der map hast Du falsch verstanden. Da brauchst Du dann kein if mehr! Das ist ja der Sinn dahinter - eine Serie von ifs bzw ein switch zu vermeiden.
b) Deine Klasse ScoreCommand macht keinen Sinn. So soll denn da das parts[2] her kommen?
c) Wieso meinst Du, da plötzlich mit Streams arbeiten zu müssen? Du scheinst noch Probleme mit den Java Basics zu haben - da würde ich dies erst einmal nicht nutzen. Und was genau willst Du da genau machen? Ich würde das an Deiner Stelle mit kleinen, sinnvollen Methoden machen. Und was ist da für eine Bedingung in .filter? Soll das == oder != sein? Das = alleine macht so keinen Sinn. Und wenn es ein Stream sein soll: Dann mach es wirklich einfach zu lesen - ebenfalls mit Methoden. Also sowas wie:
Java:
try(LineNumberReader read = new LineNumberReader(new StringReader())) {
    read.lines()
    .filter(line -> read.getLineNumber() != 0)
    .forEach(line -> verarbeiteZeile(line));
}
Ich habe da mal ein != 0 gemacht - willst evtl. die erste Zeile nicht haben oder so ... Und dann klar sauber Methoden aufgebaut. Wobei ich statt dem Lambda Ausdruck eine Methodenreferenz angegeben hätte, aber das mit dem Lambda ist evtl. lesbarer für Dich ...
 
J

jono

Zu a)
Okay, also die Reader-Klasse in MazeGameProtocol kann dann durch den commandMap-Befehl direkt die Methode "execute" in der Befehlsklasse ausführen?
Zu b)
Ja, ich weiß, dass das keinen Sinn macht. Das Problem ist, dass ich die 3. Position für den Punktestand benutzen muss weil das ja so vorgegeben ist. Und den brauche ich ja für die Methode addToScore, die ich in der Playerklasse schreibe. Also die dritte stelle des PSCO Befehls muss ja für die Methode verwendet werden, darum geht es mir da.
Zu c)
Weil die Servernachrichten eingelesen werden müssen?
Ja sinnvoll wäre da eher >= 0.
 
J

jono

@JustNobody Ich würde es gerne mit den if Anweisungen so fortsetzen...
Java:
if (parts[0].equals("PSCO")){
                ScoreCommand psco = new ScoreCommand();
Das würde dann erstmal so aussehen. Dieser Code steht in einer Klasse der MazeGameProtocol-Komponente. Wie schaffe ich es jetzt in der Komponente COmmandHandler mehrere Verweise zu setzen auf die Objekte, denn ich muss ja natürlich noch mehr Befehlsklassen als ScoreCommand erstellen
 
J

jono

Also wie übergebe ich die Referenzvariable einer z.B. Klasse namens CommandHandler im CommandHandler.
Java:
ScoreCommand score = psco
So gebe ich "score" eine Referenz, die auf dasselbe Objekt verweist, nur wie übergebe ich diese Referenzvariable psco, weil diese kennt das Programm ja nicht bzw. erscheint die Meldung: psco cannot be resolved to a variable
 
Thema: 

Labyrinth über MazeGameServer visualisieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben