Как я могу реорганизовать этот Java-код, чтобы он был более СУХИМ? - PullRequest
0 голосов
/ 28 сентября 2019

В скриптовых / динамических языках это кажется простым и легким ... однако в Java это не так, или я просто что-то упускаю.

Вот мой код в настоящее время:

switch (selectedModel) {
     case "author":
        switch (selectedAction) {
            case "create":
                AuthorController.create();
                break;
            case "read":
                AuthorController.read(promptForID());
                break;
            case "update":
                AuthorController.update(promptForID());
                break;
            case "destroy":
                // AuthorController.destroy(promptForID());
                break;
        }
        break;
    case "book":
        // now I have to repeat all the same code...

Я собираюсь повторить все тот же код снова для случая «книга».Я думаю, что есть лучший способ.

Ответы [ 3 ]

4 голосов
/ 28 сентября 2019

Вы не можете сделать это при использовании статических методов.Создайте интерфейс:

public interface CrudController {
    void create();
    void read(String id);
    void update(String id);
    void destroy(String id);
}

Теперь все контроллеры реализуют этот интерфейс, и ваш код становится:

CrudController controller;
switch (selectedModel) {
    case "author":
        controller = new AuthorController();
        break;
    case "book":
        controller = new BookController();
        break;
    ...
    default:
        throw new IllegalArgumentException("Unknown model: " + selectedModel);
}

switch (selectedAction) {
    case "create":
        controller.create();
        break;
    case "read":
        controller.read(promptForID());
        break;
    case "update":
        controller.update(promptForID());
        break;
    case "destroy":
        // controller.destroy(promptForID());
        break;
    default:
        throw new IllegalArgumentException("Unknown action: " + selectedAction);
}
2 голосов
/ 28 сентября 2019

Создайте общий интерфейс для всех общих классов (возможно, Controller), а затем выполните:

 Controller control;
 switch (selectedModel) {
        case "author":
            control = AuthorController; 
            break;
        case "book":
            control = BookController;
            break;
 }
 switch (selectedAction) {
      case "create":
          control.create();
          break;
      case "read": 
       //etc
 }
0 голосов
/ 29 сентября 2019

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

Примерная реализация ниже (надеюсь, вы используете Java 8+).

public void someServiceMethod(String selectedModel, Action selectedAction, String input) {
  ActionController controller = ActionControllerFactory.forModel(selectedModel);
  selectedAction.accept(controller, input);
}


public interface ActionController {
  void create();
  void read(String id);
  void update(String id);
  void destroy(String id);
}

public enum Action implements BiConsumer<ActionController, String> {
  CREATE {
    @Override
    public void accept(ActionController controller, String input) {
      controller.create();
    }
  },
  READ {
    @Override
    public void accept(ActionController controller, String input) {
      controller.read(input);
    }
  },
  UPDATE {
    @Override
    public void accept(ActionController controller, String input) {
      controller.update(input);
    }
  },
  DESTROY {
    @Override
    public void accept(ActionController controller, String input) {
      controller.destroy(input);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...