web-dev-qa-db-ja.com

複数のAPI、または「chooser」パラメーターを持つ1つのAPI?

データソースの上にビジネスロジックを追加するWebサービスがあるとします。このサービスの各APIはほとんどのように見えます-一連の制約が与えられた場合、これらの制約を満たすデータソースからのアイテムを提供します。 APIからデータソースの「ビュー」を取得したと言えます。

ここで、時間の経過とともに、データソースに対してさまざまな種類のビューを返すように求められます。 「十分に異なる」ビューごとに新しいAPIを追加するか、ギアを切り替えて、目的のビューの種類を指定するパラメーターを取得するgetFooDataView()APIを提供するオプションがあります。どちらの方法に行くかを決定するために、いくつかの競争圧力があります。

  • サービスの既存の大きなクライアントはレイジーであり、データの新しいビューが必要なときに新しいAPIまでコーディングする必要がありません。
  • ただし、一部のリクエストパラメータ(制約)は一部のビューでのみ意味があり、他のビューでは意味がありません。「まあ、XYZビューが必要な場合は、 "foo"パラメータを設定すると、APIコントラクトを緩くする必要があります。一部のビューではそうであるとしても、「foo」を必須パラメーターにすることができないという残念な副作用があります。
  • 新しいクライアントがあなたのサービスを活用したいというケースはますます増えています。どちらがより混乱するかを決定することはできません-異なるがより厳密に定義されたAPIと、パラメーターのどの組み合わせが本当に必要なものを提供するかを知る必要がある1つのAPIを選択する必要があります。

これを抽出するために、既存のAPIのバリエーションとは対照的に、何かが独自のAPIであるという線を描くのはいつですか? 2人のクライアントの要求を意味的に区別する理由については、協力しなければならない人によって見方が異なるため、この問題についてコンセンサスを得ることは難しい場合があります。また、将来のクライアントがサービスを利用するのが極端に難しくならないようにする必要もあります。この種の選択を行うためのいくつかのベストプラクティスは何ですか?

8
RuslanD

個人的には、私はより小さくてよりタイトなAPIに傾倒します。 1つのサイズですべてに対応するAPIを使用すると、何かが使いやすくなるとは思いません。実際には、逆に、緩やかに型付けされた「ju-ju」の適切な組み合わせを理解する必要があるためです。よりタイトなAPIは自明にすることができますが、あなたが望むもの。複雑さを明示するのではなく、単に隠すだけです。

また、より多くの機能をラップするため、1つのAPIがさらに複雑になる可能性がありますが、よりタイトなAPIは、焦点を絞った無駄のないままです。

これは インターフェイス分離の原則 をより大規模に表現したものです。

クライアントが適切なアプローチを選択するのに役立つ他の方法(優れたガイダンスなど)は常にあります。

4
James World