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


8

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

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

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

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

回答:


4

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

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

これは、より大きなスケールでのインターフェース分離原理のスマックです。

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


原則的に同意しますが、APIをどのようにバージョン管理しますか?あなたの方法では、機能が追加されたときに新しいインターフェースを作成するか、アダプターを作成する必要があります。OPの方法では、別の「コマンド」を追加できます(それにもかかわらず、その魔法の糸引き性)。それはあなたのものではなく、よりタイトで無駄のない、より集中されたものになるのはOPのAPIです。
Robert Harvey

1
私が与えた理由のために、私は最後の文についてのあなたの推論には従いません。バージョン管理についてはSomeApiVersion1SomeApiVersion2...等は不思議に動作します。このようにして、移行と非推奨を完全に制御できます。1日目には、同じインターフェースを介した複数のバージョンが適切に見えますが、長期間にわたって料金を支払うことになります。
James World

それは確かに賢明なアプローチですが、きつい、無駄のない、または集中的であると言える方法はありません。インターフェースとアダプターの急増に巻き込まれます。
Robert Harvey

2
私は、各APIを完全なものではなく、緊密かつ集中的に呼び出しています。APIが分割されていてもいなくても、全体の複雑さは一定であり、各クライアントは分割されたアプローチで必要な複雑さを引き受けるだけでよいと言っています。
James World

2
ほら、それは妄想だと思います(強い言葉に対する謝罪)。複雑さはまだ残っていますが、あなたはそれを隠しました。メンテナンスコストが急上昇する中で、そのことを何度も何度も目にしました。それは泥の建築の大きなボールへの確かな火の道です。
James World
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.