Помогите с выходом из if / elses? - PullRequest
0 голосов
/ 22 февраля 2011

Я пишу протокол класса, который включает в себя много if / elses .. вот класс:

public class Protocol {
    Scanner scan = new Scanner(System.in);
    private static final int WAITING = 0;
    private static final int SENTREQUEST = 1;
    private static final int SENTITEMS = 2;
    private static final int ANOTHER = 3;
    private static final int CHOICE = 4;
    private int choice;

    private int state = WAITING;



    public String processInput(String theInput) {
        String theOutput = null;

        if (state == WAITING) {
            theOutput = "Do you accept the terms of agreement? Y/N?";
            state = SENTREQUEST;
        } else if (state == SENTREQUEST) {
            if (theInput.equalsIgnoreCase("y")) {

              theOutput = ": 1. program file 2. pictures 3. documentation";
              state = CHOICE;
             } else {
                theOutput = "Invalid Input!";
                state = SENTITEMS;

            }

        }
        else if (state == CHOICE) {
            choice = scan.nextInt();
            switch(choice) {
                case 1: theOutput = "show something";
                break;
                case 2: theOutput = "show something";
                break;
                case 3: theOutput = "show something";
                break;
            }
        }
        else if (state == SENTITEMS) {

              theOutput = "Want another? (y/n)";
                state = ANOTHER;

        } else if (state == ANOTHER) {

              theOutput = "Do you accept the terms of agreement? Y/N?";

            if (theInput.equalsIgnoreCase("y")) {
                theOutput ="test";
                state = SENTREQUEST;
            } else {
                theOutput = "Bye.";
                state = WAITING;
            }
        }
        return theOutput;
    }
}

Это не доходит до случая коммутатора, и я уверен, что этопроблема правильного выхода из условий if / elses, но я не могу найти проблему.

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Чтобы решить аналогичную проблему, я однажды реализовал шаблон стратегии в качестве перечисления. Для каждой стратегии вы создаете новое значение для перечисления, инкапсулируя код в методе перечисления:

public enum Strategy {

    FIRST_STRATEGY {
        public String process(String input) {
            // Implementation for first strategy
            return null;
        }       
    },

    SECOND_STRATEGY {
        public String process(String input) {
            // Implementation for second strategy
            return null;
        }       

    };

    public abstract String process(String input);

}

Вы можете применить выбранную стратегию в зависимости от значения перечисления, фактически удалив цепочку операторов if / else:

Strategy chosenStrategy = Strategy.FIRST_STRATEGY;
String output = chosenStrategy.process(input);

Это решение, которое я применил для моей проблемы, возможно, оно не является оптимальным или более объектно-ориентированным. Вы должны выбрать правильное решение для вашей проблемы, но я надеюсь, что мой опыт может помочь.

0 голосов
/ 22 февраля 2011

Используйте шаблон State следующим образом:

public class Protocol {
    Scanner scan = new Scanner(System.in);

    private abstract class State { abstract String doit(String theInput); }

    private final class WAITING extends State {
      String doit(String theInput) {
         state = SENTREQUEST;
         return "Do you accept the terms of agreement? Y/N?";
      }
    }

    private final class SENTREQUEST extends State {
      String doIt(String theInput) {
        if (theInput.equalsIgnoreCase("y")) {
              state = CHOICE;
              return ": 1. program file 2. pictures 3. documentation";
             } else {
                state = SENTITEMS;
                return "Invalid Input!";
            }
      }
    }

 //TODO refactoring to State classes for all
 //        private static final int SENTITEMS = 2;
 //        private static final int ANOTHER = 3;
 //        private static final int CHOICE = 4;*/
    private int choice;

    private State state = WAITING;



    public String processInput(String theInput) {
        return state.doIt(theInput);
    }
}
...