Способ обработки команд для управления хоккейной лиги


Я должен сократить Способ method в HockeySystem. Terminal.readLine читает линии вы положили в терминал. Я попытался разделиться метод, но там, кажется, проблемы с while-петли в основном если я сделаю это. Как я могу сократить это?
Вы можете игнорировать любой другой класс кроме того HockeySystem Я только положить их в так, что он будет компилировать-в состоянии

 public class HockeySystem {

            private static boolean var = true;
            private Team[] teams = new Team[4];
            private HockeyMatch[] hockeyMatches = new HockeyMatch[4];
            private Standings[] standings = new Standings[4];

            /**
             *
             * @param args for command-line arguments
             */
            public static void main(String[] args) {
                HockeySystem m = new HockeySystem();

                while (var == true) {

                    m.method();

                }
            }

            /**
             * This method contains multiple IF-Operations. Depending on the Input in
             * the Terminal, different operations will be executed.
             *
             * "add-team" Input : "team" will be added to the Array "teams" if "team"
             * passes multiple tests, which if it doesn't will lead to Error messages.
             * In case "teams" is full, the Array will be doubled in size.
             *
             * "list-team" Input : every "team" in the Array "teams" will be printed ,
             * each one in a new row.
             *
             * "add-ice-hockey-match" Input : "hockeyMatch" will be added to the Array
             * "hockeyMatches" if "hockeyMatch" matches the requirements. If it doesn't
             * match those , an Error message will be printed. In case "hockeyMatch" is
             * full, the Array will be doubled in size.
             *
             * "quit" Input : The program will be
             *
             */
            public void method() {
                String[] parts = Terminal.readLine().split(" ");
                if (parts[0].startsWith("add-team")) {
                    String[] parts2 = parts[1].split(";"); // parts2[0] will be the "ID" & parts 2[1] will be the "Teamname"
                    boolean hasBeenAdded = false;
                    boolean hasNameError = false;
                    boolean hasSameId = false;
                    Team team = new Team(Integer.valueOf(parts2[0]), parts2[1]);
                    for (int i = 0; i < teams.length; i++) {
                        if (teams[i] != null) {
                            if (teams[i].getTeamName().equals(team.getTeamName())) {
                                hasNameError = true;
                            }
                            if (teams[i].getId() == team.getId() || team.getId() == 0) {
                                hasSameId = true;
                            }
                        }
                        if (teams[i] == null) {
                            if (team.getId() == 0) {
                                hasSameId = true;
                            }
                            if (hasNameError == false && hasSameId == false) {
                                teams[i] = team;
                                hasBeenAdded = true;
                            }
                            break;
                        }
                    }
                    if (hasBeenAdded == false && hasNameError == false && hasSameId == false) {
                        Team[] moreTeams = new Team[teams.length * 2];
                        moreTeams[teams.length] = team;
                        for (int i = 0; i < teams.length; i++) {
                            moreTeams[i] = teams[i];
                        }
                        teams = moreTeams;
                        hasBeenAdded = true;
                    }
                    if (hasNameError) {
                        Terminal.printError("A team with that Name already exists.");
                    } else if (hasSameId) {
                        Terminal.printError("A Team with that ID already exists or the ID equals 0.");
                    } else {
                        Terminal.printLine("OK");
                    }
                }
                if (parts[0].equals("list-team")) {
                    for (int i = 0; i < teams.length; i++) {
                        if (teams[i] != null) {
                            Terminal.printLine(teams[i].getId() + " " + teams[i].getTeamName());
                        }
                    }
                }
                if (parts[0].equals("add-ice-hockey-match")) {
                    String[] parts2 = parts[1].split(";");
                    if (Integer.valueOf(parts2[4]) >= 60 && Integer.valueOf(parts2[4]) <= 120
                            && Integer.valueOf(parts2[1]) != Integer.valueOf(parts2[3])) {
                        HockeyMatch hockeyMatch;
                        hockeyMatch = new HockeyMatch(
                                Integer.valueOf(parts2[0]),
                                Integer.valueOf(parts2[1]),
                                Integer.valueOf(parts2[2]),
                                Integer.valueOf(parts2[3]),
                                Integer.valueOf(parts2[4]));
                        boolean hasBeenAdded = false;
                        for (int i = 0; i < hockeyMatches.length; i++) {
                            if (hockeyMatches[i] != null) {
                                hockeyMatches[i] = hockeyMatch;
                                hasBeenAdded = true;
                            }
                            break;
                        }
                        if (hasBeenAdded == false) {
                            HockeyMatch[] moreHockeyMatches = new HockeyMatch[hockeyMatches.length * 2];
                            moreHockeyMatches[hockeyMatches.length] = hockeyMatch;
                            for (int i = 0; i < hockeyMatches.length; i++) {
                                moreHockeyMatches[i] = hockeyMatches[i];
                            }
                            hockeyMatches = moreHockeyMatches;
                            hasBeenAdded = true;
                        }
                        if (hasBeenAdded) {
                            Terminal.printLine("OK");
                        }
                    } else if (Integer.valueOf(parts2[4]) <= 60) {
                        Terminal.printError("The minimum playtime of 60minutes has not been reached.");
                    } else if (Integer.valueOf(parts2[4]) >= 120) {
                        Terminal.printError("The maximum playtime of 120minutes has been exceeded.");
                    } else if (Integer.valueOf(parts2[1]) == Integer.valueOf(parts2[3])) {
                        Terminal.printError("Tie not allowed.");
                    }
                }
                if (parts[0].equals("print-del-standings")) {
                }
            }


            public void quit(){
                var = false;
            }
        }
    public class HockeyMatch {

        private int id1;
        private int goal1;
        private int id2;
        private int goal2;
        private int playTime;

        /**
         *
         * @param id1 The first Team of the HockeyMatch
         * @param goal1 The amount of goals of the first Team
         * @param id2 The second Team of the HockeyMatch
         * @param goal2 The amount of goals of the second Team
         * @param playTime The playtime of the HockeyMatch
         */
        public HockeyMatch(int id1, int goal1, int id2, int goal2, int playTime) {
            this.id1 = id1;
            this.goal1 = goal1;
            this.id2 = id2;
            this.goal2 = goal2;
            this.playTime = playTime;
        }

    }
public class Team {

    private int id;
    private String teamName;

    /**
     * 
     * @param id the Team consists of an ID & teamname
     * @param teamName the Team consists of an ID & teamname
     */
    public Team(int id, String teamName) {
        this.id = id;
        this.teamName = teamName;
    }

    /**
     * 
     * @return the Teamname of the Team.
     */
    public String getTeamName() {
        return teamName;
    }

    /**
     * 
     * @return the ID of the Team.
     */
    public int getId() {
        return id;
    }





}
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * This class provides some simple methods for input/output from and to a terminal as well as a method to read in
 * files.
 * 
 * <p><b>Never modify this class, never upload it to Praktomat.</b> This is only for your local use. If an assignment
 * tells you to use this class for input and output never use System.out, System.err or System.in in the same
 * assignment.
 * 
 * @author  ITI, VeriAlg Group
 * @author  IPD, SDQ Group
 * @version 5.03, 2016/05/07
 */
public final class Terminal {

    /**
     * Reads text from the "standard" input stream, buffering characters so as to provide for the efficient reading
     * of characters, arrays, and lines. This stream is already open and ready to supply input data and corresponds
     * to keyboard input.
     */
    private static final BufferedReader IN = new BufferedReader(new InputStreamReader(System.in));

    /**
     * Private constructor to avoid object generation.
     * 
     * @deprecated Utility-class constructor.
     */
    @Deprecated
    private Terminal() {
        throw new AssertionError("Utility class constructor.");
    }

    /**
     * Prints the given error-{@code message} with the prefix "{@code Error, }".
     * 
     * <p>More specific, this method behaves exactly as if the following code got executed:
     * <blockquote><pre>
     * Terminal.printLine("Error, " + message);</pre>
     * </blockquote>
     *
     * @param message the error message to be printed
     * @see   #printLine(Object)
     */
    public static void printError(final String message) {
        Terminal.printLine("Error, " + message);
    }

    /**
     * Prints the string representation of an {@code Object} and then terminate the line.
     * 
     * <p>If the argument is {@code null}, then the string {@code "null"} is printed, otherwise the object's string
     * value {@code obj.toString()} is printed.
     *
     * @param object the {@code Object} to be printed
     * @see   String#valueOf(Object)
     */
    public static void printLine(final Object object) {
        System.out.println(object);
    }

    /**
     * Prints an array of characters and then terminate the line.
     * 
     * <p>If the argument is {@code null}, then a {@code NullPointerException} is thrown, otherwise the value of {@code
     * new String(charArray)} is printed.
     * 
     * @param charArray an array of chars to be printed
     * @see   String#valueOf(char[])
     */
    public static void printLine(final char[] charArray) {
        /*
         * Note: This method's sole purpose is to ensure that the Terminal-class behaves exactly as
         * System.out regarding output. (System.out.println(char[]) calls String.valueOf(char[])
         * which itself returns 'new String(char[])' and is therefore the only method that behaves
         * differently when passing the provided parameter to the System.out.println(Object)
         * method.)
         */
        System.out.println(charArray);
    }

    /**
     * Reads a line of text. A line is considered to be terminated by any one of a line feed ('\n'), a carriage return
     * ('\r'), or a carriage return followed immediately by a linefeed.
     *
     * @return a {@code String} containing the contents of the line, not including any line-termination characters, or
     *         {@code null} if the end of the stream has been reached
     */
    public static String readLine() {
        try {
            return IN.readLine();
        } catch (final IOException e) {
            /*
             * The IOException will not occur during tests executed by the praktomat, therefore the
             * following RuntimeException does not have to get handled.
             */
            throw new RuntimeException(e);
        }
    }

    /**
     * Reads the file with the specified path and returns its content stored in a {@code String} array, whereas the
     * first array field contains the file's first line, the second field contains the second line, and so on.
     *
     * @param  path the path of the file to be read
     * @return the content of the file stored in a {@code String} array
     */
    public static String[] readFile(final String path) {
        try (final BufferedReader reader = new BufferedReader(new FileReader(path))) {
            return reader.lines().toArray(String[]::new);
        } catch (final IOException e) {
            /*
             * You can expect that the praktomat exclusively provides valid file-paths. Therefore
             * there will no IOException occur while reading in files during the tests, the
             * following RuntimeException does not have to get handled.
             */
            throw new RuntimeException(e);
        }
    }
}


147
0
задан 31 января 2018 в 03:01 Источник Поделиться
Комментарии
2 ответа

Если вы хотите method короче, рефакторинг его для вызова других методов. Е. Г.

public void processInput() {
String[] parts = Terminal.readLine().split(" ");
if (parts[0].startsWith("add-team")) {
addTeam(parts[1].split(";"));

}

if (parts[0].equals("list-team")) {
for (Team t : teams) {
if (t != null) {
Terminal.printLine(t.getId() + " " + t.getTeamName());
}
}
}

if (parts[0].equals("add-ice-hockey-match")) {
addMatch(parts[1].split(";"));
}

if (parts[0].equals("print-del-standings")) {
}
}

Сейчас processInput заменяет смутно имени method. Он знает, как получить следующую строку входных данных и как процесс первой части. Он делегирует обработку любых вторую часть с другими методами на основе результатов первой части.

Вы также можете делегировать на список-команды, но я не нашел, что надо.

Я переписала for петли можно использовать цикл foreach/спектр-форм. Вы могли бы также назвать t teamно некоторые считают, что наличие переменных по имени team и teams запутанным. Поскольку вы никогда не используете i ничего, кроме разыменования teamsэто было естественным для преобразования.

Также рассмотреть вопрос о создании toString для Team. Затем ты можешь использовать это, и будьте уверены, последовательного отображения.

Рассмотрите возможность использования switch в процессе parts[0]. Или использовать if/else if структура. Как это, он будет стараться соответствовать даже после того, как найдено совпадение. Хотя if условия являются взаимоисключающими.

1
ответ дан 31 января 2018 в 09:01 Источник Поделиться

Первое, что вы можете сделать, это то, что @mdfst13 сказать : "делегаты обработки любых вторую часть с другими методами"

Если вы хотите иметь более чистый код, вы можете ввести Command и CommandParser что разобрать InputStream для создания Command что вы выполняете на свой HockeySystem.

Некоторые используют аннотации на методы или использовать Соглашения об именовании (и преобразования). Я сделал простое приложение с этой идеей несколько лет назад. Она написана на Java, но основная идея проста для понимания :

if ( args.length>0 ) {
val command = args(0) // he first argument is the command
val arguments = args.drop(1) // The command parameters
getClass.getMethod(command, arguments.getClass)
.invoke(this, arguments)
} else {
help(Array(""))
}

// Each "command" method has the name of the command and expect an array of string for parameters

def list(args:Array[String]) {
// ...
}

def add(args:Array[String]) {
val team = args(1)
val text = args.drop(2).mkString(" ")
val res = // Execute
println(s"Ok (#${res.id.toString})")
}

Это простой, но работает хорошо.

На основе этой идеи можно создать класс, чтобы преобразовать строку в метод. Так что вы двигаетесь в анализе логики от вашей бизнес-логики. Можно продолжить эту мысль, перемещая аргумент парсинга (new Team(Integer.parseInt(parts2[0]), parts2[1])) в специальный класс (адаптер шаблон), который будет просто разобрать строку, чтобы создать ваш домен объекты и вызов бизнес-логики на HockeySystem.

(Вы можете увидеть результат на https://github.com/gervaisb/stackexchange-codereview/tree/q186449/src/main/java/q186449)

0
ответ дан 1 февраля 2018 в 08:02 Источник Поделиться