複数の条件の組合せによって処理が変わる場合の条件分岐って・・・皆さんどうされていますか? 条件が少ない時は IF文 のネストで分岐しても良いのですが、条件が多くなるとコードが分かり難くなるし記述漏れも起きます。
私は、各条件を bit に見たてて、SWITCH文で分岐するようにしています。マイコンやシーケンサだと、リミットSWなどの2値情報はどこかのIOポートの各BIT(端子)に入力されるのが一般的ですね^^ そしてポートの状態を整数として読み込んで分岐するのが普通で、各 BIT について IF文で分岐したりはしません。割り込み命令のような特別な情報が含まれている場合は別ですが・・・。
例として、「CheckBox が3つあり、その組合せによって処理を分岐させる」場合を考えてみます。この場合、下位3BIT を使って表現できますね^^ 0bit が cb0 、1bit が cb1、 2bit が cb2 を表すと考えます。
(こんな感じ↓)
上の図の下段は、各BITの十進表記(dec)です。これを使って、条件分岐を記述します。
(こんな感じ↓)
int state=0; if (cb0.Checked) state += 1; if (cb1.Checked) state += 2; if (cb2.Checked) state += 4; switch( state ) { case 0: // どれもチェックされていない ・・・ break; case 1: // cb0 ・・・ break; case 2: // cb1 ・・・ break; case 3: // cb0 + cb1 ・・・ break; case 4: // cb2 ・・・ break; case 5: // cb0 + cb2 ・・・ break; case 6: // cb1 + cb2 ・・・ break; case 7: // cb0 + cb1 + cb2 ・・・ break; default; // ありえない ・・・ break; }
この場合は入力がチェックボックス3個でしたので、2^3=8 通りの組合せを SWITCH文で分岐しました。
state が 7 より大きくなることは無いはずですので default にはエラー処理を記述します。こうすることで、起こり得る全ての場合について漏れなく処理を記述出来る利点があります。この例では、state は byte で足りますが、int のほうがアクセスが早いので int で定義しました。ちょっぴりメモリの無駄遣いですが・・・今のPC なら許されるでしょう^^
でも、これって 8080 とか Z80 時代からの手法なので・・・、古いのかも?
みなさんはどうされていますか?
面白いですね。
近年、「複合条件分岐命令」という新しいCPUの条件分岐命令の発明があります。ググってみてね!
たしかNECエレクトロニクスさんだか、ルネサスさんだか。
そういうCPUがあればすごく高速に分岐出来るのでしょうが、一般的なCPUでは
このような方法でイクしかないと思います。
なかなか良い方法だと思いますよ。