Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.23;
Скачать: CL | DM;

Вниз

Существует в Дельфи функция IIF ?   Найти похожие ветки 

 
Пит   (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;
Скачать: CL | DM;

Наверх




Память: 0.63 MB
Время: 0.014 c
15-1245913258
b/@.
2009-06-25 11:00
2009.08.23
К чему может привести частое использование overload функций?


15-1245993338
Leonid Troyanovsky
2009-06-26 09:15
2009.08.23
ММДМ 25.06.09


1-1212546310
San1712
2008-06-04 06:25
2009.08.23
Как добавлять строки в TListView компонент чтобы он не мигал ?


2-1245775600
marantz85
2009-06-23 20:46
2009.08.23
Как записать в memorystream динамический массив Double -ов?


15-1245911928
desc
2009-06-25 10:38
2009.08.23
Не получается "слиять" два поля... Postgres