2017-08-19 6 views
0

私はJsoupを使用して別のWebページからデータを抽出し、分析して製品を入手するアプリケーションを作成しようとしています。データを分析するために異なるアルゴリズムを使用するときにリポジトリを実装する方法は同じですが、抽出するアルゴリズムは同じですか?

は、3種類のWebページがあり、各ページアナライザクラスは、私もAnalyzerをとるリポジトリを持って

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を持っています。

私は時々リポジトリに別のアナライザを渡したいが、Webページのコンテンツ抽出は同じであるため、これを行った。

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(); 
    } 

} 

Iリポジトリを注入するセッタ注入を使用し、私は実装としないインタフェースを通過するので、問題は、私は私のloadItems方法をテストすることができないことです。

私はどのようにしてテスト可能でクリーナーになるようにコードをリファクタリングできますか?

は、私はなしでプレゼンターを初期化することに決めました

presenter = new MainActivityPresenter(this, new DocumentItemsRepository1(new Analyser1()), new DocumentItemsRepository2(new Analyser2())); 

答えて

0

異なるアナライザでのリポジトリのそれぞれについて、個別loadItemsを、異なるリポジトリを初期化プレゼンターを作成するときにそれらを渡すと、作成し、コンストラクタ・インジェクションを使ってアナライザーを設定する必要がありますリポジトリに依存しています。

presenter = new MainActivityPresenter(this); 

と異なるのアナライザを使用して別のWebページからアイテムをロードしようとしたとき、私はloadItems方法にリポジトリの初期化を渡します。

presenter.loadItems(new DocumentItemsRepository(new FirstAnalyser(), FirstURL, searchFor)); 

presenter.loadItems(new DocumentItemsRepository(new SecondAnalyser(), SecondURL, searchFor)); 

この方法では、loadItems方法はまだテスト可能であり、私は実装をprovindingせずにリポジトリを模擬することができます。

関連する問題