如何重构此Java代码,使其更加干燥?

时间:2019-09-28 19:30:04

标签: java

在脚本/动态语言中,这似乎很简单……但是在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...

对于“ book”,我将不得不再次重复所有相同的代码。我认为有更好的方法。

3 个答案:

答案 0 :(得分:4)

使用静态方法不能执行此操作。创建一个界面:

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);
}

答案 1 :(得分:2)

为所有公共类(可能是sudo docker-compose up)创建一个公共接口,然后执行以下操作:

Controller

答案 2 :(得分:0)

可以使用某种Factory模式消除外部开关。 并使用一种策略模式来嵌套开关。

下面的粗略实现(希望您使用的是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);
    }
  }
}