ฉันพยายามเขียน servlet ซึ่งทำงานตามค่า "การกระทำ" ที่ส่งผ่านไปเป็นอินพุต
นี่คือตัวอย่างที่
public class SampleClass extends HttpServlet {
public static void action1() throws Exception{
//Do some actions
}
public static void action2() throws Exception{
//Do some actions
}
//And goes on till action9
public void doPost(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException {
String action = req.getParameter("action");
/**
* I find it difficult in the following ways
* 1. Too lengthy - was not comfortable to read
* 2. Makes me fear that action1 would run quicker as it was in the top
* and action9 would run with a bit delay - as it would cross check with all the above if & else if conditions
*/
if("action1".equals(action)) {
//do some 10 lines of action
} else if("action2".equals(action)) {
//do some action
} else if("action3".equals(action)) {
//do some action
} else if("action4".equals(action)) {
//do some action
} else if("action5".equals(action)) {
//do some action
} else if("action6".equals(action)) {
//do some action
} else if("action7".equals(action)) {
//do some action
} else if("action8".equals(action)) {
//do some action
} else if("action9".equals(action)) {
//do some action
}
/**
* So, the next approach i tried it with switch
* 1. Added each action as method and called those methods from the swith case statements
*/
switch(action) {
case "action1": action1();
break;
case "action2": action2();
break;
case "action3": action3();
break;
case "action4": action4();
break;
case "action5": action5();
break;
case "action6": action6();
break;
case "action7": action7();
break;
case "action8": action8();
break;
case "action9": action9();
break;
default:
break;
}
/**
* Still was not comfortable since i am doing un-necessary checks in one way or the other
* So tried with [reflection][1] by invoking the action methods
*/
Map<String, Method> methodMap = new HashMap<String, Method>();
methodMap.put("action1", SampleClass.class.getMethod("action1"));
methodMap.put("action2", SampleClass.class.getMethod("action2"));
methodMap.get(action).invoke(null);
/**
* But i am afraid of the following things while using reflection
* 1. One is Security (Could any variable or methods despite its access specifier) - is reflection advised to use here?
* 2. Reflection takes too much time than simple if else
*/
}
}
ทั้งหมดที่ฉันต้องการคือการหลีกเลี่ยงจากมากเกินไปถ้า / else- ถ้าการตรวจสอบในรหัสของฉันสำหรับการอ่านที่ดีขึ้นและการบำรุงรักษารหัสที่ดีขึ้น ดังนั้นลองสำหรับทางเลือกอื่น ๆ เช่น
1. สลับตัวพิมพ์ - ยังคงตรวจสอบมากเกินไปก่อนที่จะทำการกระทำของฉัน
2. การสะท้อนกลับ
i] สิ่งสำคัญประการหนึ่งคือความปลอดภัย - ซึ่งช่วยให้ฉันสามารถเข้าถึงแม้กระทั่งตัวแปรและวิธีการภายในชั้นเรียนแม้จะมีตัวระบุการเข้าถึง - ฉันไม่แน่ใจว่าสภาพอากาศฉันสามารถใช้มันในรหัสของฉันได้อย่างไร
ii] และอีกอย่างหนึ่งคือใช้เวลานานกว่าการตรวจสอบ if / else-if แบบง่าย
มีวิธีใดที่ดีกว่าหรือมีการออกแบบที่ดีกว่าบางคนสามารถแนะนำให้จัดระเบียบโค้ดข้างต้นด้วยวิธีที่ดีกว่าหรือไม่?
แก้ไข
ผมได้เพิ่มคำตอบสำหรับข้อมูลโค้ดข้างต้นพิจารณาดังต่อไปนี้คำตอบ
แต่ถึงกระนั้นคลาสต่อไปนี้ "ExecutorA" และ "ExecutorB" ทำโค้ดเพียงไม่กี่บรรทัด เป็นการดีที่จะเพิ่มพวกเขาเป็นคลาสมากกว่าการเพิ่มเป็นวิธีการหรือไม่? กรุณาแนะนำในเรื่องนี้