Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

IIF [D6]


EternalWonderer ©   (2002-04-11 12:52:00) 

Задача: повысить читабельность кода путём применения вместо стандартной конструкции
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 будет произведено независимо от того, истинно выражение или ложно.

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


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

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


Anatoly Podgoretsky   (2002-04-12 09:47:00) [2]

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


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

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

Нету :-)

С уважением,


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

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


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

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

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

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

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

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

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


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

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


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

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

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


Anatoly Podgoretsky   (2002-04-11 13:13:00) [8]

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


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

День добрый,

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

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

С уважением,


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

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

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо