私は、ストレージ システムへのインターフェイスとして機能する一連のクラスを開発するプロジェクトを割り当てられました。要件は、クラスが次のシグネチャを持つ get メソッドをサポートすることです。
public CustomObject get(String key, Date ifModifiedSince)
基本的に、このメソッドは、オブジェクトが の後に変更された場合にのみ、CustomObject
関連付けられたを返すことになっています。ストレージ システムに が含まれていない場合、メソッドは null を返す必要があります。key
ifModifiedSince
key
私の問題はこれです:
キーは存在するがオブジェクトが変更されていないシナリオをどのように処理すればよいですか?
このクラスを使用する一部のアプリケーションは Web サービスおよび Web アプリケーションになるため、これは重要です。これらのアプリケーションは、404 (見つからない)、304 (変更されていない)、または 200 (データはここにあります) のいずれを返すかを知る必要があります。
私が検討しているソリューションは次のとおりです。
- ストレージ システムに
key
- が失敗したときにカスタム例外をスローし
ifModifiedSince
ます。 - ステータス プロパティを CustomObject に追加します。呼び出し元にプロパティの確認を要求します。
これら 3 つのオプションのいずれにも満足できません。フロー制御に例外を使用するのが好きではないため、オプション 1 と 2 は好きではありません。また、値がなかったことを示すことが意図されている場合に、値を返すことも好きではありません。
それにもかかわらず、私はオプション 3 に傾いています。
検討していないオプションはありますか? これらの 3 つのオプションのいずれかについて強い感情を持っている人はいますか?
この質問への回答、言い換え:
- メソッドを提供し、
contains
呼び出し元が を呼び出す前にそれを呼び出すことを要求しget(key, ifModifiedSince)
、キーが存在しない場合は例外をスローし、オブジェクトが変更されていない場合は null を返します。 - 応答とデータ (存在する場合) を複合オブジェクトにラップします。
- 事前定義された定数を使用して、状態を示します (
UNMODIFIED, KEY_DOES_NOT_EXIST
)。 - Caller は、コールバックとして使用されるインターフェイスを実装します。
- デザインがイマイチ。
答え #1 を選択できない理由
これが理想的な解決策であることに同意しますが、それは私がすでに (しぶしぶ) 却下したものでした。このアプローチの問題は、これらのクラスが使用されるほとんどのケースで、バックエンド ストレージ システムが Amazon S3 などのサード パーティのリモート システムになることです。これは、contains
メソッドがストレージ システムへのラウンド トリップを必要とすることを意味し、ほとんどの場合、その後に別のラウンド トリップが続きます。これには時間と費用の両方がかかるため、オプションではありません。
その制限がなければ、これが最善のアプローチです。
(質問でこの重要な要素について言及しなかったことに気づきましたが、簡潔にしようとしていました。明らかに関連性がありました。)
結論:
すべての回答を読んだ後、この場合はラッパーが最適なアプローチであるという結論に達しました。基本的に、応答コードを含むメタデータ (ヘッダー) とコンテンツの本文 (メッセージ) を使用して、HTTP を模倣します。