【问题标题】:How to work with dynamic code in java method?如何在java方法中使用动态代码?
【发布时间】:2016-08-01 09:20:41
【问题描述】:

我有几乎多余的 java 方法。这些方法的主体总是相同的。只有一两个 java 表达式(java 代码行)不同。我想对这些几乎多余的方法进行代码重构,但我正在寻找最好的方法来做到这一点。这不是那么容易,因为动态代码行。

以下是三个方法,它们的主体相同,但其中包含动态的 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;
}       

那么,如何编写一种方法来设置动态代码行?

【问题讨论】:

  • 我们代码的哪一部分实际上应该是“动态的”?没有办法使if (false == true) 动态化。您唯一能做的就是使 if 语句中的条件动态化。但是在您的最后一个示例中,有两条动态行 System.out.println("test"); if ("test".equals("test")) 这根本行不通。
  • 我更改了代码以更清楚地表达我的意思。

标签: java dynamic methods redundancy


【解决方案1】:

您可以使用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;
    });
}

【讨论】:

    【解决方案2】:

    传递一个布尔参数,其值为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;
      }
      // ...
    }
    

    【讨论】:

    • @Martin 第一次尝试问你想回答的问题。
    【解决方案3】:

    你有几个选择:

    1. 面向方面的编程
    2. 策略设计模式
    3. JDK 8 中的 Lambda。

    我更喜欢最后一个。现在每个人都应该使用 JDK 8。

    我希望像这样的代码行只是仓促写的糟糕的例子,而不是典型的你写的方式:

            if (true == true)
    

    【讨论】:

    • 这只是一个简单的例子来展示我的问题。我的真实代码不一样;)
    【解决方案4】:

    使用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();
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-09
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      相关资源
      最近更新 更多