web-dev-qa-db-ja.com

分離トランプDRY RESTで?

REST APIを構築して、既存のJava APIのほとんどの機能を公開します。どちらのAPIも、組織内で使用するためのものです。外部使用のための設計です。私は両方のAPIに影響を与えていますが、REST one。を実装しています。Java APIは、引き続きローカルアプリケーションで使用されます( 「廃止」)ですが、REST APIは重要な新しい開発に使用されます。

一部のJava APIクラスは単にデータ(プロパティ、ゲッター、セッターを持つBean)です。そして、これらの少なくともいくつかは、REST APIをデータとして(XMLまたはJSONにマーシャリングされます)たとえば、サーバーマシンに関する情報を格納するクラスです。これらのデータクラスには次の選択肢があります。

  1. 元のJavaクラス(またはサブクラス)をREST APIで直接公開する、または
  2. REST API?専用の新しいデータ転送クラス(DTOパターン)を作成しますか?

どちらの方法でもRESTデータ転送クラスを使用します。問題は、オリジナルに注釈を付けるか、新しいものを作成するかです(オリジナルのコピーに近い場合があります)。他の選択肢もあるかもしれませんが、私は主にこれら2つに焦点を当てます。

#1の引数:

  • DRY(繰り返さないでください)
  • より早く実装
  • アップグレードが簡単REST API

#2の引数:

  • REST APIをJava APIとは別にバージョン管理する必要がある場合はどうなりますか?
  • Javaデータクラスにプロパティの削除、動作の追加、クラス階層の変更など)の大幅な変更がある場合はどうなりますか?(これもある程度可能性があります。)

結論としては、DRY(#1)とデカップリング(#2)の間のトレードオフのように見えます。

私は#1から始め、次に問題が発生して#2に移行する場合は、必要なことを証明できないものを構築しないというアジャイルガイドラインに従っています。これは悪い考えですか。とにかくそこに行くかもしれないと思うなら、私は#2から始めるべきですか?

リストに主要な議論/結果が欠けていますか?

19
Will

いい質問です、簡単に言えば、分離します。それがここに行く方法です、あなたはJavaのバージョンに縛られたくありません。

切り離さないシナリオが1つあります。テクノロジーでタイプ固有ではないオブジェクトをネットワーク経由で送信できる場合、つまり、現在のJavaオブジェクトを今すぐ使用できる場合) YAGNIであり、カスタム化した別のタイプへの置き換えは、タイプ情報がワイヤを通過するために何も壊さない単純なドロップインです。したがって、基本的にタイプ情報がワイヤを越えない場合は、これについてYAGNI。

Java=バージョンをアップグレードしてもこれらのオブジェクトは変更されないことに注意してください。それ以外の場合は、ここでデカップリングして心配する必要はありません。選択肢があるなら、あなたが持っている時間。

ただし、プロトコルのタイプ情報がネットワーク全体に渡る場合、基になるJavaタイプの変更時にフラットタイプの新しいタイプをドロップインすることは不可能であり、かなり大きな労力となる可能性があります。それがこの場合、YAGNIに移行するということは、基礎となるテクノロジーに関連する技術的負債とリスクを蓄積することを意味します。

個人的には、今は分離するだけです。

また、DRYはこれに関与しません。これは、基礎となる部分を記述していないため、コードを複製していないため、繰り返しバグが発生することはありません。 DRY(および一般的なメンテナンス性の問題)の主な懸念事項(重複してメンテナンスする必要がないため、この問題は起こりません)

10
Jimmy Hoffa

#1の主な論点は、実装とアップグレードの容易さですが、要件を満たしていますか?

#2の引数では、Java APIとREST APIは個別に変更される可能性があることを示しています。これは、それらが別々の問題であり、繰り返しではないことを意味します2つのものが同じように見えるからといって、それらがareが同じであることを意味するわけではありません。

7
Misko

REST APIは、データモデルと同じ構造に従う必要はありません

RESTを実装する場合は、直感的な外部APIを作成していることを確認してから、これを内部データモデルクラスにマップします。これにより、それぞれを個別に変更して 何十年も続くAPI

したがって、デカップリングはここに行く方法です。

6
Gary Rowe