2016-08-01 7 views
2

У меня почти избыточные java-методы. Тело этих методов всегда одно и то же. Только одно или два выражения java (строки java-кода) различаются. Я хочу сделать рефакторинг кода этих почти избыточных методов, но я ищу лучший способ сделать это. Это не так просто, из-за динамических строк кода.Как работать с динамическим кодом в java-методе?

Вот три метода с тем же телом, но с dynmamic кода Java в нем:

public static final boolean doSomething1() { 
    Date date = new Date(); 
    long currentTime = date.getTime(); 
    long maxTime = currentTime + (TIMEOUT * 1000); 

    while (currentTime < maxTime) { 
     try { 
      //START OF MY DYNAMIC CODE 
      //example 1 
      for (WebElement element : list) { 
       if (element.isDisplayed()) { 
        element.click(); 
        return true; 
       }     
      } 
      //END OF MY DYNAMIC CODE 
     } 
     catch (Exception e) { 
      LOG.error("exception"); 
     } 
     currentTime = new Date().getTime(); 
    } 

    return false; 
} 

public static final boolean doSomething2() { 
    Date date = new Date(); 
    long currentTime = date.getTime(); 
    long maxTime = currentTime + (TIMEOUT * 1000); 

    while (currentTime < maxTime) { 
     try { 
      //START OF MY DYNAMIC CODE 
      //example 2 
      for (WebElement webElement : webElementList) { 
       WebElement parent = getParentElement(webElement); 
      } 
      return true; 
      //END OF MY DYNAMIC CODE 
     } 
     catch (Exception e) { 
      LOG.error("exception"); 
     } 
     currentTime = new Date().getTime(); 
    } 

    return false; 
} 

public static final boolean doSomething3() { 
    Date date = new Date(); 
    long currentTime = date.getTime(); 
    long maxTime = currentTime + (TIMEOUT * 1000); 

    while (currentTime < maxTime) { 
     try { 
      //START OF MY DYNAMIC CODE 
      //example 3 
      for (WebElement element : list) { 
       if (element.isDisplayed() && element.getText().equalsIgnoreCase(size)) 
        return true; 
      } 
      //END OF MY DYNAMIC CODE 
     } 
     catch (Exception e) { 
      LOG.error("exception"); 
     } 
     currentTime = new Date().getTime(); 
    } 

    return false; 
}  

Итак, как можно написать один метод с возможностью задания динамических строк кода?

+0

Какая часть нашего кода на самом деле должно быть «динамический»? Невозможно сделать 'if (false == true)' dynamic. Единственное, что вы можете сделать, это сделать условие в динамическом выражении if. Но в последнем экзамене есть две динамические строки 'System.out.println (« test »); if ("test" .equals ("test")), и это не сработает вообще. – martinhh

+0

Я изменил свой код, чтобы сделать его более понятным, что я имею в виду. – Martin

ответ

1

Pass булево параметр, значение которого является первым операндом X == true (который более легко записать в виде X):

public static final boolean doSomething1() { 
    return doSomethingCommon(true); 
} 

public static final boolean doSomething2() { 
    return doSomethingCommon(false); 
} 

private static final boolean doSomethingCommon(boolean param) { 
    // ... 
    if (param) { 
    return true; 
    } 
    // ... 
} 
+0

Я отредактировал мой пост ... – Martin

+1

@Martin попробуйте задать вопрос, который вы хотите ответить в первый раз. –

1

вас есть несколько вариантов:

  1. Аспект ориентированное программирование
  2. Схема разработки стратегии
  3. Lambdas in JDK 8.

Я бы предпочел, чтобы последний. Теперь все должны использовать JDK 8.

Я надеюсь, что строки кода, как это просто наспех плохие примеры, не типичны, как вы пишете:

 if (true == true) 
+0

Это всего лишь простой пример, чтобы показать мою проблему. мой настоящий код не то же самое;) – Martin

1

Используйте Template Method design pattern:

abstract class DynamicImpl { 

    protected abstract boolean doSomethingImpl(); 

    public final boolean doSomething() { 
     Date date = new Date(); 
     long currentTime = date.getTime(); 
     long maxTime = currentTime + (TIMEOUT * 1000); 

     while (currentTime < maxTime) { 
      try { 
       if (doSomethingImpl()) { 
        return true; 
       } 
      } 
      catch (Exception e) { 
       LOG.error("exception"); 
      } 
      currentTime = new Date().getTime(); 
     } 
     return false; 
    } 
} 

С помощью этого класса вместо вас могут выполнять ваши статические методы следующим образом:

private static final DynamicImpl d1 = new DynamicImpl() { 
    protected boolean doSomethingImpl() { 
     return true; 
    } 
}; 

private static final DynamicImpl d2 = new DynamicImpl() { 
    protected boolean doSomethingImpl() { 
     return false; 
    } 
}; 

private static final DynamicImpl d3 = new DynamicImpl() { 
    protected boolean doSomethingImpl() { 
     System.out.println("test") 
     return true; 
    } 
}; 

public static final boolean doSomething1() { 
    return d1.doSomething(); 
} 
public static final boolean doSomething2() { 
    return d2.doSomething(); 
} 
public static final boolean doSomething3() { 
    return d3.doSomething(); 
} 
3

Вы можете использовать Strategy Pattern.

Пример использования BooleanSupplier в качестве стратегии:

private static boolean doSomethingHelper(BooleanSupplier checker) { 
    Date date = new Date(); 
    long currentTime = date.getTime(); 
    long maxTime = currentTime + (TIMEOUT * 1000); 

    while (currentTime < maxTime) { 
     try { 
      if (checker.getAsBoolean()) 
       return true; 
     } 
     catch (Exception e) { 
      LOG.error("exception"); 
     } 
     currentTime = new Date().getTime(); 
    } 

    return false; 
} 

public static boolean doSomething1() { 
    return doSomethingHelper(() -> true); 
} 

public static boolean doSomething2() { 
    return doSomethingHelper(() -> false); 
} 

public static boolean doSomething3() { 
    return doSomethingHelper(() -> { 
     System.out.println("test"); 
     return true; 
    }); 
}