Форум: "Прочее";
Текущий архив: 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] )))
Давайте если будет пример - обсудим. А так какая-то чистая теория получается.
← →
AndreyV © (2009-06-24 14:18) [41]> [39] ANB (24.06.09 14:04)
> Жуть.
> 1) У ПИТа все намного легче читается.
> 2) Тут еще придется репу чесать - а как оно в виде HTML
> получиться.
Куда-то сообщение пропало. Повтор.
А когда много вложенных по условию тэгов будет - линейный подход не пройдёт, нет, он конечно пройдёт, но я не завидую.
← →
AndreyV © (2009-06-24 14:20) [42]> [40] Пит (24.06.09 14:07)
> Давайте если будет пример - обсудим. А так какая-то чистая
> теория получается.
Давайте подождём, я вроде четко выразился.
← →
Пит (2009-06-24 14:26) [43]
> А когда много вложенных по условию тэгов будет - линейный
> подход не пройдёт
брр... А где вообще сказано, что надо писать в одну линию весь код? Думаем... и делаем:
HTML := HTML + Format(
"<table border=0>"
+"<tr class="%s">"
+"<td>Еханный бабай</td><td>%s</td>"
+"</tr>"
+"<tr class="%s">"
+"<td>Где бабай?</td><td>%s</td>"
+"</tr>"
+"</table>",
[...]);
Конечно, в WEB-ориентированных языках это смотрелось бы красивее... Но впрочем я жду опять же твоего более читабельного аналога.
← →
Пит (2009-06-24 14:34) [44]На самом деле, видно, что я не изобретал ничего нового. Это стандартный подход форматирования в том же PHP, он реально удобен, доказано тысячами программистов по всеми миру. И собственно он соответствует логике выдаваемого документа.
Только в PHP не было бы постоянных плюсов и открывания, закрываний строк. И имена переменных указывались бы прямо в тексте, а не в конце функции Format. Да и самой функции Format не было бы, она встроена на уровне языка. Было бы аля (точно за правильность не ручаюсь, подзабыл уже):
HTML = HTML.
"<table border=0>
<tr class=$trClass>
<td>Еханный бабай</td><td>$Title</td>
</tr>
<tr class=$trClass>
<td>Где бабай?</td><td>$Desc</td>
</tr>
</table>" ;
Более удобно я просто не представляю как. Четко видно, что собственно этот же подход я и использую, только с немного портящим картину синтаксисом Delphi.
← →
AndreyV © (2009-06-24 14:35) [45]> [43] Пит (24.06.09 14:26)
> брр... А где вообще сказано, что надо писать в одну линию
> весь код? Думаем... и делаем:
>
> Конечно, в WEB-ориентированных языках это смотрелось бы
> красивее... Но впрочем я жду опять же твоего более читабельного
> аналога.
Странный спор ты тему не забыл:). Ну смотри:
HTML := HTML + Format(
"<table border=0>"
+"<tr class="%s">"
если не бабай то
+"<td>опайка из десяти строк</td><td>%s</td>"
иначе
+"<td>Еханный бабай</td><td>%s</td>"
+"<td>опака из десяти строк</td><td>%s</td>"
+"</tr>"
+"<tr class="%s">"
+"<td>Где бабай?</td><td>%s</td>"
+"</tr>"
+"</table>",
[...]);
← →
Пит (2009-06-24 14:47) [46]AndreyV, я тему не забыл, я отвечал на твой странный коммент, что все "линейно".
Насчет твоего примера в [45]... А с каких пор внутри функции Format можно использовать условные операторы?
Ты как бы разделяй... Если ты хочешь повогорить об общей бесполезности IfThen - то перепиши пример [28] плиз.
Пример в [43] лишь демонстрация того, что проблема:
> А когда много вложенных по условию тэгов будет - линейный
> подход не пройдёт, нет, он конечно пройдёт, но я не завидую.
>
проблемой вовсе не является.
← →
AndreyV © (2009-06-24 14:59) [47]> [46] Пит (24.06.09 14:47)
> AndreyV, я тему не забыл, я отвечал на твой странный коммент,
> что все "линейно".
>
> Насчет твоего примера в [45]... А с каких пор внутри функции
> Format можно использовать условные операторы?
Я показал пример дублирования и пользу функционального программирования в этом примере. Ты не увиливай.
О переписывании я ответил, вроде понятно, и не в две минуты это выльется.
← →
Пит (2009-06-24 15:08) [48]Ладно, демагогия пошла.
Если будет альтернативный, по твоему мнению более читабельный аналог - давай обсудим. Пока только все говорят, что плохо, но никто не написал как лучше. У всех "нет времени", хотя многие имхо уже потратили куда больше времени, чем заняло бы переписывание... Впрочем, ладно.
лично я не спешу, за веткой слежу. Можно продолжить обсуждение в любое время (пока файловый движок этого форума не грохнет из-за "оптимизации" ветку), мне самому интересно.
← →
Иа (2009-06-24 16:17) [49]
> HTML := Format(
> "<html><MyTag1><MyTag2>%s</MyTag2></MyTag1></html>",
> [...]);
>
> Эта запись будет наверняка куда привычнее людям, которые
> работают с HTML и полюбому в свое время писали в том же
> блокноте.
Так мы про html программистов или про дельфистов? Либо одно либо другое. То что у тебя написано - так действительно писали когда то в php или старом asp. С точки зрения дельфиста или дотнета - это кошмарный код который не стоит показывать что бы не засмеяли. К примеру, если завтра понадобится добавить javascript в конец для трэккера - ты будешь искать все места где ты вставляешь /html? Или будет требование к xhtml - будешь чистить и смотреть как бы где не ошибся с тагом? Какая у тебя валидация производимого html? Где гарантия или хотя бы частичная уверенность что ты нигде в своем коде не опечатался и не забыл кавачки? Это для тестера работа или ты юниттесты пишешь на каждый случай? Мы пишем на обьектных языках - так пользуйся средствами которые тебе на халяву дают
Я бы сделал примерно так на C#
void Foo(Stream outputStream)
{
using (html(outputStream))
{
using (body(outputStream))
{
WriteTag("MyTag1", value);
WriteTag("MyTag2", value);
}
}
}
← →
Пит (2009-06-24 16:33) [50]
> Я бы сделал примерно так на C#
так мы про дельфи программистов или про шарпщиков? )))
Перепиши на дельфи, пожалуйста, мне так понятнее будет. Плюс не надо элементарный пример, перепиши плиз функционал примера [28] - именно о нем идет речь. Он ведь коротенький.
> так действительно писали когда то в php
а сейчас так в PHP не пишут? А как бы сейчас в PHP переписали бы пример из [44], ну или можно тот же [28]?
← →
Иа (2009-06-24 17:54) [51]
> > Я бы сделал примерно так на C#
>
> так мы про дельфи программистов или про шарпщиков? )))
То что разницы нет ты не понял?
> Перепиши на дельфи, пожалуйста, мне так понятнее будет.
> Плюс не надо элементарный пример, перепиши плиз функционал
> примера [28] - именно о нем идет речь. Он ведь коротенький.
Я на делфи не пишу уже. Не понятен пример? А, дошло, кажется. Сколько ты программируешь профессионально?
Stream result
using (new tr(result))
{
writeTag(new td(result, FPropertyList[i]));
using (new td(result)
{
writeTag(new textInput(result, FPropertyList.Keys[i], DBFieldAsText(q, i), PropInfo.HTMLSize));
}
}
Главный пойнт в том что операций над строками в приложении должно быть как можно меньше - и по возможности их надо выносить в маленькие куски где легче править и отлаживать. В данном случае в коде самого приложения таких операций нет вообще. Захочу - положу шаблоны в базу. Захочу - буду брать из файла. Захочу - сделаю многоязычное приложение а основной код этого и не заметит - для него все прозрачно.
Для классов тэгов пишутся unit tests и имеем если не гарантированное отсутствие ошибок то по крайней мере их количество будет несравненно меньше чем пр размазанном string concatenation по твоему коду.
>
> > так действительно писали когда то в php
>
> а сейчас так в PHP не пишут? А как бы сейчас в PHP переписали
> бы пример из [44], ну или можно тот же [28]?
В 5.0 появилась приличная поддержка OOP. А что касается как то зависит от программиста. Пословицу про программу на фортране знаешь?
← →
Пит (2009-06-24 18:35) [52]10 минут думал, что отвечать. Могу ввязаться в дискуссию, но это бесполезный флуд страниц на 5 выйдет. То, что ты крут у меня вопросов не вызывает.
Что касается меня - обойдусь малым. Поскольку пишу на дельфи, то с радостью увидел бы красивый, "читабельный" аналог примера из поста [28] на том же самом дельфи.
← →
Иа (2009-06-24 18:58) [53]Про стаж вопрос был не в обиду - хотелось понять на каком уровне разговаривать. в любом случае учись читать и понимать код на разных языках. А что касается самого вопроса - все что мог сказать я сказал. Если ты не видишь разницы между подходами - ничего не могу поделать. радуйся что ты не у меня в команде :)
← →
Пит (2009-06-24 19:16) [54]
> Про стаж вопрос был не в обиду - хотелось понять на каком
> уровне разговаривать
ну да, конечно. У тебя есть умение по трудовой книжке и стажу угадывать степень профессионализма человека.. Сам то веришь?
Такой вопрос в интернете задается исключительно для понтокидательства. Точно также как вопрос о возрасте человека - это вообще самый примитивный способ поиска аргументов в свою пользу.
Задавая такой вопрос ожидается, что ответ в количественном виде будет меньше, чем у самого задающего. Это подсознательный способ убеждения самого себя в собственной правоте. Вопрос о стаже задается строго тогда, когда есть уверенность, что собственный стаж выше опонента и хочется подтверждения. Вопрос о возрасте задается в таких же случаях.
При этом опять же подсознательно имеется в виду, что если выше возраст (стаж), то значит ты больше разбираешься в вопросе. Несмотря на то, что при прямом обсуждении вопроса зависимости Скила от Возраста почти каждый может привести обратные примеры, что некто в 40 лет тупее 20-ти летнего.
Впрочем, психика логике не подчиняется, поэтому на самом деле результат ответа особо ничего не изменит, человек хочет верить, что прав и ищет любые, пусть даже косвенные, подтверждения своей правоты, которые, возможно, в другой ситуации он сам бы засмеял.
Если ответ будет ожидаемым, то реакция аля "Ну я так и знал, мал ты еще", если ответ будет не ожидаемым (например, оказывается стаж опонента выше собственного), реакция будет в стиле "Странно, такой большой, а ничему не научился". Ни подход, ни мнение это не поменяет.
← →
Пит (2009-06-24 19:31) [55]Да и все фразы пестрят штампами... Хоть разбирай:
> Про стаж вопрос был не в обиду - хотелось понять на каком
> уровне разговаривать
ага, хотелось понять. Можно подумать, что от этого понимания зависит степень признания того или иного кода правильным. Если у меня стаж 1 год - ты согласишься, что формировать HTML правильно таким-то образом. А если стаж 10 лет - ты скажешь, что формировать HTML правильно иным способом? ))))
> в любом случае учись читать и понимать код на разных языках
неплохой наезд. Не учтено только одно - ты сам не можешь написать простейший код на дельфи )) И вот в этом свете нравоучения насчет "учись, учись" уже вызывают улыбку ))
В дельфи нет шаблонов, в дельфи нет автоматической сборки мусора, в дельфи достаточно много чего нету. поэтому единственный способ гарантировано закрыть открытый тег другим оператором - это использования блока try.. finally аля:s := s + "<tr>";
try
...
finally
s := s + "</tr>";
end;
Или если угодно:OpenTag(blabla);
try
...
finally
CloseTag ;
end;
если писать в таком стиле - это будет нихрена не читабельно.
> Если ты не видишь разницы между подходами - ничего не могу
> поделать
я то вижу разницу в подходах. А вот ты когда выгодно - видишь ее, когда не выгодно - не видишь.
Вот пример, когда тебе выгодно:>Так мы про html программистов или про дельфистов? Либо одно либо другое
А вот на мой стёб в ответе тебе уже другое выгодно:> так мы про дельфи программистов или про шарпщиков? )))
То что разницы нет ты не понял?
Значит, когда HTML программисты и дельфи программисты - это ой как разное. А когда дельфи программисты и C# программисты - это ясен пень одинаковое...
Много мог бы написать, надоело )
← →
Пит (2009-06-24 19:35) [56]блин, все таки неударжался я ))) надо было заканчивать на посте [52]. Больше не буду, можешь сделать вид, что дальнейших постов я не писал.
Итог флейма один - если кто готов на ДЕЛЬФИ переписать пример более грамотно из [28] - я реально бы посмотрел с вниманием.
← →
Иа (2009-06-24 21:17) [57]
> > так мы про дельфи программистов или про шарпщиков? )))
> То что разницы нет ты не понял?
>
> Значит, когда HTML программисты и дельфи программисты -
> это ой как разное. А когда дельфи программисты и C# программисты
> - это ясен пень одинаковое...
То есть не понял. ну ладно. дальнейшую дискуссию с тобой можно считать закрытой.
← →
Пит (2009-06-24 23:01) [58]Ух, ну вот и здорово )))
Ждем знатоков, которые умеют не только читать дельфи код, но и писать его )) (извините, не удержался )) ), красиво перепишущих [28]
← →
Kerk © (2009-06-24 23:13) [59]Ну вообще товаристч абсолютно прав по сути. Каша в виде смеси программного кода и html-кода по определению плохо читаема. Потому даже в том же PHP используют шаблонные движки. Если в VCL нет шаблонов, это не значит, что не нужно разделять код и представление.
← →
Пит (2009-06-24 23:20) [60]
> Каша в виде смеси программного кода и html-кода по определению
> плохо читаема
с одной стороны я вроде как с тобой согласен.
С другой стороны, очевидной фишкой PHP является как раз прозрачное слияние html-кода и программного кода.
А еще можно учесть то, что существует и все более используется JavaScript... А это вообще, вроде как бы и часть HTML, а вроде бы и программа. Слишком все переплелось...
← →
antonn © (2009-06-24 23:25) [61]
> С другой стороны, очевидной фишкой PHP является как раз
> прозрачное слияние html-кода и программного кода.
очень сомнительная фишка и у меня вызывает неприязнь
← →
Пит (2009-06-25 12:18) [62]
> очень сомнительная фишка и у меня вызывает неприязнь
Ну как сказать... Ведь сейчас по новым тенденциям HTML это всего лишь логическое представление данных, то есть это сам по себе каркас, можно сказать "код".
А вот представление - это уже стили, CSS... Так что тут не все однозначно.
← →
Бурундук (2009-06-25 13:17) [63]2Пит (24.06.09 19:35) [56]
>Мне уже и так советовали, и так советовали.
>Но никто не желает переписать пример в [28] )))
>Давайте если будет пример - обсудим.
>А так какая-то чистая теория получается.
Я бы, вероятно, написал что-нибудь в таком духе:
Result := Result + GetBlockClass(PropInfo.tp).GetBlockText(PropInfo, FPropertyList, i, q);
...
class function TInputTextBlock.GetBlockText(PropInfo, FPropertyList, i, q): string; // override;
var Caption, Name, Value, SizeAttr, MaxLengthAttr: string;
function OptionalAttr(const Name: string; Value: Integer): string;
begin
if Value = 0 then
Result := "";
else
Result := Name + "=" + IntToStr(Value);
end;
begin
Caption := FPropertyList.ValueFromIndex[i];
Name := FPropertyList.Names[i];
Value := HTMLtoSpecialChars( DBFieldAsText(q, i) );
SizeAttr := OptionalAttr("size", PropInfo.HTMLSize);
MaxLengthAttr := OptionalAttr("maxlength", PropInfo.HTMLMaxLength);
Result := FormatMy("<tr><td>%s</td><td><input type=text name="%s" value="%s" %s %s /></td></tr>",
[Caption, Name, Value, SizeStr, MaxLengthStr]);
end;
← →
Пит (2009-06-25 13:32) [64]
> Caption := FPropertyList.ValueFromIndex[i];
> Name := FPropertyList.Names[i];
> Value := HTMLtoSpecialChars( DBFieldAsText(q, i) );
>
> SizeAttr := OptionalAttr("size", PropInfo.HTMLSize);
> MaxLengthAttr := OptionalAttr("maxlength", PropInfo.HTMLMaxLength);
>
>
> Result := FormatMy("<tr><td>%s</td><td><input type=text
> name="%s" value="%s" %s %s /></td></tr>",
> [Caption, Name, Value, SizeStr, MaxLengthStr]);
Ну фиг знает... Ты реально считаешь это более читабельным, чем [28]? Просто введена куча переменных, которые и подставлены в функцию Format... Чем это читабельнее? Просто если формирование большое, ахренеешь от секции объявления переменных...
>MaxLengthAttr := OptionalAttr("maxlength", PropInfo.HTMLMaxLength);
а это вообще без комментариев. Введена функция, которая по функционалу более ограничена, чем существующая функция IfThen.
Твой вариант:function OptionalAttr(const Name: string; Value: Integer): string;
begin
if Value = 0 then
Result := "";
else
Result := Name + "=" + IntToStr(Value);
end;
SizeAttr := OptionalAttr("size", PropInfo.HTMLSize);
А мой вариант этой же записи:SizeAttr := IfThen( PropInfo.HTMLSize>0, "size" + IntToStr(PropInfo.HTMLSize) );
В твоем варианте не надо будет каждый раз условие прописывать (>0), с другой стороны такое встречается два раза в коде всего у меня, но опять же пока.
И вот есть смысл вводить функцию или нет... По-моему, вопрос начинает упираться в "какой цвет лучше зеленый или красный"...
← →
Бурундук (2009-06-25 15:01) [65]>Ты реально считаешь это более читабельным, чем [28]
Я считаю более читабельным
Result := Result + GetBlockClass(PropInfo.tp).GetBlockText(PropInfo, FPropertyList, i, q);
чем
case PropInfo.tp of
{далее много кода}
Ну а на счёт метода TInputTextBlock.GetBlockText -
понятно же, что он делает. Чего ещё?..
Переменные введены просто для того, чтобы назвать вещи
своими именами. Это существенно для читабельности.
>Просто если формирование большое, ахренеешь от
>секции объявления переменных...
Я сильно подозреваю, что в этом случае охренеешь
и без неё. Тут нужны радикальные меры.
>а это вообще без комментариев. Введена функция, которая
>по функционалу более ограничена, чем существующая функция IfThen.
Ну и что? Замена функции OptionalAttr на IfThen сэкономит тебе
несколько строк кода. Но разве код от этого станет более понятным?
Вобщем, моё мнение таково: если функция IfThen позволяет
улучшить читабельность некоторого кода (что вполне возможно),
то сам этот факт характеризует данный код не с лучшей стороны.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2009.08.23;
Скачать: [xml.tar.bz2];
Память: 0.68 MB
Время: 0.01 c