Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.25;
Скачать: CL | DM;

Вниз

IIF   Найти похожие ветки 

 
EternalWonderer   (2002-04-11 12:52) [0]

Задача: повысить читабельность кода путём применения вместо стандартной конструкции
If a<b
Then a
Else b;

бейсик - подобной функции
IIF(a<b,a,b);

Решается просто:
Function IIF(b: Boolean; sTrue,sFalse: String): String; Overload;
Begin
If b Then Result := sTrue Else Result := sFalse;
End;

Function IIF(b: Boolean; iTrue,iFalse: Integer): Integer; Overload;
Begin
If b Then Result := iTrue Else Result := iFalse;
End;


Но есть проблема:
IIF(MyObject<>Nil,MyObject.MyField,-1)
не пройдёт, потому что обращение к MyObject.MyField будет произведено независимо от того, истинно выражение или ложно.

Вопрос: Можно ли как - нибудь обойти это ограничение?


 
wicked ©   (2002-04-11 12:57) [1]

имхо нельзя...


 
gek   (2002-04-11 13:03) [2]

наверное надо проверять и
if MyObject.MyField <> nil


 
Anatoly Podgoretsky ©   (2002-04-11 13:10) [3]

Обращение не произойдет!
Вот тебе реализация IIF

function IIF(Expr,TrueRet,FalseRet:Variant) : Variant;
begin
if Expr then Result := TrueRet else Result := FalseRet;
end;



 
Игорь Шевченко ©   (2002-04-11 13:12) [4]

День добрый,

Нельзя. Попытки обойти это IMHO, ухудшат читабельность кода.

Но я не понимаю, зачем вообще огород городить...
Что касается читабельности - то у VCL очень читабельные коды, несмотря на отсутствие разного рода шаманских прибамбасов :-)

С уважением,


 
Anatoly Podgoretsky ©   (2002-04-11 13:13) [5]

Извиняюсь в твоем варианте произойдет


 
EternalWonderer   (2002-04-11 13:46) [6]

Anatoly Podgoretsky © (11.04.02 13:13)
Так ведь и в Вашем варианте произойдёт - при передаче параметра в функцию ...

Игорь Шевченко © (11.04.02 13:12)
Спасибо, обласкали :-). Надо перенимать хороший опыт у других языков. Кроме того, когда пишется длинная и сложная процедура IMHO желательно максимально упрощать код, вынося повторяющиеся фрагменты кода в отдельные функции - иначе никто не разберётся, в том числе автор. Вы поступаете иначе?


 
EternalWonderer   (2002-04-11 13:51) [7]

Anatoly Podgoretsky © (11.04.02 13:13)
Секундочку ...
Речь шла о том, чтобы избежать обращение к несуществуюшему объекту при передаче параметров функции IIF. Конечно, если передавать функции ссылки на существующие объекты, всё работает без проблем, как в моём, так и в Вашем варианте.


 
Игорь Шевченко ©   (2002-04-11 13:52) [8]

День добрый, EternalWonderer,

Да не за что :-))

Не стал бы я утверждать, что это хороший опыт. Человек, привыкший читать текст на паскале, будет лишний раз ломать голову, что за новая функция появилась. IMHO, конечно :-)

Я тоже стараюсь выносить повторяющиеся куски кода в отдельные функции, но не до такой же степени :-)

Могу еще раз повторить, что VCL написана достаточно читабельно, без подобных нововведений.

С уважением, Игорь Шевченко


 
Fantasist   (2002-04-12 08:27) [9]

А что по-моему в Delphi есть что-то типа С++-шного #define. Нет?


 
Игорь Шевченко ©   (2002-04-12 09:29) [10]

День добрый, Fantasist,

Нету :-)

С уважением,


 
Anatoly Podgoretsky ©   (2002-04-12 09:47) [11]

EternalWonderer (11.04.02 13:46)
Ты не смотри на мой варинт с этой стороны, он просто приведен как вариант IIF и не более


 
REA   (2002-04-12 10:52) [12]

Вообще-то в Delphi 6 есть уже такая функция. Но имхо смысла в ней нет.



Страницы: 1 вся ветка

Текущий архив: 2002.04.25;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
6-81029
Aleksandr
2002-02-13 13:45
2002.04.25
Как работать с TNMStrm на подтверждение чего-либо?


1-80998
Андрей Сенченко
2002-04-12 13:22
2002.04.25
Хочу порисовать на форме :)


1-80964
lucky
2002-04-11 18:53
2002.04.25
Как узнать сколько осталось таймеру до Евента ???


1-80840
Jaxtor
2002-04-11 11:35
2002.04.25
Закрытие формы MDIChild программным методом


1-80902
Кулюкин Олег
2002-04-15 09:12
2002.04.25
ручная отрисовка ListView, проблемма при изменении ширины столбца