用コールバック関数の代わりに還元状態でオブジェクト
-
18-09-2019 - |
質問
私の願いを実行するおそれのある取引できる三つの異なった状態の末に実施する:
- 成功
- 失敗
- 申請中
状態によって、顧客を行っていきたいと考えています。に成功した場合はいかに取得する本取引の結果ウィジェット).に失敗した場合、受け取りたいのエラー理由です。た場合の取引に済みまたは申請中であり、ものを作って欲しいという時間を確保。現在、私を返しオブジェクトは、以下のいずれかの方法が
public interface Result() {
State getState();
Widget getWidget(); // Success
Reason getFailureReason(); // Failure
Callable<Result> getTask(); // Pending
}
あまり出現しないと考える顧客のチェックの状態、結果オブジェクト、ソッドを呼び出しに適切な方法によってその価値、例えば
if (result.getState() == State.PENDING) {
result.getTask();
}
したヴィッセル神戸は、神戸されることが好ましい利用コールバックではなく、例えば
public interface TransactionCallback() {
void onFailure(Reason reason);
void onSuccess(Widget widget);
Delay onPending(Delay previous);
}
場所 Delay
クラスを表す TimeUnit および期間に申請すぐダウンロードの取引実行します。他には例外をスローする包装の失敗の理由としてではな例外的状況が onSuccess
や onPending
ます。
なので私の質問です:にコールバック関数の適切なパターンのためこの問題は、誰でもできるのでこのように適切か。
解決
私は、これは、コールバックパターンをうまく利用ではないと思います。
(例えば、あなたのケースでは、取引)呼び出し先がコールバックメソッドの復帰後のことをやって継続する必要がある場合、コールバックが適切です。呼び出し先が常にないことを次のことが呼び出し元に戻るの場合しかし、その後、コールバックは任意の値を追加しません。それはちょうど、コードの構造がより複雑で読みにくくなります。 IMO、それは(例外的な障害が発生した場合に)結果オブジェクトまたはを返す例外をスローする方が良いだろう。
編集 - OPさんのコメント再
。私は取引が継続する必要がある場合、私はおそらく、単純なタイムアウトパラメータを使用しているだろうが、発信者を依頼するコールバックメソッドを使用しての値を見ることができます。しかし、結果を返すために、コールバックメソッドを使用すると、まだ(IMO)間違っています。
他のヒント
私好みのコールバック 以降、ご利用の場合で複数の場所となりますので以下のコードされ易い。との呼び返しおif文にかかる法への通話はサービスの取引、すべてのコードを使用するサービスについ眺めてしまいました。
コールバックの引数は、呼び出しを調達オブジェクトを含める必要があります。私にとっては罰金に聞こえるが、コールバックを使用すると、いくつかの同期の問題を伴う可能性 - あなたは、コールバックを受け取るた状態で確認することはできません。不可能ではないが、配慮が必要になる場合があります。
ポーリング結果にもちろん、あなたが他の側に同期が必要になります。しかし、それは同期するために単純に聞こえます。
コールバック・ソリューションは、非常に拡張可能です。
の欠点は、あなたのコードは、特に初心者プログラマに、読みにくくなります。それはあなたが確かに問題ではない場合は、...
に行きます