Guten Abend,
ich versuche mir seit Tagen einen ordentlichen Command-Handler zu basteln. Es scheitert leider immer daran, dass ich zwischen Befehlen unterscheiden muss, die ein, zwei oder drei Wörter lang sind.
Hier ist mein derzeitiger Code bei dem ich nicht weiter komme:
und hier ist meine getArguments() Methode:
initialiseCommands() enthält alle registrierten Befehle (jeder Befehl ist in einer eigenen Klasse). Des Weiteren verfügt jeder Befehl über die Methode getName(), die eine Zeichenkette des Befehlsnamens zurückgibt (z. B. für den Befehl
Hier sind ein paar Befehle mit unterschiedlicher Wortlänge des Befehlsnamens:
-
-
-
Wie kann ich jetzt gescheit die Eingaben von Benutzer parsen und den potenziell richtig eingegeben Befehl rausfiltern?
Beispiel:
Sobald ich den Befehl habe, bekomme ich die Argumente automatisch mit meiner getArguments() Methode. Es geht also wirklich nur darum, den Befehl zu filtern, den der Benutzer eingibt.
Falls irgendetwas unklar sein sollte, fragt bitte nach. Ich mache mir seit Tagen Gedanken um dieses scheinbar unlösbare Problem...
ich versuche mir seit Tagen einen ordentlichen Command-Handler zu basteln. Es scheitert leider immer daran, dass ich zwischen Befehlen unterscheiden muss, die ein, zwei oder drei Wörter lang sind.
Hier ist mein derzeitiger Code bei dem ich nicht weiter komme:
Java:
register = new Register();
CommandParser parser = new CommandParser(this);
while (running) {
String input = Terminal.readLine();
try {
final List<Command> commands = parser.initialiseCommands(register);
final List<String> inputSplit = Arrays.asList(input.split(" "));
final Command command = commands.stream()
.filter(cmd -> cmd.getName().equals(???)
.findAny()
.orElseThrow(() -> new InvalidInputException("no such command");
final List<String> arguments = parser.getArguments(inputSplit, command);
command.setArguments(arguments);
command.execute();
} catch (InvalidInputException | BadSyntaxException e) {
Terminal.printError(e.getMessage());
}
}
und hier ist meine getArguments() Methode:
Java:
public List<String> getArguments(final List<String> inputSplit, final Command command) throws BadSyntaxException {
int commandCount = command.getName().split(" ").length;
final List<String> arguments = inputSplit.subList(commandCount, inputSplit.size());
if (arguments.size() != command.getNumberOfArguments()) {
throw new BadSyntaxException("invalid number of arguments. Expected %d arguments",
command.getNumberOfArguments());
}
return arguments;
}
initialiseCommands() enthält alle registrierten Befehle (jeder Befehl ist in einer eigenen Klasse). Des Weiteren verfügt jeder Befehl über die Methode getName(), die eine Zeichenkette des Befehlsnamens zurückgibt (z. B. für den Befehl
add track <point> -> <point>
ist es "add track").Hier sind ein paar Befehle mit unterschiedlicher Wortlänge des Befehlsnamens:
-
add track <point> -> <point>
- Länge 2-
exit
- Länge 1-
delete rolling stock <id>
- Länge 3Wie kann ich jetzt gescheit die Eingaben von Benutzer parsen und den potenziell richtig eingegeben Befehl rausfiltern?
Beispiel:
add track (1,2) -> (3,2)
-> Command command = AddTrackCommand().Sobald ich den Befehl habe, bekomme ich die Argumente automatisch mit meiner getArguments() Methode. Es geht also wirklich nur darum, den Befehl zu filtern, den der Benutzer eingibt.
Falls irgendetwas unklar sein sollte, fragt bitte nach. Ich mache mir seit Tagen Gedanken um dieses scheinbar unlösbare Problem...