Re: Оптимизировать или нет - на примере XSLT.
От: Niemand Австралия  
Дата: 03.07.08 18:59
Оценка: +2 :)
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Дело в том, что формы в админке у меня теперь генерируются в ТРИ прохода XSLT-процессора.


имхо, проще это решение проще пристрелить, чем оптимизировать

ДГ>Оптимизировать в ущерб компактноти кода я не намерен. Кто заговорит про требования по производительности, первым делом получит предложение переехать с php на java, а вторым — пойти куда подальше.


балланс производительность/к-во кода (времени) — спор давний и поклонники С++ и асма давно борятся с шарповщиками, вэбэшниками и делфистами. Потому если заказчику подходит — пусть он остается в счастливом невединии.
If the message above is in English — means I'm wasting my work time and work computer to post here. No hard feelings
Re: Оптимизировать или нет - на примере XSLT.
От: Lloyd Россия  
Дата: 04.07.08 07:21
Оценка: 6 (1) +1
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Комментарии?


Второй и третий этап делать на этапе деплоймента сайта. На выходе должно получиться большое количество xslt первого типа.
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re: Оптимизировать или нет - на примере XSLT.
От: c-smile Канада http://terrainformatica.com
Дата: 04.07.08 05:51
Оценка: +1
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Всем привет.


И вам, добрый человек, того же.

Интересно этом мне одному кажется что XSLT придумали больные люди?
Была такая мулечка одно время: "молодежь — на XML!"


Почему-то мне кажется что трансформации можно было бы описывать на языке гораздо более для того приспособленном чем XML.
Вообще это маразм использовать язык описания данных в роли процедурного. Или нет?
Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 03.07.08 18:35
Оценка:
Всем привет.

Долго думал, в какой форум — решил в профильный. Хотя любители покричать про тупых программистов, пишущих тормозные программы, тусуются в основном в КСВ. Сам я тоже склонен сочувствовать юзерам, не понимающим, почему компьютеры всё мощнее и мощнее, а софт всё тормознее и тормознее. Однако вчера, занимаясь причёсыванием своих PHP+XSLT наработок, почувствовал всю глубину диалектического дуализма ситуации. Дело в том, что формы в админке у меня теперь генерируются в ТРИ прохода XSLT-процессора.

Прежде чем я расскажу, как дошёл до такой жизни, хочу заметить, что убедить меня отказаться от этого решения можно только одним способом: предложив не менее компактную на уровне исходников и не менее удобную для использования альтернативу. Оптимизировать в ущерб компактноти кода я не намерен. Кто заговорит про требования по производительности, первым делом получит предложение переехать с php на java, а вторым — пойти куда подальше. И кстати, я не занимался замерами производительности XSLT, но склонен полагать, что его загрузка и интерпретация сжирает как минимум не меньше времени, чем собственно исполнение. А сами формы, обрабатывающиеся в несколько проходов, составляют лишь малую часть всего кода страницы.

Так вот, откуда три прохода.




Первый (с конца) проход. Если никаких форм на странице нет, он мог бы быть и единственным. На входе XML-дерево, содержащее полный неупорядоченный набор данных, необходимых для генерации HTML-кода страницы. На выходе — HTML. Я выделил жирным тот момент, который радикально расходится со всеми виденными мною примерами использования XSLT. В примерах логическая структура входного дерева заточена под требуемую структуру результата, например:

<!-- SOURCE -->
<goods>
    <r id="1"><title>DVD Player</title><price>$200</price></r>
    <r id="2"><title>Condom</title><price>$2</price></r>
</goods>

<!-- OUTPUT -->
<table>
    <thead>
        <tr><th>Title</th><th>Price</th></tr>
    </thead>
    <tbody>
        <tr><td>DVDPlayer</td><td>$200</td></tr>
        <tr><td>Condom</td><td>$2</td></tr>
    </tbody>
</table>


Ясно, что трансформацию здесь напишет и ребёнок. Но при этом накладываются непомерные требования на код, генерирующий входной XML: фактически, он ставится в зависимость от XSLT-слоя в частности и от дизайна вообще. Поэтому на все эти "good practices" я блогополучно забил, и чаще предпочитаю импортировать и наследовать <template name=""/>, чем <template match=""/> (к счастью, это возможно):

<!-- Overridable -->
<x:template name="title"/>
<x:template name="content"/>

<x:template match="/">
    <html>
        <head><title><x:call-template name="title"/></title></head>
        <body>
            ... <!-- header -->
            <x:call-template name="content"/>
            ... <!-- footer -->
        </body>
    </html>
</x:template>





Второй проход. Что меня постоянно напрягало в html-формах, это необходимость вручную прописывать значения по умолчанию в полях <input>. Далее, CSS селекторы невозможно настроить на input/@type, поэтому хотелось бы дублировать атрибут type в class. Также, атрибуты disabled="disabled" и readonly="readonly" раздражают своей громоздкостью и также напрашиваются на дублирование в class (в частности, я подсвечиваю readonly text field как disabled, чтобы народ не путался). И наконец, хотелось бы сделать автоматическую подсветку ошибочных полей, не накладывая ограничений на дизайн/вёрстку. Отсюда возникает следующая трансформация (привожу в несколько схематичном виде):

<!-- SOURCE -->
<f:form name="editpage"><table>
<tr>
    <th>URI:</th>
    <td><f:text name="uri" class="w100" readonly="1"/></td>
</tr>
<tr>
    <f:errclass/>  <!-- разворачивается в атрибут class="formerror" если count(/response/messages/error[@form='editpage' and @param='title'])!=0.
    <th>Title:<f:required/></th>
    <td><f:text name="title" class="w100"/></td>
</tr>
<tr>
    <th>Text:</th>
    <td><f:fckeditor name="text" class="w100"/></td>
</tr>
</f:form>

<!-- RESULT -->
<form name="editpage" method="post" action="{/response/paths/requestUri}"/><table>
<tr>
    <th>URI:</th>
    <td><input type="text" class="w100 text readonly" readonly="readonly" value="{/response/forms/editpage/uri}"/></td>
</tr>
<tr class="formerror">
    <th>Title:<span class="formrequired">*</span></th>
    <td><input type="text" class="w100 text" value="{/response/forms/editpage/title}"/></td>
</tr>
<tr>
    <th>Text:</th>
    <td><div class="fckeditor"><script type="text/javascript"> <!-- FCKEditor initialization code --></script></div></td>
</tr>
</form>


Здесь CSS-класс w100 — сокращение для {width:100%}. Как видите, трансформация достаточно прямолинейная, по крайней мере для стандартных полей: один элемент на входе, один на выходе. Так

Почему отдельный проход: из неструктурированного входного XML-дерева здесь получается HTML, но с вкраплениями элементов <f:*>, которые должны быть ещё раз оттранслированы. Здесь я поступаю совершенно грубо: поскольку форм у меня полно на самых разных страницах (а частенько формы логина и поиска присутствуют в основном шаблоне), я прогоняю повторно весь контент, вместо того, чтобы оборачивать каждую форму в аналогичную конструкцию:

<x:template match="/">
    <x:variable name="x">
        <x:copy-of select="/response"/>  <!-- обеспечивает доступ к полному входному XML-дереву изнутри вложенной обработки -->
        <x:apply-templates select="/" mode="ex"/>
    </x:variable>
    <x:apply-templates select="ex:node-set($x)/html"/>
</x:template>

<x:template match="/" mode="ex">
    <html>...</html>
</x:template/>





Третий (с конца) проход. Выписывать эти <table>, <tr>, <th>, <td> напрягает. Большинство форм имеют такую табличную структуру (а уж админские в моём праве сделать все такими), поэтому нужно бы автоматизировать. Однако для сохранения гибкости для всяких нетривиальных случаев дизайна необходимо оставить вышеописанные примитивы. Отсюда возникает следующая трансформация:

<!-- SOURCE -->
<ft:form name="editpage">
    <ft:text th="URI:" name="uri" class="w100" readonly="1"/>
    <ft:text th="Title:" required="1" name="title" class="w100"/>
    <ft:fckeditor th="Text:" name="text" class="w100"/>
</ft:form>

<!-- RESULT -->
<!-- См. SOURCE с предыдущего прохода. -->


Тупо свести <ft:form> к <x:call-template name="f:form"> не выходит, потому как внутри <f:form> генерируется дополнительный контент: <table>. Отсюда получаем следующее (несколько упрощённо, но "основано на реальных событиях"):

<x:template match="ft:form">
    <!-- Здесь я не только генерирую <f:*>, но и сразу же транслирую их в HTML. 
             Поэтому второй проход переведёт <ft:*> сразу в HTML. -->
    <x:variable name="x">
        <x:copy-of select="/response"/>
        <f:form>
            <x:apply-templates select="descendant::ft:hidden" mode="ft:_field"/>
            <x:copy-of select="@*"/>
            <table>
                <x:apply-templates/>
            </table>
        </f:form>
    </x:variable>
    <x:apply-templates select="ex:node-set($x)/f:form"/>
</x:template>

<!-- Already processed by <ft:form>, outside generated <table>. -->
<x:template match="ft:hidden"/>

<!-- Any ft:field syntax matches f:field syntax, including element name, attributes and content. 
     Added special attributes: @th, [@required=1]. -->
<x:template match="ft:*">
    <tr>
        <f:errclass/>
        <th>
            <x:value-of select="@th"/>
            <x:if test="@required=1">
                <f:required/>
            </x:if>
        </th>
        <td><x:apply-templates select="." mode="ft:_field"/></td>
    </tr>
</x:template>
    
<!-- INTERNAL. -->
<x:template match="ft:*" mode="ft:_field">
    <x:element name="f:{local-name()}">
        <x:copy-of select="@*[name()!='th' and name()!='required']"/>
        <x:apply-templates/>
    </x:element>
</x:template>





Комментарии?
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[2]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 03.07.08 19:24
Оценка:
Здравствуйте, Niemand, Вы писали:

ДГ>>Дело в том, что формы в админке у меня теперь генерируются в ТРИ прохода XSLT-процессора.


N>имхо, проще это решение проще пристрелить, чем оптимизировать


Гы. На самом деле можно оптимизировать. Тупо продублировать коды f:* в ft:*. Изначально у меня так и было, но я решил пойти по пути математиков: вылил нафиг всю воду из чайника, сведя задачу к уже решённой.

Несколько месяцев назад я обещал кому-то показать работающий крупный сайт с XSLT на стороне клиента. Однако ни черта у меня не вышло, в связи с JavaScript-related заморочками (впрочем, сайт тот загнулся сам по себе). А жаль, с точки зрения нагрузки на сервер этот вариант потянул бы на идеальный, если бы оказался действительно работоспособным.
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re: Оптимизировать или нет - на примере XSLT.
От: jazzer Россия Skype: enerjazzer
Дата: 04.07.08 00:50
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Прежде чем я расскажу, как дошёл до такой жизни, хочу заметить, что убедить меня отказаться от этого решения можно только одним способом: предложив не менее компактную на уровне исходников и не менее удобную для использования альтернативу. Оптимизировать в ущерб компактноти кода я не намерен. Кто заговорит про требования по производительности, первым делом получит предложение переехать с php на java, а вторым — пойти куда подальше.


Даже если это будет пользователь?
Даже если на форумах напишут: "А вот программа конкурента делает все то же самое, но работает вчетверо быстрее"?

Если у тебя цель — компактность кода, то тогда ты прав. Но это не самая распространенная цель обычно.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Оптимизировать или нет - на примере XSLT.
От: Cyberax Марс  
Дата: 04.07.08 01:09
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Даже если это будет пользователь?

J>Даже если на форумах напишут: "А вот программа конкурента делает все то же самое, но работает вчетверо быстрее"?
Для PHP? Смеёшься?
Sapienti sat!
Re[3]: Оптимизировать или нет - на примере XSLT.
От: jazzer Россия Skype: enerjazzer
Дата: 04.07.08 01:10
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, jazzer, Вы писали:


J>>Даже если это будет пользователь?

J>>Даже если на форумах напишут: "А вот программа конкурента делает все то же самое, но работает вчетверо быстрее"?
C>Для PHP? Смеёшься?

Пользователю пофиг, что на чем написано, ему функциональность нужна.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Оптимизировать или нет - на примере XSLT.
От: Cyberax Марс  
Дата: 04.07.08 01:35
Оценка:
Здравствуйте, jazzer, Вы писали:

J>>>Даже если это будет пользователь?

J>>>Даже если на форумах напишут: "А вот программа конкурента делает все то же самое, но работает вчетверо быстрее"?
C>>Для PHP? Смеёшься?
J>Пользователю пофиг, что на чем написано, ему функциональность нужна.
Я к тому, что пользователям, используюшим PHP скорость как таковая не очень-то важна. Если работает быстрее секунды — то всё нормально.
Sapienti sat!
Re[5]: Оптимизировать или нет - на примере XSLT.
От: jazzer Россия Skype: enerjazzer
Дата: 04.07.08 01:37
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, jazzer, Вы писали:


J>>>>Даже если это будет пользователь?

J>>>>Даже если на форумах напишут: "А вот программа конкурента делает все то же самое, но работает вчетверо быстрее"?
C>>>Для PHP? Смеёшься?
J>>Пользователю пофиг, что на чем написано, ему функциональность нужна.
C>Я к тому, что пользователям, используюшим PHP скорость как таковая не очень-то важна. Если работает быстрее секунды — то всё нормально.

Ну разве что...
Ну тогда это из серии "преждевременная оптимизация"

P.S. Ты вообще не спишь, что ли? В Киеве же полпятого утра сейчас
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: Оптимизировать или нет - на примере XSLT.
От: Cyberax Марс  
Дата: 04.07.08 01:42
Оценка:
Здравствуйте, jazzer, Вы писали:

C>>Я к тому, что пользователям, используюшим PHP скорость как таковая не очень-то важна. Если работает быстрее секунды — то всё нормально.

J>Ну разве что...
J>Ну тогда это из серии "преждевременная оптимизация"
Именно.

J>P.S. Ты вообще не спишь, что ли? В Киеве же полпятого утра сейчас

Я только четыре часа назад проснулся
Sapienti sat!
Re[7]: Оптимизировать или нет - на примере XSLT.
От: jazzer Россия Skype: enerjazzer
Дата: 04.07.08 01:45
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, jazzer, Вы писали:


C>>>Я к тому, что пользователям, используюшим PHP скорость как таковая не очень-то важна. Если работает быстрее секунды — то всё нормально.

J>>Ну разве что...
J>>Ну тогда это из серии "преждевременная оптимизация"
C>Именно.
но тогда и пользователи не будут возмущаться, а всех остальных можно отправлять по градиенту, если это не начальство, конечно, хотя его тоже иногда можно

И вообще, лучший индикатор нужности оптимизации: "А пользователь это заметит?"

J>>P.S. Ты вообще не спишь, что ли? В Киеве же полпятого утра сейчас

C>Я только четыре часа назад проснулся
А, ты все еще практикуешь "два часа поспал — два часа поел"? И как оно на сегодняшний день?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[8]: Оптимизировать или нет - на примере XSLT.
От: Cyberax Марс  
Дата: 04.07.08 02:00
Оценка:
Здравствуйте, jazzer, Вы писали:

C>>Именно.

J>но тогда и пользователи не будут возмущаться, а всех остальных можно отправлять по градиенту, если это не начальство, конечно, хотя его тоже иногда можно
J>И вообще, лучший индикатор нужности оптимизации: "А пользователь это заметит?"
Согласен.

C>>Я только четыре часа назад проснулся

J>А, ты все еще практикуешь "два часа поспал — два часа поел"? И как оно на сегодняшний день?
Нет, у меня скорее 27-часовой день теперь
Sapienti sat!
Re: Оптимизировать или нет - на примере XSLT.
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.07.08 03:44
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Всем привет.

Вообще, XSLT исторически работал в режиме интерпретации. Что обеспечивало относительно низкую скорость преобразований.
Затем хитрые люди придумали, что можно ведь по XSLT сгенерировать код программы на языке высокого уровня, которой на вход подается некий IXPathNavigable, а на выходе — соответствующий текст, XML или HTML. Это позволяет существенно поднять скорость преобразований (т.к. программа потом компилируется в целевой код) даже без особых оптимизаций.
Чисто теоретически, умная среда исполнения должна уметь компилировать также и цепочку XSLT преобразований. Ведь если ты можешь выполнить "подстановку", то и программа сможет, не так ли? А значит ты можешь получить максимальную производительность при максимально компактном коде.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Оптимизировать или нет - на примере XSLT.
От: Pavel Dvorkin Россия  
Дата: 04.07.08 05:45
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:


ДГ>Сам я тоже склонен сочувствовать юзерам, не понимающим, почему компьютеры всё мощнее и мощнее, а софт всё тормознее и тормознее.


!!!!!! Дали бы нам эти машины лет 20 — 25 назад !!!!
With best regards
Pavel Dvorkin
Re[2]: Оптимизировать или нет - на примере XSLT.
От: jazzer Россия Skype: enerjazzer
Дата: 04.07.08 05:54
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Дм.Григорьев, Вы писали:


ДГ>>Всем привет.


CS>И вам, добрый человек, того же.


CS>Интересно этом мне одному кажется что XSLT придумали больные люди?

CS>Была такая мулечка одно время: "молодежь — на XML!"
CS>

CS>Почему-то мне кажется что трансформации можно было бы описывать на языке гораздо более для того приспособленном чем XML.

CS>Вообще это маразм использовать язык описания данных в роли процедурного. Или нет?

имхо, процедурное использование XSLT — это неправильное его использование.
Должно быть только описание правил преобразования, декларативно-функциональное, и все.
Этого должно быть достаточно для любых преобразований.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 04.07.08 06:35
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Почему-то мне кажется что трансформации можно было бы описывать на языке гораздо более для того приспособленном чем XML.


Кто-то его здесь ругал в своё время чёрным матом. Агитировал за XQuery. Как по мне, лучше уж Scala — она статически типизирована. А XQuery — преимущество только в компактном синтаксисе. Но для PHP даже эта альтернатива недоступна. На PHP ради скорости можно юзать только одно: echo "<td>" . $obj->title() . "</td>". Но это фантастически быстро приводит к бардаку. Используя XSLT, я себя тупо дисциплинирую в плане разделения кода и представления.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[5]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 04.07.08 06:37
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я к тому, что пользователям, используюшим PHP скорость как таковая не очень-то важна. Если работает быстрее секунды — то всё нормально.


У меня сайты на одном ядре Core2 Duo 1800, DDR2 667 отрабатывают 10 запросов в секунду (замерялость тупым локальным for () do; wget; done). Как говорится, е#у и плачу.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[3]: Оптимизировать или нет - на примере XSLT.
От: c-smile Канада http://terrainformatica.com
Дата: 04.07.08 06:49
Оценка:
Здравствуйте, jazzer, Вы писали:

J>имхо, процедурное использование XSLT — это неправильное его использование.

J>Должно быть только описание правил преобразования, декларативно-функциональное, и все.

Какое угодно. Только human readable.

J>Этого должно быть достаточно для любых преобразований.


Статические преобразования не всегда эффективны.
Есть ситуации когда процедурный подход позволяет редуцировать complexity.
Иногда с O(n*n) до O(n). Все в общем как всегда — все хорошо что в меру.
Re[2]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 04.07.08 09:15
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Второй и третий этап делать на этапе деплоймента сайта. На выходе должно получиться большое количество xslt первого типа.


Весьма хорошая идея, жаль я сам не додумался. Надо обмозговать преобразования на этапе сборки.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[3]: Оптимизировать или нет - на примере XSLT.
От: Plague Россия 177230800
Дата: 04.07.08 09:20
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Несколько месяцев назад я обещал кому-то показать работающий крупный сайт с XSLT на стороне клиента. Однако ни черта у меня не вышло, в связи с JavaScript-related заморочками (впрочем, сайт тот загнулся сам по себе). А жаль, с точки зрения нагрузки на сервер этот вариант потянул бы на идеальный, если бы оказался действительно работоспособным.


Возможно, вместо XSLT на стороне клиента лучше воспользоваться JSONT, можно глянуть примеры использования.

Возможно могло бы получится нечто интересное, вопрос только в том, что об этом подумает гугл. =)
... << RSDN@Home 1.2.0 alpha rev. 787>>
Re[4]: Оптимизировать или нет - на примере XSLT.
От: WolfHound  
Дата: 05.07.08 13:20
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Какое угодно. Только human readable.

При правильном использовании для правильных целей придумать что-то более человекочитаемое и столь же уневерсальное очень трудно.

CS>Статические преобразования не всегда эффективны.

CS>Есть ситуации когда процедурный подход позволяет редуцировать complexity.
CS>Иногда с O(n*n) до O(n). Все в общем как всегда — все хорошо что в меру.
Пример в студию.
... << RSDN@Home 1.2.0 alpha rev. 745>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 05.07.08 13:37
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Чисто теоретически, умная среда исполнения должна уметь компилировать также и цепочку XSLT преобразований.


Гы, вот именно, что теоретически, да умная. Мы про PHP говорим или где?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[5]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 05.07.08 13:37
Оценка:
Здравствуйте, WolfHound, Вы писали:

CS>>Какое угодно. Только human readable.

WH>При правильном использовании для правильных целей придумать что-то более человекочитаемое и столь же уневерсальное очень трудно.

Что в данном случае имеется в виду?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[5]: Оптимизировать или нет - на примере XSLT.
От: c-smile Канада http://terrainformatica.com
Дата: 06.07.08 23:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, c-smile, Вы писали:


CS>>Какое угодно. Только human readable.

WH>При правильном использовании для правильных целей придумать что-то более человекочитаемое и столь же уневерсальное очень трудно.

Коэффициенты возможностей перемножаются:

P(При правильном использовании) * P(для правильных целей)


Даже при условии 50 на 50 в обоих случаях твоё утверждение истинно с возможностью 0.25

CS>>Статические преобразования не всегда эффективны.

CS>>Есть ситуации когда процедурный подход позволяет редуцировать complexity.
CS>>Иногда с O(n*n) до O(n). Все в общем как всегда — все хорошо что в меру.

WH>Пример в студию.


Легко:

http://www.tkachenko.com/blog/archives/000268.html

Straightforward declarative solution = O(maxDepth*maxDepth*n) with worst case O(n*n)
Procedural = O(n).
Re[2]: Оптимизировать или нет - на примере XSLT.
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.08 15:07
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>!!!!!! Дали бы нам эти машины лет 20 — 25 назад !!!!



Новый процессор Intel Pentium позволяет выполнять до 10 миллионов сбоев в секунду!

Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Оптимизировать или нет - на примере XSLT.
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.08 15:08
Оценка:
Здравствуйте, c-smile, Вы писали:

Со всем до этого согласен.

CS>Вообще это маразм использовать язык описания данных в роли процедурного. Или нет?


Он не процедурный. Он специализированный, функциональный.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Оптимизировать или нет - на примере XSLT.
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.08 15:10
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Есть ситуации когда процедурный подход позволяет редуцировать complexity.

CS>Иногда с O(n*n) до O(n). Все в общем как всегда — все хорошо что в меру.

В этой области функциональный подход ни чем не отличается от процедурного за одним исключением — он предотвращает императивные ошибки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Не выходит каменный цветок.
От: Дм.Григорьев  
Дата: 09.07.08 16:25
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Второй и третий этап делать на этапе деплоймента сайта. На выходе должно получиться большое количество xslt первого типа.


Что-то ничего путного в голову не приходит. Все эти вложенные трансформации опираются на данные входного XML, и сделать универсальный трансформатор XSL->XSL, выполняющий "flatten layers" в отсутствии этого самого входного XML, и без перезатачивания под него исходных XSL, представляется слишком громоздким (получается полноценный компилятор XSLT), если вообще реальным.
RSDN@Home 1.1.4 stable SR1 rev. 568
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re: Оптимизировать или нет - на примере XSLT.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 09.07.08 19:21
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Тупо свести <ft:form> к <x:call-template name="f:form"> не выходит, потому как внутри <f:form> генерируется дополнительный контент: <table>.


Честно говоря, не очень понял.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[2]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 09.07.08 20:27
Оценка:
Здравствуйте, AndrewVK, Вы писали:

ДГ>>Тупо свести <ft:form> к <x:call-template name="f:form"> не выходит, потому как внутри <f:form> генерируется дополнительный контент: <table>.


AVK>Честно говоря, не очень понял.


В некоторых случаях бывает удобно делать так:

<x:template match="a:something" name="a:something">
    <x:with-param name="attr" select="@attr"/>
        <x:if test="$attr='...'">
            ...
        </x:if>
</x:template>


В этом случае данный шаблон можно вызывать двумя способами:

<a:something attr="..."/>


и

<x:call-template name="a:something">
    <x:with-param name="attr" select="..."/>
</x:call-template>


Первый способ выглядит гораздо приятнее, поэтому им я при возможности и пользуюсь. Тот факт, что я выполняю второй проход над всем сгенерированным контентом (см. <template match="/"/> в корневном сообщении), обеспечивает его полное разворачивание. Я это использую, например, при генерации контролов для постраничной навигации в списках. Примитивы выглядят так:

<!-- Overridable. -->
<x:template name="p:pfirst-text">&lt;&lt;</x:template/>

<x:template match="*" mode="p:first" name="p:first" xmlns:p="http://dimgel.ru/xmlns/paginator">
    <x:param name="x" select="."/>
    <x:choose>
        <x:when test="$x/@pageNo &gt; 1">
            <a href="{/*/sys/paths/requestUriPage}1"><x:call-template name="p:first-text"/></a>
        </x:when>
        <x:otherwise>
            <span class="disabled"><x:call-template name="p:first-text"/></span>
        </x:otherwise>
    </x:choose>
</x:template>


Здесь входной элемент $x имеет атрибуты @pageNo, @pageCount, @pageSize, @rowCount (и дочки <r>, каждая дочка потом мапится в строку таблицы-списка). Код, собирающий эти примитивы в кучу под конкретный дизайн конкретного сайта выглядит, например, так:

<x:template match="*" mode="pagination">
    <table class="pagination"><tr>
        <td class="pl">
            <x:value-of select="'страница'"/>
            <x:call-template name="p:first"/>
            <x:call-template name="p:prev"/>
            <span class="pmargins">
                <x:call-template name="p:numbers"/>
            </span>
            <x:call-template name="p:next"/>
            <x:call-template name="p:last"/>
        </td>
        <td class="pr">
            <x:value-of select="'строк на странице'"/>
            ....
        </td>
    </tr></table>
</x:template>


Здесь я использую <x:call-template name="p:first"> вместо <p:first/>, чтобы не увеличивать требуемый уровень вложенности обработки, поскольку вызов <x:apply-templates select="..." mode="pagination"/> может использоваться, например, из какого-нибудь <adm:pagedlist .../>. Хотя на данный момент этого нет, и мог бы и написать компактнее и красивше:

<x:template match="*" mode="pagination">
    <table class="pagination"><tr>
        <td class="pl">
            <!-- это кстати чистое пижонство, чтобы в режиме <x:output indent="no"/> 
                весь результирующий HTML был в одну строку, без \n -->
            <x:value-of select="'страница'"/>  
            <p:first/>
            <p:prev/>
            <span class="pmargins"><p:numbers/></span>
            <p:next/>
            <p:last/>
        </td>
        <td class="pr">
            <x:value-of select="'строк на странице'"/>  <!-- ну и это тоже :) -->
            ....
        </td>
    </tr></table>
</x:template>


Как провернуть такой фокус в случае <ft:form>, не понятно, потому что и <ft:form>, и подавно <f:form> получают из вызывающего контекста произвольные атрибуты и контент. Они выполняют <x:apply-templates/> на своих дочках, при этом все не-специальные элементы, атрибуты и текстовые узлы просто копируются в выходной документ. Никаких ограничений. Не писать же что-то вроде следующего:

<x:template match="ft:form">
        <x:call-template name="f:form">
          <x:with-param .../>   <!-- ВСЕ возможные и невозможные атрибуты -->
            ...
            <x:with-param name="content">
                <tr>
                    <th>Title:</th>
                    <td><x:call-template name="f:text">
                        <x:with param .../>  <!-- опять ВСЕ возможные атрибуты -->
                        ...
                    </x:call-template></td>
                </tr>
                ...
        </x:call-template>
</x:template>


Гы, вот тут без косвенности. Только я её мама писать такое.
RSDN@Home 1.1.4 stable SR1 rev. 568
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[3]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 09.07.08 20:54
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>>>Тупо свести <ft:form> к <x:call-template name="f:form"> не выходит, потому как внутри <f:form> генерируется дополнительный контент: <table>.


AVK>>Честно говоря, не очень понял.


ДГ>В некоторых случаях бывает удобно делать так:


В общем, используя свои элементы вместо <x:call-template/> и <x:apply-templates/>, я повышаю читабельность исходников и отвязываюсь от структуры входного документа (уменьшаю зависимость генерирующего XML кода от дизайна). Ценой необходимости дополнительных проходов.

ДГ>потому что и <ft:form>, и подавно <f:form> получают из вызывающего контекста произвольные атрибуты и контент. [...] Никаких ограничений.


Выделить "произвольные" жирным забыл.
RSDN@Home 1.1.4 stable SR1 rev. 568
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[3]: Оптимизировать или нет - на примере XSLT.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.07.08 08:50
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>В этом случае данный шаблон можно вызывать двумя способами:


ДГ>
ДГ><a:something attr="..."/>
ДГ>


ДГ>и


ДГ>
ДГ><x:call-template name="a:something">
ДГ>    <x:with-param name="attr" select="..."/>
ДГ></x:call-template>
ДГ>


ДГ>Первый способ выглядит гораздо приятнее, поэтому им я при возможности и пользуюсь.


Т.е. единственная причина, по которой у тебя куча проходов, это то, что тебе кажется, что match выглядит приятнее call-template???
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[4]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 10.07.08 09:58
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Т.е. единственная причина, по которой у тебя куча проходов, это то, что тебе кажется, что match выглядит приятнее call-template???


Я в самом конце написал насчёт произвольного контента и атрибутов у <f:form> с невозможностью ввернуть это всё в call-template — это и есть главная причина. А раз уж я ввязялся в двухпроходную обработку, было бы глупо не использовать вытекающие из неё удобства.
RSDN@Home 1.1.4 stable SR1 rev. 568
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[5]: Оптимизировать или нет - на примере XSLT.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.07.08 10:23
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Я в самом конце написал насчёт произвольного контента и атрибутов у <f:form> с невозможностью ввернуть это всё в call-template — это и есть главная причина.


Тогда опять непонятно. Только не надо, плиз, приводить опять горы кода.

ДГ> А раз уж я ввязялся в двухпроходную обработку, было бы глупо не использовать вытекающие из неё удобства.


Тогда с самого начала — зачем тебе вообще понадобилась двухпроходная обработка? Насколько я понял описанную задачу — все спокойно решается одним проходом без каких либо ухудшений читаемости.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[6]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 10.07.08 11:05
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Тогда опять непонятно. Только не надо, плиз, приводить опять горы кода.


AVK>Тогда с самого начала — зачем тебе вообще понадобилась двухпроходная обработка? Насколько я понял описанную задачу — все спокойно решается одним проходом без каких либо ухудшений читаемости.


Я с самого начала написал достаточно прямолинейно: покажите мне такое решение. Для форм, дающее аналогичные возможности и гибкость. Буду весьма признателен. Но пока что никто не удосужился.
RSDN@Home 1.1.4 stable SR1 rev. 568
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[7]: Оптимизировать или нет - на примере XSLT.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.07.08 11:11
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Я с самого начала написал достаточно прямолинейно: покажите мне такое решение.


Какое такое? Ты всерьез рассчитываешь, что я будут продираться через килобайты твоего кода? В чем конкретно проблема?

ДГ> Для форм, дающее аналогичные возможности и гибкость. Буду весьма признателен. Но пока что никто не удосужился.


А потому что никто тоже не хочет разбираться с твоим решением, да потом еще и новое придумывать. Это немалый объем работы, из чистого энетузиазма вряд ли кто на такое сподобится.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[6]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 10.07.08 11:17
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>Только не надо, плиз, приводить опять горы кода.


Гы-гы-гы. Вот по факту мои усилия оказываются направленными на войну с этим б#$&ским языком, в котором любая попытка программировать в процедурном стиле через call-template оборачивается горами кода.

Вот смотри, ещё философское соображение: я писал в корневом сообщении, что входной XML у меня неструктурированный, чтобы не привязывать php-код к дизайну. Получается, что первым проходом я компенсирую это отсутствие структуры на входе, генерируя структуру без данных. А на втором проходе делаю собственно то, для чего XSLT удобен — выполняю трансформацию на готовой структуре (т.е. перегоняю из пустого в порожнее... замечательный язык). А чтобы сделать это всё за раз, и не увязнуть в горах кода... Я начинаю уже подумывать, что Smarty — не такая уж и плохая вещь...
RSDN@Home 1.1.4 stable SR1 rev. 568
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[7]: Оптимизировать или нет - на примере XSLT.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.07.08 11:20
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Гы-гы-гы. Вот по факту мои усилия оказываются направленными на войну с этим б#$&ским языком


Ты поаккуратнее с матюками.

ДГ>, в котором любая попытка программировать в процедурном стиле через call-template


С чего ты взял, что call-template это процедурный стиль?

ДГ> оборачивается горами кода.


У тебя код трансформации либо есть, либо его нет. От того что ты его на несколько проходов расцепил, количество кода не уменьшится.

ДГ>Вот смотри, ещё философское соображение: я писал в корневом сообщении, что входной XML у меня неструктурированный, чтобы не привязывать php-код к дизайну.


Непонятно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[8]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 10.07.08 11:24
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>А потому что никто тоже не хочет разбираться с твоим решением, да потом еще и новое придумывать. Это немалый объем работы, из чистого энетузиазма вряд ли кто на такое сподобится.


Аааа... Так весь вопрос в том, что тебе читать лениво? Так бы и сказал. Забей, никакой проблемы у меня нет, меня всё устраивает. А приводил я все эти горы кода на случай "вдруг кому-то интересно". Сложных и неоднозначных примеров использования XSLT в сети я не видел (вернее, видел главы из книги на xmlhack.ru, но там заумь иного рода), вот и надеялся вызвать людей на обсуждение.
RSDN@Home 1.1.4 stable SR1 rev. 568
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
Re[9]: Оптимизировать или нет - на примере XSLT.
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 10.07.08 11:27
Оценка:
Здравствуйте, Дм.Григорьев, Вы писали:

ДГ>Аааа... Так весь вопрос в том, что тебе читать лениво?


Не весь конечно, но и это тоже.

ДГ> Забей, никакой проблемы у меня нет, меня всё устраивает.


Я пытаюсь тебе помочь.

ДГ> А приводил я все эти горы кода на случай "вдруг кому-то интересно".


Это ради бога. Но, ИМХО, стоит все же сформулировать конкретные вопросы, а не вопрос в стиле "вот куча кода, что у меня не так?". Это даже тебе самому поможет.
... << RSDN@Home 1.2.0 alpha 4 rev. 1095 on Windows Vista 6.0.6001.65536>>
AVK Blog
Re[10]: Оптимизировать или нет - на примере XSLT.
От: Дм.Григорьев  
Дата: 10.07.08 11:53
Оценка:
Здравствуйте, AndrewVK, Вы писали:

AVK>ИМХО, стоит все же сформулировать конкретные вопросы, а не вопрос в стиле "вот куча кода, что у меня не так?".


ДГ>>>>>>>>> Дело в том, что формы в админке у меня теперь генерируются в ТРИ прохода XSLT-процессора.

ДГ>>>>>>>>> ...убедить меня отказаться от этого решения можно только одним способом: предложив не менее компактную на уровне исходников и не менее удобную для использования альтернативу

RSDN@Home 1.1.4 stable SR1 rev. 568
http://dimgel.ru/lib.web — thin, stateless, strictly typed Scala web framework.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.