首页 > 解决方案 > 对象继承 - 重构问题 - 创建灵活服务的可能性

问题描述

这应该很容易,但显然我缺乏基本知识。BugTracking我有一项服务可以在系统中创建票证。创建插件非常简单。有一个接口

public interface BugTracker {
    boolean createAndSendIssue(Issue issue);
    boolean updateAndSendIssue(Issue issue);
    boolean closeIssue(Issue issue);
}

和 JIRA 的 API 客户端:

@Component
public class JiraClient implements BugTracker {
    @Override
    public boolean createAndSendIssue(Issue issue) {
        //Logic for using JIRA REST API
        return false;
    }

    @Override
    public boolean updateAndSendIssue(Issue issue) {
        //Logic for using JIRA REST API
        return false;
    }

    @Override
    public boolean closeIssue(Issue issue) {
        //Logic for using JIRA REST API
        return false;
    }
}

Bugzilla 的 API 客户端:

@Component
public class BugzillaClient implements BugTracker {

    @Override
    public boolean createAndSendIssue(Issue issue) {
        //Logic for using BUGZILLA REST API
        return false;
    }

    @Override
    public boolean updateAndSendIssue(Issue issue) {
        //Logic for using BUGZILLA REST API
        return false;
    }

    @Override
    public boolean closeIssue(Issue issue) {
        //Logic for using BUGZILLA REST API
        return false;
    }
}

Service处理中出现问题MVC。它的一部分看起来像:

@Service
public class BugTrackerService {
    private final BugzillaClient bugzillaClient;
    private final JiraClient jiraClient;
    private static final String JIRA_TYPE = "Jira";
    private static final String BUGZILLA_TYPE = "Bugzilla";

    @Autowired
    BugTrackerService(BugzillaClient bugzillaClient, JiraClient jiraClient) {
        this.bugzillaClient = bugzillaClient;
        this.jiraClient = jiraClient;
    }

    boolean processIssueTicketRequest(Issue issue){
        if ( issue.getBugTrackerType().bugTrackingSystemType.name.equals(JIRA_TYPE)) {
            return jiraClient.createAndSendIssue(issue);
        } else if (issue.getBugTrackerType().bugTrackingSystemType.name.equals(BUGZILLA_TYPE)){
            return bugzillaClient.createAndSendIssue(issue);
        } else {
            return false;
        }
    }
}

是否有可能在BugTrackerService.processIssueTicketRequest没有所有客户端自动装配的情况下创建方法?目前这不是什么大问题,但在与越来越多的系统集成后,这项服务将变得复杂。

标签: javaspringrefactoring

解决方案


根据您希望实现的可重用程度,我可能会将检查给定问题是否匹配输入的逻辑放入接口中,例如

boolean canWorkWithGivenIssue(Issue issue);

有了这些,您就不需要知道您发送的跟踪器的实际类型,只需将它们汇总到列表中即可。如果您使用 @Autowired 注释集合,Spring 将为您执行此操作,在这种情况下,它将为您提供所有具有匹配类型的 bean。您的服务可能看起来像这样

@Autowired List<BugTracker> trackers; //autowired on field for brevity

boolean processIssueTicketRequest(Issue issue){
    for (BugTracker t : trackers)
        if (t.canWorkWithGivenIssue(issue))
            return t.createAndSendIssue(issue);
    return false;
}

推荐阅读