2012-03-09 6 views
1

LinkedInは、人々が検索が、私は自分のアプリケーションでは、この多くの時間を使用するので、私たちはさまざまな検索パラメータの値を設定し、その後することができます。このようなSearchオブジェクトを作成しようとしていますフォーマットhttp://api.linkedin.com/people-search?search-param1=val1&search-param2=val2...このJavaコードのパターン/デザインは改善されていますか?

を以下しているためにAPIを休まメソッドgenerateQueryUrlと呼ばれ、上記の形式のURLを生成します。

public class Search { 
    private String searchParam1; 
    private String searchParam2; 

    public void setSearchParam1(String val) { this.searchParam1 = val; } 
    public void setSearchParam2(String val) { this.searchParam2 = val; } 

    //Form the query url 
    public String generateQueryUrl(){ 
    String url = ""; 
    if(searchParam1 != null) { 
     url += "search-param1=" + searchParam1 + "&"; 
    } 
    if(searchParam2 != null) { 
     url += "search-param2=" + searchParam2 + "&"; 
    } 
    return url; 
}  

私の質問は、これを行うためのより良いパターン/デザインですか?多くのパラメータがあり、NULLを確認してから対応するパラメータ名を追加すると、値は私に冗長なコードを追加するようです。

また、この方法が問題ないかどうか教えてください。

+0

末尾に余分な記号などの小さな傷は無視してください。 – RandomQuestion

答えて

3

最終的に返されるURLを構築するという点で、あなたが設計しているものは実際は「ビルダー」だと思います。 StringBuilderまたはApacheのEqualsBuilderHashCodeBuilderなど

さらに詳しい説明は、http://sourcemaking.com/design_patterns/builderを参照してください。

あなたのコードについては、URLを適切に構築するために、私はあなたのような "set"メソッドを使用しますが、その内部にはApacheのHttpComponents (ex HttpClient)を使用してURLのパラメータを正しく追加します。

"&"をパラメータの1つの値に挿入すると、通常はこの文字をエスケープする必要があるため、クエリパラメータが乱雑になります。ここに)。私は、テストされた既知のAPI(UriUtils)を使ってそれを行うことを好む。

だから、私のクラスはとてもApacheのHttpComponentsを使用して次のようになります。

public class SearchBuilder { 
    private URI baseUri; 
    private List<NameValuePair> parameters; 

    public SearchBuilder (URI baseUri) { 
    this.baseUri= baseUri; 
    this.parameters = new ArrayList<NameValuePair>(); 
    } 

    public void addSearchParam1(String val) { 
    if(!StringUtils.isBlank(val)) { 
     parameters.add(new BasicNameValuePair("SearchParam1", val)); 
    } 
    } 

    //Form the query url 
    public URI toURI(){ 
    URI uri = URIUtils.createURI(baseUri.getScheme(), baseUri.getHost(), baseUri.getPort(), baseUri.getPath(), URLEncodedUtils.format(parameters, "UTF-8"), null); 
    return uri; 
    } 

編集:私は「ISBLANKは」空白のみの文字列の空のヌル、とのパラメータが追加されないことを確認するチェックを追加クエリ。さて、あなたはヌルだけをチェックするように変更することができますが、私はあなたがアイデアを持っていると確信しています。

3

パラメータとしてキーを使用してマップを維持することができます。あなたのセッターメソッドはキーと値をマップに入れることができます。または、値&を受け入れる一般的なセッターを1つ持つことができます。 generateQueryUrlメソッドでは、マップを繰り返し処理できます。

また、後の段階で完了していない場合は、値をURLエンコードすることもできます。

+0

は私より優れているようです。 thnx – RandomQuestion

関連する問題