2016-08-01 51 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; 
    }); 
}