A JavaのWebサービスは10に対処すべきであるように開発されることを意図している@QueryParam
、少なくとも。それは私が持っていると仮定すると、言うことである10クエリのparamを、私はすべての可能なコンパイルを構築しようとしている(最低限私が思うに、)90のif-else文になってしまいます。
例えば:
public Response getMethod(
@QueryParam("a") List<String> a,
@QueryParam("b") List<String> b,
@QueryParam("c") List<String> c,
@QueryParam("d") List<String> d,
@QueryParam("e") List<String> e
// ... etc
){
if (a != null && b == null && c == null ...)
{
// bla bla bla - 1
}
else if (a != null && b != null && c == null ...)
{
// bla bla bla - 2
}
....
私の質問は、このような状況に対処する方法ですか?すなわち、ここで作業負荷を最小限に抑えるために任意のショートカット/パターンがありますか?
入力の順列=>結果プロセッサ:一般的な考え方は、マッピング機能を構築することです。
10ビットの鍵を構築するために、この使用にビットフィールドとして10+ブール条件を(!= nullで、B!= nullを...)することができません。
// assume a,b,c,d...j are in scope and null or not-null
int inK = ((((a != null) ? 1 : 0) << 0 |
((b != null) ? 1 : 0) << 1 |
...
((j != null) ? 1 : 0) << 9))
// so now inK is a 10-bit number where each bit represents whether the
// corresponding parameter is present.
次は...、単一のエントリの値は、任意のキーのための「成果プロセッサ」を表すオブジェクトがどこにあるマップが構築されていると仮定します。のは、このオブジェクトが実装OutcomeProcessorとしましょう。
HashMap<Integer,OutcomeProcessor> ourMap;
各結果プロセッサ値は、マスクされたキー値を有します。そう例えば0x14のキー値は、プロセッサを起動するために存在しなければならないそのパラメータ「C」(4)「E」(0×10)を示すであろう。
アンOutcomeProcessorは、それが必要ですが、インターフェースが一般的であるので、(この場合のリスト)リストとしてパラメータまたはより一般的にコレクションを提供どちらかのパラメータにアクセスする必要があります。
ですから構築するためにourMap
、あなたはマッピングとプロセッサの実装を知っていると仮定します。
// first outcome processor (an instance of `OutcomeProcessor1` needs 'a' and 'c' input parameters
ourMap.put(0x5, new OutcomeProcessor1());
// second outcome processor (needs 'a' and 'd')
ourMap.put(0x9, new OutcomeProcessor2());
// so you'll see that if the input is 'a','c' and 'd' then both processors
// are invoked.
// repeat for all possible outcome processors
次は、マップにマスクを適用します
for (Map.Entry<Integer, OutcomeProcessor> entry : ourMap.entrySet()) {
int mask = entry.getKey();
if ((mask & inK) == mask) {
// invoke processor
entry.getValue().method(<list of parameters>);
}
}
本当にかなりシンプル。:)
このアプローチのいくつかのプロパティ:
- (所望の場合)、入力順列の単一のインスタンス(例えば、A&F&Hの存在)は、複数の結果を得ることができます。
- 単一の結果は、複数の入力順列から呼び出すことができる(例えば、結果プロセッサは、B&C(0x6に)を必要とするかもしれないとの入力が(A、B、C、D)であるか、または(B、C、F) - 両方の入力の場合、これを起動することができますプロセッサ。)
- あなたは複雑になりますとOutcomeProcessorは、それがサービスビットをクリアした結果を返す可能性があります。そして、すべてのパラメータがサービスされるまでループし続けます。