2016-08-01 48 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)'动态。你唯一能做的就是让if语句中的条件动态化。但在最后一个例子中,有两条动态行'System.out.println(“test”);如果(“测试”.equals(“测试”))',这根本不会工作。 – martinhh

+0

我改变了我的代码,使其更清楚我的意思。 – Martin

回答

1

传递它的值是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. JDK中的Lambdas 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; 
    }); 
}