私は$COMPANYで働いており、$LEGACY_APPLICATIONの維持を支援しています。VisualBasic6で書かれています。
ifステートメントで短絡評価を実行するVB6の機能がないため、不快に複雑なネストされたifステートメントを実行することに直面しました(これにより、これが大幅に簡素化されます)。AndAlsoを試しましたが、役に立ちませんでした。VB6の後に追加された機能である必要があります。
SOのある天才は、忍耐力があれば、select caseステートメントをだまして短絡ifステートメントのように機能させることができると指摘したので、それを試しました。これが私が思いついたものです。
Select Case (True) ' pretend this is an if-else statement
Case (item Is Nothing): Exit Sub ' we got a non-element
Case ((item Is Not Nothing) And (lastSelected Is Nothing)): Set lastSelected = item ' we got our first good element
Case (item = lastSelected): Exit Sub ' we already had what we got
Case (Not item = lastSelected): Set lastSelected = item ' we got something new
End Select
それは間違いなく少し珍しいことであり、すべてのステートメントを正しくマッピングしたことを確認するために、私の素晴らしいホワイトボード(ちなみに、コンピューター以外で最も便利なプログラミングリソースです)を利用する必要がありました。
そこで起こっていることは次のとおりです。私には高価な操作があり、可能であれば繰り返さないようにしたいと思います。lastSelectedは、この計算に最後に渡された値への永続的な参照です。itemは、GUIから受け取ったばかりのパラメーターです。これまでにプログラムへの呼び出しがなかった場合、lastSelectedはNothingとして開始されます。アイテムも何もできません。さらに、lastSelectedとitemの両方が同じものである場合は、計算をスキップします。
これをC++で書いているとしたら、次のように書きます。
if (item == NULL || (lastSelected != NULL && item->operator==(*lastSelected))) return;
else lastSelected = item;
しかし、私はそうではありません。
質問
どうすればこれを書き直して見栄えを良くし、より意味のあるものにすることができますか?賛成票は、「はい、理由はX、Y、Z」または「いいえ、理由はX、Y、Z」のいずれかであると回答した場合に授与されます。
編集
C ++ステートメントをVB6ステートメントと一致するように修正しました(同等であると想定されていました)