![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]имхо нельзя...