Delphi で三項演算子 (モドキ) があまり使われないのには理由があります。
例えば、値を返すだけの用途 (モドキと同じ用途) であれば、
var Flg: Boolean; const BooleanString: array [Boolean] of string = ('False だよ', 'True だよ'); begin Flg := True; ShowMessage(BooleanString[Flg]); end;
このようなコードが書けます。配列は順序値であれば何でもいいので、列挙型とかも指定できます。
var Flg: TAlignment; const AlignmentString: array [TAlignment] of string = ('左寄せ', '右寄せ', '中央寄せ'); begin Flg := taCenter; ShowMessage(AlignmentString[Flg]); end;
こんな感じで。配列は n 次元でも構わないので、以下のような書き方もできます。
const ConditionNumber: array [Boolean, Boolean, Boolean] of SmallInt = (((1, 2),(1, 3)),((1, 0),(0, 1)));
うまく使えば複雑に入り組んだ if 文をスッキリとした case 文に置き換える事ができます。
case ConditionNumber[(条件1), (条件2), (条件3)] of 0: ...; 1: ...; 2: ...; 3: ...; end;
Boolean が 3 つなのですから、2^3 で 8 パターンを処理できます。コードを解りやすくするとこのようになります。
const ConditionNumber: array [Boolean, Boolean, Boolean] of SmallInt = ( ( ( 1, // False, False, False の時に返される値 2 // False, False, True の時に返される値 ), ( 1, // False, True, False の時に返される値 3 // False, True, True の時に返される値 ) ), ( ( 1, // True, False, False の時に返される値 0 // True, False, True の時に返される値 ), ( 0, // True, True, False の時に返される値 1 // True, True, True の時に返される値 ) ) ); begin case ConditionNumber[(条件1), (条件2), (条件3)] of 0: ...; 1: ...; 2: ...; 3: ...; end; end;
つまり、この条件の時とこの条件の時は同じ処理 という場合に、"長い条件式を or で連結しなくてもいい" という事です。重複した条件式を書く必要もありません。
if 文が複雑になって同じコードを何箇所にも書くハメになった事がありませんか?
|