Как заменить коммутатор на OOP - PullRequest
1 голос
/ 17 февраля 2020

У меня есть методы, с помощью которых я получаю данные из базы данных. В зависимости от переменной, которую пользователь ввел через консоль, я должен выполнить нужный метод

       while (flag) {
           try {
               sw = new ScannerWrapper();
               menuHeader();
               int choice = sw.readInt();
               switch (choice) {
                   case 1:
                       System.out.println("Input first name: ");
                       String name = sw.readLine().toUpperCase();
                       printResults(DataParser.getFilmByName(name));
                       break;
                     case 0:
                       System.out.println("Bye-bye. Come again");
                       flag = false;
                       break;
                   default:
                       System.out.println("Please enter correct number");
               }
           } catch (Exception e) {
               System.out.println("Enter correct data");
           } finally {
               DBConnector.getInstance().closeConnection();
           }
       }

Этот код очень плохой. Существует более 5 случаев с методами, и код становится избыточным

1 Ответ

6 голосов
/ 17 февраля 2020

Вы должны взглянуть на шаблон проектирования Strategy. Это позволит вам абстрагировать логику c, связанную с действием.

Кроме того, вы хотите заменить переключатель, чтобы найти правильную стратегию в соответствии с входной переменной. Это работа шаблона проектирования Factory, который в вашем случае возвращает одну из различных стратегий в соответствии со значением базы данных.

В основном:

interface UserAction { 
    public void execute();
}

class ListMovies implements UserAction { 
    public void execute() {
        // List the movies
    }
}

class ExitProgram implements UserAction { 
    public void execute() {
        // Kill kenny
    }
}

class Noop implements UserAction { 
    public void execute() {
        // Do nothing
    }
}

И фабрика:

class UserActionFactory {
    public UserAction make(int actionId) {
        switch (actionId) {
            0: return new ListMovies();
            1: return new ExitProgram();
            default: return new Noop();
        }
    }
}

Что позволяет:

UserActionFactory factory = new UserActionFactory();
ScannerWrapper sw = new ScannerWrapper();

while (true) {
    menuHeader();
    int choice = sw.readInt();
    UserAction action = factory.make(choice);
    action.execute();

}

Это также может быть шаблон проектирования Command, в зависимости от того, как вы называете вещи и создаете экземпляры объектов для остальные классы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...