条件により処理が変わるなんてことは日常茶飯事だろう。処理ではなくセットする値が異なる場合もある。
「もしAがtrueだったら処理1を、falseだったら処理2を実行する」なーんてやつだ。
信号機とその色をプログラムにしてみる。
信号機には、進んでよし/注意/止まれの3種の状態がある。これを定義してみる。
type TSignal = (sgGo, sgWarning, sgCritical);
それぞれの状態に対応する色を返す関数はこんな感じになるだろうか?
function GetColor(ASignal: TSignal): TColor; begin case ASignal of sgGo: Result := clBlue; sgWarning: Result := clYellow; sgCritical: Result := clRed; end; end;
case文で結構すっきり書けた。
しかし、配列を利用するともっとすっきりと書ける。
各状態に対応するに青/黄/赤の色を配列で定義する。
const SignalColors: array[TSignal] of TColor = (clBlue, clYellow, clRed);
そして、この配列を利用して先ほどの関数を書き直してみる。
function GetColor(ASignal: TSignal): TColor; begin Result := SignalColors[ASignal]; end;
処理部分が1行で書けた。すっきり書けた以外にもメリットがある。
列挙型の状態部分と配列の色部分を固めて書くとどの状態がどの色なのか非常にわかりやすい。修正もかなり楽だ。状態定義を増やす際に色の配列を加えるだけでよい。
実際の現場ではこれだけでは終わらないが、結構使える場面も多いかと思う。是非試して欲しい。
以下のコメントは、その投稿者が所有するものでサイト管理者はコメントに関する責任を負いません。