API 設計:XML またはオブジェクトを公開する #2
-
22-08-2019 - |
質問
最近こんな質問をしました。 XML またはオブジェクトを公開する - ご回答いただきありがとうございます。
明確にしておきたい点が 1 つあります。
- API は常にリモートからアクセスされます (つまり、サービスとして)、おそらく Web サービスまたは WCF 経由です。
理論的には、オブジェクトを入力/出力として公開する厳密に型指定された API が、 右 さあ行きましょう。ただし、XML の公開についてはまだ議論の余地があると感じています。私が考えるに、XML を使用する理由は次のとおりです。
- ビジネス ルールは、ビジネス アナリストが Schematron で作成できます。
- インターフェイスは弱く型指定されていますが、呼び出されるとすぐに、データとビジネス ルールに照らしてデータを検証できます。
- サービスの実装はより簡単になります。ドメイン オブジェクト モデルを作成する必要はありません。
- XML スキーマはすでに定義されています (スキーマのデータ ディクショナリがあります)。
Web サービス テクノロジを使用すると、新しい車の「タイプ」が追加されても、XML ベースの API を変更する必要がなくなります。
void AddNewCar( string newCarXml ) string[] GetCars( /* some query conditions */ )
オブジェクトベースの API を使用した場合、新しい型を追加するには、返される可能性のある派生型を定義する新しいクエリ メソッドが必要になります (「 Webサービスを拡張する)。このように Web サービスを更新するには、このサービスと 全て 既存のクライアントを再構築して再デプロイする必要があります。
オブジェクトベースの API は何をもたらすのでしょうか?厳密に型指定された宣言型インターフェイス。XML 以上の抽象化は提供されません (XML 自体が抽象化です)。オブジェクトベースの API の料金はいくらですか?ビジネス ルールとデータ検証が必要なドメイン オブジェクトのセット全体が必要になります。
それで、私の質問は何ですか?私がオブジェクトを選択するべきである、負けることのない、議論の余地のない理由を教えてください。
解決
- オブジェクトのパフォーマンスが向上します (ここではバイナリのシリアル化を考えてください)。
- オブジェクトには、より強力な単純な型検証を行うことができます。
- オブジェクトを使用すると、検証ルールとビジネス ルールをデータ構造定義に近づけることができます。
- オブジェクトの性質上、より単純なビジネス ルールと検証を記述することができます。これは、その多くがオブジェクト定義自体に埋め込まれているためです。
- オブジェクトは動作を定義することもできます。
- .Net を使用すると、オブジェクトを XML に変換したり、シリアル化によって元に戻したりすることが簡単になり、オブジェクトに XML とほぼ同じ利点が得られます。
他のヒント
XML を支持する議論を探している場合 (私が特に XML を支持しているわけではありません) は次のとおりです。
データに関して言えば、XML を公開して XSD を提供することは自明のことです。そのフォーム内のすべてのデータを渡すことができ、それは自己文書化されており、合理的に簡単に検証できます。
データベースまたはコード モデルに対して安全なコードを大量に作成でき、追加の文書化や説明を最小限に抑えながら、自己完結型で安全な方法でデータを他のビジネス ユニットにリリースできます。
非常に読みやすいので、多くの場合、ドキュメントやコードのコメントを読むのと同じくらい簡単に読むことができます。
しかし、それに反対する議論は延々と続きます...最悪の犯罪者の名前を挙げると、次のようになります。
- 冗長すぎる。
- 巨大なネットワークオーバーヘッド。
- おそらく不必要に (?) 追加のテクノロジーの理解が必要になります。
- 何かを複雑にすると、エラーが発生する可能性が高くなります。
実際には強い型付け全くそのことは、プログラマがいずれかの愚かなミスをしないことを唯一の理由(例えばint型などを期待して関数に文字列を渡す)のために存在する任意タイピング。その上で、これはコンパイル時に起こるため、実行時チェック(例えば、適切なキャスト用)を回避し、アンマネージコードのための実行時に異常な動作を回避することにより、効率的なコードを生成する実行時に何も費用はかかりません。
あなたが言ったように、XMLは、交換用のオブジェクト・モデルを定義するために使用することができますが、このオブジェクトモデルは、ある程度の信頼性を保証するために、実行時に同じ検査を受ける必要があります。しかし、これは、ある有限の実行時のオーバーヘッドを持っています。
私が言いたいすべてが最終的な選択はあなた次第であるということであると述べました。あなたは、「剛性」オブジェクトモデルによって与えられる(時々と心の平和)安全性を放棄して喜んでであるか、より柔軟でより快適になりますが、缶シュート自分・イン・フィートのオブジェクトモデル? (したがって私見を使用するための雑用にする)XMLが大きいプログラマの規律と警戒が必要です。
「オブジェクト・ベース」APIは、あなたが思うほど剛性ではなく、自動的に生成されたXMLスキーマは、あなたが本当に彼らが何をしたいのかやっているmaynot。彼らはうまく設計されている場合は、オブジェクトベースのAPIは、XMLベースのAPIと同じくらい柔軟にすることができます。動的な型付けは、あまりにも時々助けることができます。
、すべてのクライアントが生成し、そのXMLを解析するためのコードを記述する必要があります。他でPITA、いくつかの言語で簡単ます。
しかし、ほとんどの言語は、WSDL / XSDを取ると、数秒でフルクライアントライブラリを生成することができ、WebサービスAPIを持っています。確かに、彼らはあなたと対話するために、あなたのモデルに、内部モデルからマッピングするためのマッピング・ユーティリティを記述する必要がありますが、それは予想されることです。
あなたのWebサービスは、すべてのオブジェクトを処理します。< - >(クライアントのビューのための)内部でXMLのもの、あなたは、SOAPとすべてのことを心配する必要はありません。あなたのインターフェイスを定義します。
void addCar(Car newCar);
Car getCar(String make, String model, String year);
void removeCar(...);
List<Car> getAllCars();
これはあなたの顧客に多くの意味になります。彼らはあなたのWSDLをつかむと、などのJava、C#、PHP、Pythonの、で彼らのクライアントライブラリを生成します。
あなたは追加の停止は何もありません。
int addCarXML(String carXML);
String getCarXML(int carID);
しかし、なぜWebサービスの嫌なもの、2つのレベルの追加 - 最初のWSDLを、そしてXMLスキーマのためのXSD ...
コントラクトファーストデザインについての記事をウェブ上で見てみましょう、春のWebサイトでは、良い例があります。私は今、新しいウェブサイトを開発していますし、で始まるとXMLスキーマと私のアプリケーションドメインモデルを設計するためにそれを使用してのアプローチをとっています。 XMLは、異なるシステムやアプリケーションのも、層の間でデータを送信するための優れたものです。それは依存しないプログラミング言語であり、編集、デザイン、およびXMLベースの設計を実装するための多くのツールがあります。
これは冗長ですが、物事の仕組みに冗長性はマイナーな迷惑です。 それはちょうどそれを圧縮し、大容量のファイルを作成することができます。 そこにそれを処理する際に多くのオーバーヘッドがあるが、我々開発者は常になど、使いやすさ、保守性、拡張性、パフォーマンスのために純粋に取引されている。
ここでは別のランダムな思考だ - 私は、他の交換フォーマットと思ってもない;-pを使用しています。私はプロトコルバッファを最近多くの作業を行ってきた - これは、(「.proto」の定義を経由して)契約-最初の使用を提供していますが、心の中で安全な拡張性で設計されています - あなたは壊すことなく、予期しないデータを通過するものを設計することができ、すなわち、または損失。残念ながら、メインプロトコルバッファの仕様は、実際に相続が含まれていませんが、私の実装(いるProtobuf-netが)拡張を経て、このシムます。
それは十分に成熟しているかどうかは、シナリオに依存 - 私はちょうどそれは興味があるかもしれないと思いました。余談として、(いるProtobufネット)も予め圧延RPCスタック;-p
の便宜上、WCFに差し込みます