15.04.10

VB6-программистам

Я очень люблю порядок и простоту в исходном коде программ, поэтому часто стараюсь избавиться от лишних операторов, сократить размер кода.

Еще давно я узнал значение приятной функции IIf которая позволила избавиться мне от лишних операторов IF, если нужно вывести True или False в зависимости от значения переменной, например:

boolActive = IIf(chk_act.Value, 1, 0)

chk_act - это CheckBox, в зависимости от значения которого определяется значение булива BoolActive.
Спустя некоторое время я задумался - а почему бы не сделать фунцкию с обратным эффектом, которая, наоборот будет возвращать разные значения в зависимости от булива.

Так родилась моя самодельная функция с названием BIf:

Public Function BIf(row As Boolean, truepart, falsepart)
If row Then BIf = truepart: Exit Function
BIf = falsepart
End Function

Поразительно, но применение новая функция нашла себе везде, я прямо жить без нее не мог. А каждый раз ее использования давал повод для радости - никаких If'ов.

Не будем рассматривать самый банальный случай ее использования, есть намного более интересные ситуации.

Определить номер активного OptionButton, если дан массив из трех таких объектов:

tmpByte = BIf(opt_hud_sp(0), 0, BIf(opt_hud_sp(1), 1, 2))

Определение значения переменной в зависимости от того, нажат ли Shift:

Amplitude = BIf(Shift = 1, 2, 16)

Рисование сложной сетки 32х32, которая еще поделена на квадраты 16х16:

Dim bool16 As Boolean
For i = 0 To 640 Step 16
pctEd.Line (i, 0)-(i, 480), BIf(Not bool16, clrGrid1, clrGrid2)
bool16 = Not bool16
Next i
For i = 0 To 480 Step 16
pctEd.Line (0, i)-(640, i), BIf(bool16, clrGrid1, clrGrid2)
bool16 = Not bool16
Next i

Впрочем, несмотря на всю свою полезность, функция кажется слишком банальной. Не удивлюсь, если не один я такое придумал.

EDIT: После разговора с Yanex'ом я понял, что жутко ступил, и что еще давным давно неправильно понял значение функции IIf в результате чего заварилась вся эта каша.

IIf оказывается, выполняет не то, что я писал выше, а ровно то же, что и моя самодельная функция.

LOL.

Комментарии:

xyz - 15.04.2010 18:22
в вб не работает вот это?:
boolActive := chk_act.Value = 1;


Yanex - 16.04.2010 15:41
xyz: нет, не работает.

По теме: либо я что-то не понимаю, либо BIf - это полный аналог функции IIf, только самописный.

Кстати, у тебя хостинг ложился днем :)


Yanex - 16.04.2010 15:43
Кстати, твоя функция сделана не по канонам программирования :) У всего должен быть один вход и один выход. Тогда уж вот так сделать стоит:

Public Function BIf(row As Boolean, truepart, falsepart)
If row Then BIf = truepart Else BIf = falsepart
End Function

Тем более что никакой оптимизации от преждевременного выхода ты не получишь.


vladikcomper - 18.04.2010 08:01
После разговора с Yanex'ом по аське я понял, что жутко ступил, и что давным давно неправильно понял значение функции IIf в результате чего заварилась вся эта каша.

IIf оказывается, выполняет не то, что я писал выше, а ровно то же, что и моя самодельная функция.

lol


vladikcomper - 18.04.2010 08:02
> Тем более что никакой оптимизации от преждевременного выхода ты не получишь.

Это привычка, выработанная после полугодового программирования на ассемблере. ;)