Должен ли я использовать шаблон - PullRequest
0 голосов
/ 26 сентября 2018

Итак, я получаю строку из twitch irc и на основании этой команды выполняю некоторый код.Вопрос в том, могу ли я упростить свой код или использовать шаблон.Дело в том, что большинство команд имеют одинаковый код, и меняется только ответ.Вы можете увидеть код ниже.Это выглядит очень грязно, и добавление новых команд или функций, вероятно, будет проблемой (если у меня есть 200 или более команд), плюс большая часть кода такая же.

public void onCommand(User user, Channel channel, String command)
    {

        // some if statements 

        switch (command.toLowerCase()){
        case "hi":{

            //some simple action
        }
        case "fire":{

            vote(60, channel, "fire")
        }
        ...

        //timeout
    }

    void vote(int duration, final Channel channel, String voteFor){
        Timer timer = new Timer();

        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                //start voting
            }, duration);

            switch (voteFor){
                case "fire":{
                    if (voteYes > voteNo) {
                        //some action
                    }else
                        //some action
                    break;
                }
                ...
    }  

PS Я пытался использовать шаблон стратегии, ноказалось, что в этом нет необходимости.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Использовать карту:

class CommandProcessor {

  interface Command {
    String executeForKey();
    void execute(User user, Channel channel);
  }

  class OnFireCommand implements Command {
    public String executeForKey() { return "fire"; }
    public void execute() {}
  }

  Map<String, Command> map = new HashMap<>();

  CommandProcessor() {
    // this will become a simple listing of commands
    put(new OnFireCommand())
  }

  void put(Command c) {
    map.put(c.executeForKey(), c);
  }

  public void onCommand(User user, Channel channel, String command) {
    this.map.get(command).execute(user, channel);
  }
}
0 голосов
/ 26 сентября 2018

Вы можете определить интерфейс, скажем Command

public interface Command {

    void execute(User user, Channel channel);

}

Затем создать карту из имен команд в фактические команды.

Map<String, Command> commands;

Вы можете заполнить карту следующим образом

commands.put("fire", (user, channel) -> {/** Do something with user and channel **/})

Тогда для вашего onCammnd вы можете сделать

commands.get(command.toLowerCase()).execute(user, channel);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...