0

マトリックス スタイルとは、n 個の変数があり、それぞれにいくつかの入力があり、すべての可能な値を処理する必要があることを意味します。これの最も単純なケースは、複数のブール値であり、true/false のすべての組み合わせを処理する必要があります。これは、戻り値が特定のパターンに従っている場合は簡単ですが、それ以外の場合は非常に困難に思えます。

(「マトリックス スタイル」よりも適切な名前があれば、タイトルを更新できるようにコメントして教えてください。)

これを処理する醜い方法は、if else チェーンです。

IF self.A = 'N' THEN
    IF self.B = 'N' THEN
        ...
    ELSE
        ...
    END IF;
ELSE
    IF self.B = 'N' THEN
        ...
    ELSE
        ...
    END IF;
END IF;

特に変数が 4 つを超える場合は、この混乱を追跡してください。

これを行うためのもう少し読みやすい方法は、すべてのチェックを一緒に行うことです。

IF self.A = 'N' AND ... self.Y = 'N' AND self.Z = 'N' THEN
    returnValue := 'Bob';
END IF;
If self.A = 'N' AND ... self.Y = 'N' AND self.Z = 'Y' THEN
    returnValue := 'Birthday Party';
END IF;
...
If self.A = 'Y' AND ... self.Y = 'N' AND self.Z = 'N' THEN
    returnValue := 'What did I ever do to deserve this?';
END IF;
...
If self.A = 'Y' AND ... self.Y = 'Y' AND self.Z = 'Y' THEN
    returnValue := 'Thank God I am done!';
END IF;

一連の if/else の代わりに CASE ステートメントを実行すれば、これを少し改善できますが、それでも維持するのは非常に困難です。誤って N の代わりに Y を入力して、それを見つけに行かなければならないことを想像してみてください。新しい変数が追加されるたびにエラーの可能性が指数関数的に増加することを考慮すると (記述する必要があるコードの量が少なくとも 2 倍になるため)、このような大きなサイズの問題ではエラーが発生する可能性が高くなります。

エラーを減らすために、興味深いテキスト置換を行うことができる可能性があります。私は最近、5つの変数でこれを行いました。私は...

NNNNN
NNNNY
...
YYYYN
YYYYY

次に、メモ帳 ++ を使用して検索と置換を実行し、N または Y のタイプミスの可能性を減らしました。したがって、これを処理するためのより良い方法があるかどうか疑問に思っています (主に保守性の観点からですが、保守性を失うことなく効率を高めることも歓迎されます)。私は特に PL/SQL ソリューションを探していますが、PL/SQL に翻訳できる可能性があるため、他の言語でのソリューションも大歓迎です。

編集:誰かがこの問題を解決しようとしていて、私の現在のソリューションを使用したい場合は、ここで検索と置換を行います。

検索:([Y,N])変数の数だけ繰り返されます。置換:\t\t\tWHEN self.valueName = '\1' THEN\r\n\t\t\t\treturnValue := ''self.valueName = '\1'変数ごとに 1 回繰り返され、そのたびに \1 がインクリメントされます。また、\t の正しい数を設定して、どれだけインデントしても一致するようにする必要があります。これは、Notepad++、正規表現モードで機能します。

4

2 に答える 2

1

なぜその問題があるのですか?これは、AZ の変数から構成されるタイプの変数であると想定しています。では、そもそもこれをどのように設定しますか? 単純化できないの?

ただし、代替手段がない場合は、最初に単一フィールドに「Y」と「N」しかないかどうかを確認し、1 と 0 に変換してから数値を作成し、数値と照合することができます。たとえば、NNNNY は 1 になり、NNNYN は 2 になります。次に、IF r=1 then .. elsif r=2 ..

おそらくさらに良い代替手段は、コードを生成することです。「関数Xを作成または置換...」を持つ文字列を形成し、すぐに実行できます。

于 2013-05-21T19:11:07.153 に答える
1

1 つの値 (self.A || self.B || .. || self.Z) に連結してから、'NNNNN'、'NNNNY'、'NNNYN などの値に大文字小文字を使用してみてください。

編集:私は次のことを仮定しました:

  • あなたは1文字の変数の大きなセットを持っています...
  • ...単一の戻り値に変換したい...
  • ...すべてまたは多くの可能なセットをカバーします。

得られるのは、同じ self.variable を持つ各単一文字列で、1 行に 1 つ、他のキーの下に 1 つ、すべての組み合わせのビューです。変数の数が非常に多い場合は、次のようなオプションを避けるために、YNNYYYNYNNYNYYYNNY3 番目、5 番目、または n 番目の文字ごとにスペースを入れて読みやすさを向上させることができます。

when 'NNN NNN NNN' then '1st choice'
when 'NNN NNN NNY' then '2nd choice'
when 'NNN NNN NYN' then '3rd choice'
... ... ...

以下の回答で@holが示唆しているように、その場合、コードを生成することは非常に良い選択です。

しかし、開発者は が か かを知る必要がm-th choiceあります。コードをチェック/テストする以外に、正しい結果が得られるかどうかを確認する方法はありません。YYY YNY YYYYY NYY YY

于 2013-05-21T17:36:33.623 に答える