Как я могу поменять этот оператор switch в полиморфный подход? - PullRequest
0 голосов
/ 12 мая 2018

Я читал чистый код Роберта С. Мартина и изучал твердые принципы, я заметил в своем классе такой код:

@When("^they click the (.*) hyperlink$")
public void the_browser_opens_a_new_hyperlink(String link) {
    Runnable aSyncTask = null;
    switch (link.toLowerCase()) {
        case "cookie":
            aSyncTask =
                    () -> {
                        {
                            loginPage.openCookieInformationPage();
                            loginPage.switchToNewestTab();

                        }
                    };
            break;
        case "privacy policy":
            aSyncTask =
                    () -> {
                        {
                            loginPage.openPrivacyPolicyInformationPage();
                            loginPage.switchToNewestTab();
                        }
                    };
            break;
        case "report a problem":
            aSyncTask =
                    () -> {
                        {
                            loginPage.openReportAProblemPage();
                            loginPage.switchToNewestTab();
                        }
                    };
            break;
    }
    driverTabHelper.execAsyncTaskThatLaunchesATab(Objects.requireNonNull(aSyncTask, "invalid link specified"));
}

Это явное нарушение принципа открытого / закрытогопотому что чем больше ссылок я добавляю, мне придется продолжать модифицировать этот метод, чтобы учесть их.

Как вы можете видеть, loginPage в настоящее время предоставляет 3 разные ссылки в виде строк для этого метода, однако будет большеобъекты, передающиеся в ссылках на более позднем этапе.

Как мне переписать это для полиморфизма?Я подумал, может быть, страницы (ы) реализуют IOpenHyperlink и используют ссылку на интерфейс в качестве аргумента, но страницы могут предоставить несколько ссылок, добавить интерфейс для каждой ссылки?Кажется чрезмерным

Также очень ценятся любые советы по улучшению кода здесь.

Спасибо

1 Ответ

0 голосов
/ 12 мая 2018

Это доказательство того, что вы могли бы сделать.Этот код не скомпилируется как есть.Вы можете вообще не использовать внедрение зависимостей и создавать DriverTabHelper внутри HyperLinkActivity при его инициализации.

Я рекомендую поискать в Google: «рефакторинг операторов switch»

abstract class HyperLinkActivity {
    private DriverTabHelper driverTabHelper;

    public HyperLinkActivity(DriverTabHelper driverTabHelper) {
        this.driverTabHelper = driverTabHelper;
    }

    public void startTask() {
        Runnable aSyncTask = () -> { implementation() }
        driverTabHelper.execAsyncTaskThatLaunchesATab(Objects.requireNonNull(aSyncTask, "invalid link specified"));
    }

    abstract void implementation();
}

class CookieHyperLink extends HyperLinkActivity {
    public void implementation() {
        loginPage.openCookieInformationPage();
        loginPage.switchToNewestTab();
    }
}

class HyperlinkService {
    private DriverTabHelper driverTabHelper;

    public void HyperLinkService(DriverTabHelper driverTabHelper) {
        this.driverTabHelper = driverTabHelper;
    }


    public void createCookieActivity() {
        CookieHyperLink cookieHyperLink = new CookieHyperLink(driverTabHelper);
        handleHyperLinkTask(cookieHyperLink);
    }

    public void handleHyperLinkTask(HyperLinkActivity hyperLinkActivity) {
        hyperLinkActivity.startTask();
    }
}
...