लिपिबद्ध/गतिशील भाषाओं में ऐसा लगता है कि यह सरल और आसान होगा... हालांकि जावा में ऐसा नहीं लगता है, या मुझे बस कुछ याद आ रहा है।

यहाँ मेरा कोड वर्तमान में है:

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...

मुझे "पुस्तक" के मामले में फिर से वही कोड दोहराना होगा। मुझे लगता है कि एक बेहतर तरीका है।

0
Blaine Lafreniere 28 सितंबर 2019, 22:30
1
अगर सभी मामले एक ही काम करते हैं तो फिर मामले क्यों?
 – 
GBlodgett
28 सितंबर 2019, 22:30
वे सभी मामलों के लिए एक ही काम नहीं कर रहे हैं।
 – 
Blaine Lafreniere
28 सितंबर 2019, 22:31
फिर वे मामले से अलग कैसे हैं? आप केवल इतना कहते हैं कि आपको अगले मामले के लिए सभी समान कोड दोहराना होगा
 – 
GBlodgett
28 सितंबर 2019, 22:32
हां, लेखक नियंत्रक के बजाय बुककंट्रोलर को छोड़कर। समान, लेकिन बिल्कुल समान नहीं।
 – 
Blaine Lafreniere
28 सितंबर 2019, 22:33
1
शायद एक इंटरफेस बनाओ।
 – 
Goion
28 सितंबर 2019, 22:33

3 जवाब

आप स्थैतिक तरीकों का उपयोग करते हुए ऐसा नहीं कर सकते। एक इंटरफ़ेस बनाएँ:

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);
}
4
Andreas 28 सितंबर 2019, 22:41

सभी सामान्य वर्गों के लिए एक सामान्य इंटरफ़ेस बनाएँ (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
 }
2
GBlodgett 28 सितंबर 2019, 22:35

किसी प्रकार के फ़ैक्टरी पैटर्न का उपयोग करके बाहरी स्विच को समाप्त करना संभव है। और नेस्टेड स्विच एक तरह की रणनीति पैटर्न का उपयोग कर।

नीचे मोटे तौर पर कार्यान्वयन (मुझे आशा है, आप जावा 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);
    }
  }
}
0
Mikhail Dudin 29 सितंबर 2019, 00:23