3

REST API を提供するサービスの 1 つへのアクセスを簡素化するために、Java SDK を構築しています。この SDK は、サードパーティの開発者が使用するものです。

問題の 1 つは、各要求のオプションのパラメーターを表す適切な方法を見つけることです。

残りのエンドポイントがあるとしましょう:GET /photos これには、いくつかのオプションのパラメーターがあります: sortBypageSizepageNumberなど。

Map<String,String>1 つの解決策は、残りの呼び出しを表す api メソッドへのパラメーターとしてを受け入れることです。

interface RestService {   
    public List<Photo> getPhotos(Map<String,String> parameters);
}

このソリューションにはいくつかの問題があります。

  • メソッドの署名は、このメソッドで使用できるオプションのパラメーターの名前 (および有効な値) に関する情報を開発者に提供しません。彼は REST API のドキュメントを参照する必要があり、理想的にはその必要を避けたいと考えています。
  • 開発者は、呼び出すメソッドのパラメーターを使用していくつかの Map を作成し、パラメーターの名前と値をあらゆる場所でハードコーディングすることになります。これは、それらが変更された場合、それらを修正するのが面倒になることを意味します.

もう 1 つの解決策は、オプションのパラメーターに関する情報を含む Options オブジェクトを使用することです。ビルダー パターンを使用して、このオブジェクトを構築することもできます。

メソッドのシグネチャは次のようになります。

interface RestService {   
    public List<Photo> getPhotos(PhotosOptions options);
}

開発者は、利用可能なオプションのパラメーターが何であるかを理解し、次のPhotosOptionsようなものを簡単に構築できます。

PhotosOptions options = PhotosOptions.builder().sortBy(DESC).pageSize(200).build();
List<Photo> photos = getPhotos(options);

問題は、SDK でカバーしようとしているサービスには、実装する必要がある膨大な範囲の要求があり、それらのほとんどすべてに許可されるオプションのリストが異なることです。これにより、多数のオプション クラスが生成される場合があります。

ここでの最善の解決策は何ですか? 組み合わせごとに Options オブジェクト (およびそのビルダー) を作成しますか? ここでは、あらゆる種類のパラメーターの組み合わせがあるため、継承はあまり役に立ちません。

4

1 に答える 1

0

より良い方法は、あなたが示したようにオプションオブジェクトを使用することです:

interface RestService {   
    public List<Photo> getPhotos(PhotosOptions options);
}

これは非常に難しい方法であり、多くの文字を入力する必要があるため、多くのクラスやその他のお尻の痛みが発生します。

しかし、私の意見では、この方法は強力なメソッド署名を提供し、SDK をより決定論的にするため、他の方法よりも優れていると思います。クラスをパッケージごとに正しく分離すると、これがより良い方法であることがわかります。

ユーザーはあなたに感謝を伝えます。

少し前に同じ質問がありましたが、何度か試した後、この方法を選択し、今は満足しています.

于 2013-10-11T14:52:09.603 に答える