Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何重构此Java代码,使其更加枯燥?_Java - Fatal编程技术网

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

如何重构此Java代码,使其更加枯燥?,java,Java,在脚本化/动态语言中,这似乎很简单。。。然而,Java中似乎不是这样,或者我只是缺少了一些东西 这是我目前的代码: switch (selectedModel) { case "author": switch (selectedAction) { case "create": AuthorController.create(); break; case "re

在脚本化/动态语言中,这似乎很简单。。。然而,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”的情况,我必须重复所有相同的代码。我认为有更好的方法。

为所有公共类(
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
 }

当使用静态方法时,您不能这样做。创建一个接口:

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

使用某种工厂模式可以消除外部开关。 和使用某种策略模式的嵌套开关

下面是粗略的实现(我希望您使用的是Java8+)

public void someServiceMethod(字符串选择模型、操作选择操作、字符串输入){
ActionController=ActionControllerFactory.forModel(selectedModel);
选择Action.accept(控制器,输入);
}
公共接口操作控制器{
void create();
无效读取(字符串id);
无效更新(字符串id);
无效销毁(字符串id);
}
公共枚举操作实现双消费者{
创造{
@凌驾
公共void接受(ActionController控制器,字符串输入){
controller.create();
}
},
阅读{
@凌驾
公共void接受(ActionController控制器,字符串输入){
控制器。读取(输入);
}
},
更新{
@凌驾
公共void接受(ActionController控制器,字符串输入){
控制器。更新(输入);
}
},
毁灭{
@凌驾
公共void接受(ActionController控制器,字符串输入){
控制器。销毁(输入);
}
}
}

如果所有案例都做相同的事情,那么为什么会有案例呢?它们并不是对所有案例都做相同的事情。那么不同的案例又有什么不同呢?你所说的是,你必须为下一个案例重复所有相同的代码是的,除了BookController而不是AuthorController。相似,但不完全相同。制作一个接口。
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);
    }
  }
}