2016-04-22 8 views
2

ニュース検索エンジンをラップするデコレータクラスを設計していますので、このクラスを他のチームが使用するライブラリで出荷することができます。Java - 検索の方法を設計するには?

このクラスの公開されたインターフェイスはJavaスタイルのもので、多くのパラメータが必要な場合、このデコレータはこれらのパラメータを検索エンジンとして検索テキストとして組み込みます。

public List<News> search(List<String> keywords, List<String> categories, List<String> authors, List<Location> locactions, List<LocalDate> dates, List<SortRule> sortRules, int offset, int limit); 

はい、私は知っている...このメソッドは見え途方もなく長い間、非常に誤りプローブおよびクライアントのために使用するのは難しい:

私の方法は、以下のようなものです。

このような検索機能に対して、より優れたAPIを設計するにはどうすればよいですか。

+2

良いAPIデザインを見つけようとすると、他の優れたライブラリデザインを見るのは悪い考えではありません。気になる良いものは、Hibernatesの 'Criteria'クラスです。https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html –

+0

ありがとう、本当に参考になりました! –

答えて

6

ルールフィルタを適用するためのラッパークラスを作成し、このクラスの新しいオブジェクトを現在のクラスで使用することができます。こうすれば、シンプルで清潔になります。

public List<News> search(RuleFilters r) { 
    /* Do Something with the rule filters */ 
}; 

インタフェース:例については

、ここで Type

RuleFilters r = new RuleFilters(); 
r.addFilters(Type.Keywords, keywords); 
r.addFilters(Type.Categories, categories); 
r.addFilters(Type.Authors, authors); 

{Categories, Authors, Keywords}自分のメインクラスで最後に

のように異なるルールフィルタの詳細を保持している列挙型であります:

List<News> search(RuleFilters r); 

注:publicキーワードはインターフェイスでは必要ありません。

3

Effective Javaに記載されているように、Builderパターンの使用を検討することがあります。そして、それはすっきりした解決策になるでしょう。

SearchParam search = new SearchParam.Builder(keywords). 
    categories(categories).authors(authors).location(loc1,loc2).build(); 
0

もう1つの方法は、検索パラメータの転送にBeanまたはPOJOを使用することです。 その後、いくつかのデザインパターンを使用して結果を得ることができます。しかし、価値のある輸送のためにBeanを使うことは良いことです。

public class SearchParameters{ 

private List<String> keywords; 
private List<String> categories; 
private List<String> authors; 
private List<Location> locactions; 
private List<LocalDate> dates; 
private List<SortRule> sortRules; 
private int offset; 
private int limit; 
//Getters and Setters 

} 

//For one request 
public List<News> search(SearchParameters param) { 
    /* Do Something with the rule filters */ 
}; 

//for multiple request you could use List<SearchParameters> params 
0

たぶん、あなたはElasticsearch Java libraryに見てとることができます。基本的にはビルダーパターンの専門実装です

SearchResponse response = client.prepareSearch("news") 
     .setQuery(QueryBuilders.termQuery("author", "jack"))    // Query 
     .setPostFilter(QueryBuilders.rangeQuery("date_published").from('2016-04-01').to('2016-04-30')) // Filter 
     .setFrom(0).setSize(10) 
     .execute() 
     .actionGet(); 

を。

関連する問題