Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];
ВнизСуществует в Дельфи функция IIF ? Найти похожие ветки
← →
Пит (2009-06-22 18:18) [0]Судя по тому, что в indy использована собственная реализация - среди стандартных подобной функции нет.
При этом в справке находится некая "IfThen", вроде как должна находится в модуле "MathStrUtils". Забавно то, что у меня такого модуля нету в поставке delphi.
И судя по немного корявой справке всего лишь двух функций этого модуля - где-то что-то не доработано.
Есть таки функция аля IfThen / IIF в дельфе стандартном или нету? Или появилась может, начиная с какой-то версии?
← →
Palladin © (2009-06-22 18:21) [1]Function vtIIf(Const a:Boolean;Const t,f:Variant):Variant;
Begin
If a Then Result:=t Else Result:=f;
End;
← →
Пит (2009-06-22 18:28) [2]Palladin, это ты к чему?
← →
jack128_ (2009-06-22 18:28) [3]Вообще то все стандартные модули в дельфи поставляются в сорцах. А еще есть такая замечательная вещь как поиск по содержимому в файлах. Тебя это не наводит не на какие мысли, как можно самому ответить на твой вопрос??
> Или появилась может, начиная с какой-то версии?
ну очевидно, что если какая то функция есть, то она появилась начиная с какой то версии, с другой стороны если её нету, то она возможно когда нить появится. Тоже начиная с какой нить версии.
← →
antonn © (2009-06-22 18:36) [4]
> Palladin © (22.06.09 18:21) [1]
в каком модуле в поставке дельфи это находится?
← →
Sapersky (2009-06-22 18:50) [5]При этом в справке находится некая "IfThen", вроде как должна находится в модуле "MathStrUtils". Забавно то, что у меня такого модуля нету в поставке delphi.
И судя по немного корявой справке всего лишь двух функций этого модуля - где-то что-то не доработано.
Пропущена запятая между "Math" и "StrUtils".
Начиная с D7 (или 6 - во всяком случае, в 5-м их нет).
← →
Anatoly Podgoretsky © (2009-06-22 18:56) [6]> Пит (22.06.2009 18:18:00) [0]
ifthen эта функция.
И что такое Дельфи стандартное?
← →
Пит (2009-06-22 19:05) [7]jack128_, нравоучительством в данном случае ты занялся поспешно, имхо.
> Пропущена запятая между "Math" и "StrUtils".
точняк... Оказывается, часть набора такой функции (по числам) реализована в Math, а строковая версия реализована в StrUtils...
Блин, тупость... Надо было все реализовывать в System, имхо.
И со справкой накосячили, конечно. Написано:Unit
[b]MathStrUtilsor[/b]
← →
Пит (2009-06-22 19:06) [8]хотелось сказать:
Unit
MathStrUtilsor
Я все искал модуль MathStrUtils...
← →
Palladin © (2009-06-22 19:16) [9]
> Palladin, это ты к чему?
Это текст твоей функции
← →
Пит (2009-06-22 19:35) [10]
> Это текст твоей функции
ты правда считаешь, что я не в состоянии реализовать действие функции аля IIF?
← →
Игорь Шевченко © (2009-06-22 19:36) [11]ты тролль и должен быть забанен
← →
Student © (2009-06-22 23:31) [12]А вот мой пример глянь. Я тоже тока сёдня узнал про такую
if FblStateAdr then
begin
imgComputer.Picture.Bitmap.FreeImage;
imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
+ "CompLime.bmp");
end else
begin
imgComputer.Picture.Bitmap.FreeImage;
imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
+ "CompBlue.bmp");
end;
так:
imgComputer.Picture.Bitmap.FreeImage;
imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
+ IIF(FblStateAdr , "CompLime.bmp", "CompBlue.bmp"));
так нельзя было переписать?
Сказали ужас
Пример из жизни -)))
← →
vuk © (2009-06-23 00:32) [13]to Student © (22.06.09 23:31) [12]:
IIF приводит к неявному преобразованию в variant и обратно. Наверное, на производительности не лучшим образом отразится. Я бы так сделал:const BitmapNames: array[boolean] of string = ("CompBlue.bmp", "CompLime.bmp");
...
imgComputer.Picture.Bitmap.FreeImage;
imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
+ BitmapNames[FblStateAdr]);
← →
Игорь Шевченко © (2009-06-23 01:17) [14]IIF приводит прежде всего к нечитаемости кода.
> if FblStateAdr then
> begin
> imgComputer.Picture.Bitmap.FreeImage;
> imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir",
> "Image", "")
> + "CompLime.bmp");
> end else
> begin
> imgComputer.Picture.Bitmap.FreeImage;
> imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir",
> "Image", "")
> + "CompBlue.bmp");
> end;
В первую очередь не надо писать повторяющийся код в ветках условного оператора, то есть, начать сimgComputer.Picture.Bitmap.FreeImage;
if FblStateAdr then
imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
+ "CompLime.bmp")
else
imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir","Image", "")
+ "CompBlue.bmp");
Ну и чтобы не загромождать программу немецким языком, использовать withwith imgComputer.Picture.Bitmap do
begin
FreeImage;
if FblStateAdr then
LoadFromFile(Ini.ReadString("Dir","Image", "") + "CompLime.bmp")
else
LoadFromFile(Ini.ReadString("Dir","Image", "") + "CompBlue.bmp");
end;
А если учесть, что LoadFromFile тоже вызывает очистку (правда несколько иную, чем FreeImage), то FreeImage можно убрать и получитсяwith imgComputer.Picture.Bitmap do
if FblStateAdr then
LoadFromFile(Ini.ReadString("Dir","Image", "") + "CompLime.bmp")
else
LoadFromFile(Ini.ReadString("Dir","Image", "") + "CompBlue.bmp");
← →
TIniFile (2009-06-23 06:31) [15]А потом, осознав, что явно объявленная локальная переменная ничем не хуже неявной, написать наконец так, чтобы это нормально читалось
var
s: string;
if FblStateAdr
then s:= Ini.ReadString("Dir","Image", "") + "CompLime.bmp"
else s:= Ini.ReadString("Dir","Image", "") + "CompBlue.bmp";
imgComputer.Picture.Bitmap.LoadFromFile(s);
← →
test © (2009-06-23 07:54) [16]Palladin © (22.06.09 18:21) [1]
Она так тормозить будет, они поэтому от Variant отказались и на каждый тип свою реализацию сделали.
← →
Плохиш © (2009-06-23 11:08) [17]
> А потом, осознав, что явно объявленная локальная переменная
> ничем не хуже неявной, написать наконец так,
var
s: string;
if FblStateAdr
then s:= "CompLime.bmp"
else s:= "CompBlue.bmp";
s:= Ini.ReadString("Dir","Image", "") + s;
imgComputer.Picture.Bitmap.LoadFromFile(s);
:-P
← →
KSergey © (2009-06-23 11:22) [18]> Игорь Шевченко © (23.06.09 01:17) [14]
> IIF приводит прежде всего к нечитаемости кода.
Это не есть правда навсегда и везде.
Использую, радуюсь. Когда надо состряпать длинную строку из кусочков, при этом один из кусочков должен быть "либо-либо" - все отлично читается.
← →
Игорь Шевченко © (2009-06-23 11:36) [19]KSergey © (23.06.09 11:22) [18]
Читаемость чужого кода IIF ухудшает вдвойне. Собственно, испытано на опыте чтения исходников EhLib
← →
ANB (2009-06-23 11:48) [20]
> Читаемость чужого кода IIF ухудшает вдвойне. Собственно,
> испытано на опыте чтения исходников EhLib
Привычки у тебя нету. На клиппере iif вовсю используется и нормально всегда читалось.
Можно и с if код так написать, что черт ногу потом сломит. А можно и с iif написать понятно.
var
s: string;
if FblStateAdr
then s:= "Lime"
else s:= "Blue";
s:= Ini.ReadString("Dir","Image", "") + "Comp" + s + ".BMP";
imgComputer.Picture.Bitmap.LoadFromFile(s);
с иифом :
var
s: string;
s:= Ini.ReadString("Dir","Image", "") + "Comp" + IfThen(FblStateAdr, "Lime", "Blue") + ".BMP";
imgComputer.Picture.Bitmap.LoadFromFile(s);
← →
Игорь Шевченко © (2009-06-23 11:53) [21]ANB (23.06.09 11:48) [20]
> Привычки у тебя нету
Я стараюсь от плохих привычек избавляться. Кроме того, клиппер есть клиппер, а паскаль есть паскаль - разные конструкции. В С, например, я использую оператор ? : и не вижу причин его не использовать.
← →
AndreyV © (2009-06-23 14:03) [22]А то, что оба выражения будут вычислены - это не мешает?
Совсем недавно была ветка об операторе "? :" в Си и Iif(). Кстати в Фоксе, неверно и в Клиппере, вычисляется одно, проверял, но немного теперь сомневаюсь.
← →
Пит (2009-06-23 14:31) [23]
> А если учесть, что LoadFromFile тоже вызывает очистку (правда
> несколько иную, чем FreeImage), то FreeImage можно убрать
> и получится
>
> with imgComputer.Picture.Bitmap do
> if FblStateAdr then
> LoadFromFile(Ini.ReadString("Dir","Image", "") + "CompLime.
> bmp")
> else
> LoadFromFile(Ini.ReadString("Dir","Image", "") + "CompBlue.
> bmp");
это именно привычка. Как привычка выхватывать взглядом begin..end"ы или те же { и }. По мне так гораздо читабельнее:
imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir", "Image", "") + IIF(FblStateAdr, "CompLime.bmp", "CompBlue.bmp") );
Хотя никто не спорит, что с помозью IIF можно составлять нечитаемые конструкции. Как и с помощью if"а
← →
Rouse_ © (2009-06-23 16:08) [24]
> По мне так гораздо читабельнее:
>
> imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir",
> "Image", "") + IIF(FblStateAdr, "CompLime.bmp", "CompBlue.
> bmp") );
Обычно, после такого кода, следует команда от технического: "переписать все и сделать правильно".
← →
Пит (2009-06-23 16:45) [25]Я говорил лишь только то, что приведенный мной код считаю читабельнее, чем код приведенный в [14]
Если ты не согласен - готов выслушать мнения )))
← →
Rouse_ © (2009-06-23 18:09) [26]
> Я говорил лишь только то, что приведенный мной код считаю
> читабельнее, чем код приведенный в [14]
>
> Если ты не согласен - готов выслушать мнения )))
Если бы это было так, я не писал бы [24]
← →
Пит (2009-06-23 18:23) [27]Не очень понял, что ты имеешь в виду. В общем, есть два варианта:
1.with imgComputer.Picture.Bitmap do
if FblStateAdr then
LoadFromFile(Ini.ReadString("Dir","Image", "") + "CompLime.bmp")
else
LoadFromFile(Ini.ReadString("Dir","Image", "") + "CompBlue.bmp");
2.imgComputer.Picture.Bitmap.LoadFromFile(Ini.ReadString("Dir", "Image", "") + IIF(FblStateAdr, "CompLime.bmp", "CompBlue.bmp") );
Какой тебе код кажется более читабельным? Понятно, что ты хочешь ответить "никакой", но вопрос не в этом.
ИШ считает более читабельным первый вариант, утверждая что IIF только ухудшает читабельность.
Мне более читабельным кажется второй вариант. И я считаю, что IIF при правильном применении улучшает читабельность.
Я сейчас вывожу HTML на дельфи - это само по себе гемор относительно WEB-ориентированных языков, но IIF упрощает на мой взгляд.
← →
Пит (2009-06-23 18:30) [28]Как пример могу привести вырезку из текущего кода:
case PropInfo.tp of
tpText: Result := Result + FormatMy(
"<tr><td>%s</td><td><input type=text name="%s" value="%s" %s %s /></td></tr>",
[FPropertyList.ValueFromIndex[i], FPropertyList.Names[i],
HTMLtoSpecialChars( DBFieldAsText(q, i) ),
IfThen(PropInfo.HTMLSize > 0, "size="+IntToStr(PropInfo.HTMLSize)),
IfThen(PropInfo.HTMLMaxLength > 0, "maxlength="+IntToStr(PropInfo.HTMLSize)) ]);
...........
Достаточно сильно сокращает запись, а такого кода много.
Ну и плюс читабельность более-менее на уровне имхо (не фонтан, но как сделать лучше выглядящим - не знаю).
← →
AndreyV © (2009-06-23 19:25) [29]> [28] Пит (23.06.09 18:30)
> Достаточно сильно сокращает запись, а такого кода много.
Я, как-то, это подозревал. Сокращение записи хорошо, там, где к месту.
← →
Пит (2009-06-23 19:35) [30]
> Я, как-то, это подозревал. Сокращение записи хорошо, там,
> где к месту.
очевиднейший факт. Все хорошо там, где к месту.
if хорош к месту, IIF хорош к месту, даже delphi хороша там, где к месту.
Непонятно только одно - что ты этим хотел сказать.
В данном конкретном примере [28] IfThen очень даже хорош. Без него на мой взгляд было бы длиннее и запутаннее.
← →
AndreyV © (2009-06-23 20:02) [31]> [30] Пит (23.06.09 19:35)
Я пропуск сделаю, оригинал перед глазами выще
...
> Непонятно только одно - что ты этим хотел сказать.
>
> В данном конкретном примере [28] IfThen очень даже хорош.
> Без него на мой взгляд было бы длиннее и запутаннее.
Да, ты сократил запись до одного оператора, но я с трудом не смог продраться через этот лес. Это так и надо?
← →
AndreyV © (2009-06-23 20:21) [32]> [31] AndreyV © (23.06.09 20:02)
> Да, ты сократил запись до одного оператора, но я с трудом
> не смог продраться через этот лес. Это так и надо?
Или надо взять мачету и разбить всё на строки с отступом?:)
← →
Rouse_ © (2009-06-24 00:26) [33]
> Пит (23.06.09 18:30) [28]
> Достаточно сильно сокращает запись, а такого кода много.
Ты сам себе деньги платишь и являешся техдиром или ответстенным за сдачу проекта?
Я тебе рассказываю то, что происходит на самом деле в коммерческих проектах.
Перестань уже крутиться среди ветрянных мельниц.
← →
ANB (2009-06-24 10:11) [34]
> Ты сам себе деньги платишь и являешся техдиром или ответстенным
> за сдачу проекта?
> Я тебе рассказываю то, что происходит на самом деле в коммерческих
> проектах.
> Перестань уже крутиться среди ветрянных мельниц.
Вашего бы тех.дира, дам к нам в контору.
Какой ииф вс иф ?????
Приходит код писанный как попало, по 5-10 пустых строк, выравнивание разношерстное.
exception
when others then
return 1;
- такое сплошь и рядом.
в лучшем случае :
exception
when others then
dbms_output.("Случилась ошибка");
return 1;
Это коммерческий проект, стоящий весьма приличных бабок.
← →
Пит (2009-06-24 12:37) [35]
> Да, ты сократил запись до одного оператора, но я с трудом
> не смог продраться через этот лес. Это так и надо?
уважаемый Андрей! Все же написано в посте [28], если ты перепишешь данный пример более читабельным - я тебе скажу только спасибо. Я не знаю как это сделать ((
Если совсем непонятно - объясню словами. Данная вырезка кода формирует строчку в HTML-таблице (<tr> ... </tr>). Описание параметра и его название берется из FPropertyList, который TStringList. Значение параметра берется из БД.
Также в структуре PropInfo прописаны некоторые характеристики.
Если PropInfo.HTMLSize больше нуля, то нужно его задать как свойство длины строки ввода. Если не задано (меньше равно нулю), то значит размер должен подбираться автоматически, в терминах HTML это просто отсутствие свойства Size у тега.
Аналогично с PropInfo.HTMLMaxLength.
Перепиши более удобоваримо на твой взгляд?
> Я тебе рассказываю то, что происходит на самом деле в коммерческих
> проектах.
> Перестань уже крутиться среди ветрянных мельниц.
Саааш... Ты сейчас такой, прости пожалуйста (!), галимый понт написал. Я уже несколько лет пишу за деньги. Ну а то что контора - лажа и проект - лажа, ну это понятно, тут обсуждать нечего.
Давай все таки будем общаться по существу. Если ты также как ИШ считаешь IfThen "плохим" оператором - пожалуйста, перепиши плиз пример из [28] в более читабельным виде.
Хочу повторить - то что проект полностью уродский, неправильно спроектированный и т.д. - это очевидно, это можно не писать.
← →
AndreyV © (2009-06-24 13:22) [36]> [35] Пит (24.06.09 12:37)
>
> > Да, ты сократил запись до одного оператора, но я с трудом
> > не смог продраться через этот лес. Это так и надо?
>
> уважаемый Андрей! Все же написано в посте [28], если ты
> перепишешь данный пример более читабельным - я тебе скажу
> только спасибо. Я не знаю как это сделать ((
...
расшифровку опускаю
Хорошо. Для простоты будем считать, что одновременно формируем один HTML.
Да хоть вот так бы, в таоём случае, определил бы парные функции с соответсвующими параметрами, для упрощения стороковые, и то уже лучше
Псевдокод в стиле Си++
hHTML OpenHTML(string s);
void CloseHTML(hHTML);
void OpenTag(string name, string s = "");
void CloseTag(string s);
Формирование
hHTML h = OpenHTML("MyHTML");
OpenTag("MyTag1");
OpenTag("MyTag2", MyFormat(...));
CloseTag("MyTag2");
CloseTag("MyTag1");
CloseHTML(h);
← →
Пит (2009-06-24 13:43) [37]
> Формирование
> hHTML h = OpenHTML("MyHTML");
> OpenTag("MyTag1");
> OpenTag("MyTag2", MyFormat(...));
> CloseTag("MyTag2");
> CloseTag("MyTag1");
> CloseHTML(h);
во-первых, не кажется ли тебе что этот набор комманд (кстати, с явно нестандартным форматированием) можно переписать куда проще:
HTML := Format(
"<html><MyTag1><MyTag2>%s</MyTag2></MyTag1></html>",
[...]);
Эта запись будет наверняка куда привычнее людям, которые работают с HTML и полюбому в свое время писали в том же блокноте.
Впрочем, мы начинаем каждый о своем. Я привел конкретный пример в [28]. Ты сказал нечитабельно. Перепиши плиз ТОТ ЖЕ ФУНКЦИОНАЛ более читабельно. Вот и все, это же просто?
Я сам считаю, что с позиции некоего идеала написано криво. Но лично я не могу написать более читабельно. Более того, я уж привык к такой конструкции и она мне кажется вполне читабельной. Но это ладно, лирика.
Перепишите приведенный пример в более удобном виде - я только за. Я не смог.
← →
AndreyV © (2009-06-24 13:55) [38]> [37] Пит (24.06.09 13:43)
> Перепишите приведенный пример в более удобном виде - я только
> за. Я не смог.
Напрягаться переписыванием мне сейчас не хочется.
Ну чем тебе не шаблон. И вспомнив о теме топика, не находишь, что вставленные условия if then else, будут куда читабельнее. Впрочем ты сам сказал, что тебе по-твоему удобнее.
← →
ANB (2009-06-24 14:04) [39]
> hHTML h = OpenHTML("MyHTML");
> OpenTag("MyTag1");
> OpenTag("MyTag2", MyFormat(...));
> CloseTag("MyTag2");
> CloseTag("MyTag1");
> CloseHTML(h);
Жуть.
1) У ПИТа все намного легче читается.
2) Тут еще придется репу чесать - а как оно в виде HTML получиться.
← →
Пит (2009-06-24 14:07) [40]напрягаться? Ну хз, в реальном проекте я этот кусок кода написал за пару минут не более. Это, видимо, еще один плюс данного подхода.
Мне уже и так советовали, и так советовали. Но никто не желает переписать пример в [28] )))
Давайте если будет пример - обсудим. А так какая-то чистая теория получается.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.006 c