मेरे पास वर्तमान में एक क्लंकी विधि है जो एक स्ट्रिंग सरणी लेगा जिसमें विधि नाम और पैरामीटर शामिल हैं:

String []wf = {"sobel(10,1)","sobel2(2,2)","sobelMax(sobel,100,10)"};

यह बताता है कि पास करने के लिए पैरामीटर के साथ किस विधि को कॉल करना है। हालाँकि जैसा कि आप देख सकते हैं कि सभी विधियाँ समान संख्या में मापदंडों का उपयोग नहीं करती हैं और सभी पैरामीटर प्रकार समान नहीं हैं, कुछ कुछ इनट्स और कुछ PImage प्रकार तैरते हैं।

वर्तमान में इसे इस फ़ंक्शन में पास किया जाता है, जो स्ट्रिंग्स को ट्रिम करता है और उपयोगी जानकारी निकालता है। फिर अगले भाग को सर्वोत्तम तरीके से संभालने के लिए एक स्विच केस के माध्यम से पैरामीटर लंबाई पास करता है।

void workflow(String[] a){
String[] s = a;

for(int i=0;i<s.length;i++){
  String s1 = s[i];
  
  int [] pIndex = strIndex1(s1,"(",")");
  String function = s1.substring(0,pIndex[0]);
  
  String[]parameters = splitTokens(s[i].substring(pIndex[0]+1,pIndex[1]),",");
  print("p",function ,"(");
  for(int j=0;j<parameters.length;j++){
     print(parameters[j]);
     if(j<parameters.length-1)print(",");
  }
  println(")");
  
  switch(parameters.length){
    
    case 1: func1(function,int(parameters[0]));
            println("c1");
            break;
    case 2: if(float(parameters[0])>-1000000&&float(parameters[0])<100000000){
              func2(function,float(parameters[0]),int(parameters[1]));
              println("c2");
            }else {
               Field field = null;
              
               try{
               field = this.getClass().getField(parameters[0]);
               func2(function,field,int(parameters[1]));
               }catch (NullPointerException e){
                println("np c2");
               }catch (NoSuchFieldException e) {
                 println("nsf c3");
               }
            }
            break;
    case 3: 
            if(float(parameters[0])>-1000000&&float(parameters[0])<100000000){
              func3(function,float(parameters[0]),float(parameters[1]),int(parameters[2]));
              println("c2");
            }else {
               Field field = null;
              
               try{
               field = this.getClass().getField(parameters[0]);
               //Object.value = field.
               PImage p = (PImage)field.get(this);
               func3(function,p,float(parameters[1]),int(parameters[2]));
               }catch (NullPointerException e){
                println("np c3");
               }catch (NoSuchFieldException e) {
                 println("nsf c3");
               }catch (IllegalAccessException e) {
                 println("ia c3");
               }
               
            }
    
    println("c3");
    break;
    //func3(function,parameters);
    //case 3: func4(function,parameters);
    
  }
}
  

};

अंत में स्विच स्टेटमेंट एक फ़ंक्शन के अनुसार विधियों और मापदंडों को रूट करता है जो कक्षा में सही विधि से मेल खाने में सक्षम होगा।

void func1(String function,int p){
println(function,p);
Method method = null;
  try {
    method = this.getClass().getMethod(function,int  .class);
    println(method);
    method.invoke(this, p);
    //println("result",result);
  } catch (SecurityException e) {
    println(function , "se f1");
  }catch (NoSuchMethodException e) {  
    println(function , "nsm f1");
  }
  catch (IllegalAccessException e) {  
    println(function , "ia f1");
  }
  catch (InvocationTargetException e) {  
    println(function , "it f1");
  }

};

क्या कोई तरीका है जिससे मैं इस कोड को संघनित कर सकता हूं और शायद स्विच केस स्टेटमेंट से दूर हो सकता हूं क्योंकि यह सब बहुत बोझिल दिखता है और केवल आकार में अधिक पैरामीटर बढ़ता है।

बहुत धन्यवाद

1
Paul Goux 13 सितंबर 2020, 06:47

1 उत्तर

सबसे बढ़िया उत्तर

switch को से बदलने का प्रयास करें

Class<?>[] parameterClasses = new Class<?>[parameters.length];
Object[] parsedParameters = new Object[parameters.length];
for (int j = 0; j < parameters.length; j++) {
    parameterClasses[j] = getParameterClass(parameters[j]);
    parsedParameters[j] = parseParameter(parameters[j]);
}
try {
    Method method = this.getClass().getMethod(function, parameterClasses);
    method.invoke(this, parsedParameters);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
    throw new RuntimeException(e);
}

कहां

Object parseParameter(String parameter) {
    try {
        return Integer.parseInt(parameter);
    } catch(NumberFormatException e) {
        try {
            return Float.parseFloat(parameter);
        } catch(NumberFormatException e1) {
            try {
                Field field = this.getClass().getField(parameter);
                return field.get(this);
            } catch (NoSuchFieldException | IllegalAccessException e2) {
                throw new RuntimeException(e2);
            }
        }
    }
}

Class<?> getParameterClass(String parameter) {
    try {
        Integer.parseInt(parameter);
        return int.class;
    } catch(NumberFormatException e) {
        try {
            Float.parseFloat(parameter);
            return float.class;
        } catch(NumberFormatException e1) {
            return PImage.class;
        }
    }
}
1
Dmytro Mitin 13 सितंबर 2020, 12:13