Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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");


Ну и чтобы не загромождать программу немецким языком, использовать with

 with 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.006 c
11-1203360484
someone
2008-02-18 21:48
2009.08.23
Подскажите когда и как надо освобождать TOpenSaveDialog


1-1212748708
Ольга
2008-06-06 14:38
2009.08.23
Компонента cxGrid (DevExpress)


1-1212645024
EgorovAlex
2008-06-05 09:50
2009.08.23
Есть TAction и он назначен кнопке в тулбаре и пункту меню,


15-1245823916
balepa
2009-06-24 10:11
2009.08.23
Отвалился конденсатор на GF8500


3-1226034688
Liones
2008-11-07 08:11
2009.08.23
Таблицы Paradox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский