当我使用不同的算法分析数据,但使用相同的算法提取数据时,如何实现存储库?
How to implement a repository when I use different algorithms for analysing data, but the same algorithm for extracting it?
我正在尝试创建一个应用程序,它使用 Jsoup 从不同的网页中提取数据,对其进行分析并获取产品。
有 3 个不同的网页,每个页面分析器 class 实现分析器接口
public interface Analyser {
void setDocument(Document document);
ArrayList<Item> analyseDocument(String searchFor);
}
public class WebPageNumberOne implements Analyser {
@Override
void setDocument(Document document){
//sets document for analysing
}
public ArrayList analyseDocument(String searchFor) {
//returns data from web page number one
}
}
public class WebPageNumberTwo implements Analyser {
@Override
void setDocument(Document document){
//sets document for analysing
}
@Override
public ArrayList analyseDocument(String searchFor) {
//returns data from web page number two
}
}
public class WebPageNumberThree implements Analyser {
@Override
void setDocument(Document document){
//sets document for analysing
}
@Override
public ArrayList analyseDocument(String searchFor) {
//returns data from web page number three
}
}
我还有一个存储库,它采用分析器,使用 Jsoup 获取文档并将其传递给分析器
public class DocumentItemsRepository implements ItemsRepository {
private String searchFor;
private String URL;
private Document document;
private Analyser analyser;
private MainActivityPresenter presenter;
public void setSearchFor(String searchFor) {
this.searchFor = searchFor;
}
public void setURL(String URL) {
this.URL = URL;
}
public void setAnalyser(Analyser analyser) {
this.analyser = analyser;
}
public void setPresenter(MainActivityPresenter presenter){
this.presenter = presenter;
}
@Override
public ArrayList<Item> getItems() {
}
private class GetDocumentAsync extends AsyncTask<String, Void, Document>
{
}
}
在我的演示者中,我有一个方法 loadItems
,它采用存储库实现并通过 setter 注入设置其依赖项并获取项目。
我这样做是因为有时我想将不同的分析器传递给存储库,但是网页内容提取是相同的。
public class MainActivityPresenter {
private MainActivityView mainActivityView;
public MainActivityPresenter(MainActivityView mainActivityView) {
this.mainActivityView = mainActivityView;
}
public void loadItems(String URL, String searchFor, Analyser analyser,
DocumentItemsRepository documentItemsRepository)
{
documentItemsRepository.setAnalyser(analyser);
documentItemsRepository.setSearchFor(searchFor);
documentItemsRepository.setURL(URL);
documentItemsRepository.setPresenter(this);
documentItemsRepository.getItems();
}
}
问题是我无法测试我的 loadItems
方法,因为我使用 setter 注入来注入存储库并且我传递了实现而不是接口。
我如何重构我的代码以使其可测试并变得更清晰?
我是否应该使用构造函数注入设置分析器,初始化不同的存储库,在创建演示者时传递它们并为每个具有不同分析器的存储库创建单独的loadItems
presenter = new MainActivityPresenter(this, new DocumentItemsRepository1(new Analyser1()), new DocumentItemsRepository2(new Analyser2()));
我决定在不依赖存储库的情况下初始化 Presenter。
presenter = new MainActivityPresenter(this);
当尝试使用不同的分析器从不同的网页加载项目时,我将存储库的初始化传递给 loadItems 方法。
presenter.loadItems(new DocumentItemsRepository(new FirstAnalyser(), FirstURL, searchFor ));
presenter.loadItems(new DocumentItemsRepository(new SecondAnalyser(), SecondURL, searchFor ));
这样 loadItems 方法仍然可以测试,我可以在不提供实现的情况下模拟存储库。
我正在尝试创建一个应用程序,它使用 Jsoup 从不同的网页中提取数据,对其进行分析并获取产品。
有 3 个不同的网页,每个页面分析器 class 实现分析器接口
public interface Analyser {
void setDocument(Document document);
ArrayList<Item> analyseDocument(String searchFor);
}
public class WebPageNumberOne implements Analyser {
@Override
void setDocument(Document document){
//sets document for analysing
}
public ArrayList analyseDocument(String searchFor) {
//returns data from web page number one
}
}
public class WebPageNumberTwo implements Analyser {
@Override
void setDocument(Document document){
//sets document for analysing
}
@Override
public ArrayList analyseDocument(String searchFor) {
//returns data from web page number two
}
}
public class WebPageNumberThree implements Analyser {
@Override
void setDocument(Document document){
//sets document for analysing
}
@Override
public ArrayList analyseDocument(String searchFor) {
//returns data from web page number three
}
}
我还有一个存储库,它采用分析器,使用 Jsoup 获取文档并将其传递给分析器
public class DocumentItemsRepository implements ItemsRepository {
private String searchFor;
private String URL;
private Document document;
private Analyser analyser;
private MainActivityPresenter presenter;
public void setSearchFor(String searchFor) {
this.searchFor = searchFor;
}
public void setURL(String URL) {
this.URL = URL;
}
public void setAnalyser(Analyser analyser) {
this.analyser = analyser;
}
public void setPresenter(MainActivityPresenter presenter){
this.presenter = presenter;
}
@Override
public ArrayList<Item> getItems() {
}
private class GetDocumentAsync extends AsyncTask<String, Void, Document>
{
}
}
在我的演示者中,我有一个方法 loadItems
,它采用存储库实现并通过 setter 注入设置其依赖项并获取项目。
我这样做是因为有时我想将不同的分析器传递给存储库,但是网页内容提取是相同的。
public class MainActivityPresenter {
private MainActivityView mainActivityView;
public MainActivityPresenter(MainActivityView mainActivityView) {
this.mainActivityView = mainActivityView;
}
public void loadItems(String URL, String searchFor, Analyser analyser,
DocumentItemsRepository documentItemsRepository)
{
documentItemsRepository.setAnalyser(analyser);
documentItemsRepository.setSearchFor(searchFor);
documentItemsRepository.setURL(URL);
documentItemsRepository.setPresenter(this);
documentItemsRepository.getItems();
}
}
问题是我无法测试我的 loadItems
方法,因为我使用 setter 注入来注入存储库并且我传递了实现而不是接口。
我如何重构我的代码以使其可测试并变得更清晰?
我是否应该使用构造函数注入设置分析器,初始化不同的存储库,在创建演示者时传递它们并为每个具有不同分析器的存储库创建单独的loadItems
presenter = new MainActivityPresenter(this, new DocumentItemsRepository1(new Analyser1()), new DocumentItemsRepository2(new Analyser2()));
我决定在不依赖存储库的情况下初始化 Presenter。
presenter = new MainActivityPresenter(this);
当尝试使用不同的分析器从不同的网页加载项目时,我将存储库的初始化传递给 loadItems 方法。
presenter.loadItems(new DocumentItemsRepository(new FirstAnalyser(), FirstURL, searchFor ));
presenter.loadItems(new DocumentItemsRepository(new SecondAnalyser(), SecondURL, searchFor ));
这样 loadItems 方法仍然可以测试,我可以在不提供实现的情况下模拟存储库。