我一直在读Robert C. Martin的干净代码并研究可靠的原理,我在课堂上注意到了一些这样的代码:
@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
并使用接口引用作为参数,但页面可以提供多个链接,每个链接添加一个接口?似乎过度了
此外,我们非常感谢任何关于改进代码的建议。
谢谢
答案 0 :(得分:0)
这是您可以做的事情概念的证明。这段代码不会按原样编译。您可能希望根本不需要依赖注入,并在初始化时在HyperLinkActivity中创建DriverTabHelper。
我建议使用Google搜索:"重构切换语句"
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();
}
}