Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Вниз

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 есть уже такая функция. Но имхо смысла в ней нет.




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.04.25;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.028 c
1-80953           UnDISCOvery           2002-04-11 13:12  2002.04.25  
Подскажите, что за ошибка ? Как лечить ?


3-80837           Андрей Брусов         2002-04-04 09:13  2002.04.25  
Языковые драйверы в BDE


6-81017           Arlekin17             2002-02-14 17:57  2002.04.25  
Пожалуйста объясните как работает BROADCAST.....


1-80888           kaif                  2002-04-14 15:08  2002.04.25  
TabSet и клавиатура


3-80826           kserg@ukr.net         2002-04-05 12:30  2002.04.25  
- как оперделить кол-во юзеров прицепившихся к БД?