Ben girdi olarak geçti "eylem" değerine dayalı görev yapan bir sunucu uygulaması yazmaya çalışıyorum.
İşte örneği
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
*/
}
}
Tüm ihtiyacım çok fazla if / else-if daha iyi okunabilirlik ve daha iyi kod bakım için kodumu denetler kaçmak etmektir. Bu yüzden diğer alternatifler için denendi
1. durum değiştirme - yine de benim eylem yapmadan önce çok fazla kontrol yapar
2. yansıma
i] bir ana şey güvenlik - erişim belirtecine rağmen sınıftaki değişkenlere ve yöntemlere bile erişmeme izin veriyor - hava kodumda kullanabileceğimden emin değilim
ii] ve diğeri ise basit if / else-if kontrollerinden daha uzun zaman alıyor
Yukarıdaki kodun daha iyi bir şekilde düzenlenmesini önerebilecek daha iyi bir yaklaşım veya daha iyi bir tasarım var mı?
REDAKTE
Aşağıdaki cevabı dikkate alarak yukarıdaki pasaj için cevabı ekledim .
Ama yine de, aşağıdaki "ExecutorA" ve "ExecutorB" sınıfları sadece birkaç satır kod yapar. Bunları sınıf olarak eklemek, yöntem olarak eklemekten daha iyi bir uygulama mudur? Lütfen bu konuda bilgi verin.