<somethirdpartyclass> Util ==上帝对象?

时间:2015-08-14 01:32:05

标签: java selenium design-patterns decorator god-object

我使用Selenium Webdriver a lot,并且有很多&#34;实用程序&#34;我写的方法是为了让我更容易使用。我将这些类放在WebDriverUtil类中,现在该文件超过1,200行。 WebDriverUtil中的每个方法都试图将我与使用WebDriver分开,因为我使用了很多不会DRY继续写作的东西。

例如,这是我将放入WebDriverUtil的方法。

public void waitUntilVisible(final WebElement webElement) {
    new WebDriverWait(webDriver, 10).until(new Predicate<WebDriver>() {
        @Override
        public boolean apply(WebDriver webDriver) {
            return webElement.isDisplayed();
        }
    });
}

如果我有1,200行代码充满了这样的方法,我有God object吗?如果是这样,我该怎么办呢?

我应该将我的行为分成这样的装饰者类吗?

public class WebElementDecorator implements WebElement {
    private WebElement webElement;
    private final WebDriver webDriver;

    public WebElementDecorator(WebElement webElement, WebDriver webDriver) {
        this.webElement = webElement;
        this.webDriver = webDriver;
    }

    public void waitUntilVisible() {
        new WebDriverWait(webDriver, 10).until(new Predicate<WebDriver>() {
            @Override
            public boolean apply(WebDriver webDriver) {
                return webElement.isDisplayed();
            }
        });
    }

    public void click() {
        webElement.click();
    }

    //... other WebElement methods
}

1 个答案:

答案 0 :(得分:1)

  

如果我有1,200行代码充满了这样的方法,我有一个神对象吗?

单独的代码行数并不足以说明一个类是否与神一样。由于编码风格错误,过度工程化,过度专业化方法的不同变体,冗长的语言,内联评论等,一个类可能会被代码膨胀。

神级是一个充满责任的神。以下是两个试金石测试,以确定您的util类是否已演变为神类:

  1. 更改测试时对util类的影响。如果对测试子集的更改导致您经常更改和重新编译您的util类,那么这可能表明您的util类正在为太多主服务器提供服务。理想的情况是,对测试子集的更改只会影响与测试直接相关的那些util方法(如果需要)。

  2. 更改util类时对测试类的影响。如果更改util类的一部分导致许多不相关的测试中出现意外故障,那么您的util类可能会在测试中传播其触角。

  3.   

    如果是这样,我该如何解决?我应该将我的行为分成这样的装饰者类吗?

    最好以小的渐进步骤开始重构。使用您的代码示例,我将首先将所有Wait..Until..Predicate代码提取到一个名为WaitUntilEvent()的单独类中,或使用isVisible()isEnabled(),{{1示例用法如下所示:

    isSelected()

    如果我需要在WaitUntilEvent waitUntil = new WaitUntilEvent(webElement, webDriver); waitUntil.isVisible(); webElement.click(); // etc.. 附近更改我的测试要求(例如超时间隔),我知道只有一个类可以编辑。然后可以将其进一步重构为Wait..Until..Predicateuntil(PredicateIsTrue).then(PerformAction)等。我更喜欢这种方法,而不是一个包罗万象的神似until(FunctionIsTrue).then(PerformAction),它可能最终会有许多装饰方法捕获许多不同的的行为。