Какое преимущество шаблона без логики (например, усы)?

В последнее время я столкнулся с mustache, который, как утверждается, является шаблоном без.

>

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

Ответ 1

Другими словами, это мешает вам стрелять в ногу. В старые дни JSP было очень распространено, что JSP файлы были посыпаны кодом Java, что делало рефакторинг намного сложнее, так как у вас был разбросан код.

Если вы предотвращаете логику в шаблонах по дизайну (например, усы), вам придется поместить логику в другое место, чтобы ваши шаблоны оказались незагроможденными.

Еще одно преимущество заключается в том, что вы вынуждены думать с точки зрения разделения проблем: ваш контроллер или логический код должны будут массировать данные перед отправкой данных в пользовательский интерфейс. Если вы позже переключите свой шаблон на другой (скажем, вы начнете использовать другой механизм шаблонов), переход будет простым, потому что вам нужно было только реализовать детали пользовательского интерфейса (так как на шаблоне нет логики, помните).

Ответ 2

У меня такое чувство, что я почти один, по моему мнению, но я твердо в противоположном лагере. Я не считаю, что возможное смешение бизнес-логики в ваших шаблонах является достаточным основанием для того, чтобы не использовать всю мощь вашего языка программирования.

Обычный аргумент для шаблонов без логики заключается в том, что если у вас есть полный доступ к вашему языку программирования, вы можете смешивать логику, которой нет места в шаблоне. Я считаю это сродни рассуждениям, что вы должны использовать ложку, чтобы нарезать мясо, потому что вы можете порезаться, если используете нож. Это очень верно, и все же вы будете гораздо более продуктивны, если будете использовать последнее, хотя и осторожно.

Например, рассмотрим следующий фрагмент шаблона, используя mustache:

{{name}}:
<ul>
  {{#items}}
    <li>{{.}}</li>
  {{/items}}
</ul>

Я могу это понять, но я нахожу следующее (используя underscore), чтобы быть намного более простым и прямым:

<%- name %>:
<ul>
<% _.each(items, function(i){ %>
  <li><%- i %></li>
<% }); %>
</ul>

Как я уже сказал, я понимаю, что логичные шаблоны имеют преимущества (например, они могут использоваться с несколькими языками программирования без изменений). Я думаю, что эти другие преимущества очень важны. Я просто не думаю, что их логическая природа - одна из них.

Ответ 3

Усы не имеют логики-меньше?

Разве это не так:

{{#x}}
  foo
{{/x}}
{{^x}}
  bar
{{/x}}

Довольно похоже на это?

if x
  "foo"
else
  "bar"
end

И разве это не похоже на (чтение: почти определение) логики представления?

Ответ 4

Шаблон без логики - это шаблон, содержащий дыры для заполнения, а не как их заполнять. Логика помещается в другое место и отображается непосредственно в шаблон. Такое разделение проблем является идеальным, потому что тогда шаблон может быть легко построен с другой логикой или даже с другим языком программирования.

Из руководства усов:

Мы называем это "без логики", потому что там не являются утверждениями if, else else или для петель. Вместо этого есть только теги. Некоторые теги заменяются на ценность, не что иное, а другие ряд значений. Этот документ объясняет различные типы Теги усы.

Ответ 5

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

Ответ 6

Отражающая сторона монеты заключается в том, что в отчаянной попытке вывести бизнес-логику из презентации вы в конечном итоге ставите много логики представления в модель. Общим примером может быть то, что вы хотите поместить "нечетные" и "четные" классы в переменные строки в таблице, что может быть сделано с помощью простого оператора modulo в шаблоне представления. Но если ваш шаблон просмотра не позволяет вам это сделать, то в данных модели вам нужно не только сохранить, какая строка является нечетной, но и точной, но в зависимости от того, насколько ограничен ваш механизм шаблонов, вам может даже понадобиться загрязнить вашу модель с именами фактических классов CSS. Представления должны быть отделены от моделей полной остановки. Но модели также должны быть View agnostic, и что многие из этих "не-логических" движков шаблонов заставляют вас забыть. Логика идет в обоих местах, но вы должны быть разумными относительно того, что логика действительно делает, чтобы правильно решить, куда она идет. Является ли это проблемой для представления или заботой о бизнесе/данных? Для того, чтобы иметь 100% первозданный вид, загрязнение просто попадает в другое менее заметное, но не менее подходящее место.

Там растущее движение назад в другом направлении, и, надеюсь, что-то будет находиться где-то в более разумной среде.

Ответ 7

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

Появляется мини-rant (не стесняйтесь игнорировать):

Если вы не хотите продолжать чтение. Мой короткий ответ на указанную выше тему: Я не согласен с шаблонами без логики. Я думаю об этом как о программирующей форме экстремизма.:-): -)

Теперь мое разглашение продолжается в полном разгаре:: -)

Я думаю, что когда вы принимаете много идей до крайности, результат становится смехотворным. И иногда (т.е. эта тема) проблема заключается в том, что мы принимаем "неправильную" идею до крайности.

Удаление всей логики из представления является "смехотворным" и неправильной идеей.

Вернитесь на минутку.

Вопрос, который нам нужно задать себе, - это то, почему нужно удалить логику? Концепция, очевидно, разделение проблем. Держите обработку представления как отдельную от бизнес-логики, насколько это возможно. Зачем это делать? Это позволяет нам менять вид (для разных платформ: мобильный, браузер, рабочий стол и т.д.), И это позволяет нам более легко обменивать поток управления, последовательность страниц, изменения валидации, изменения модели, доступ к безопасности и т.д. Также, когда логика удаленный из представлений (особенно веб-видов), он делает представления более читабельными и, следовательно, более удобными для обслуживания. Я понимаю это и соглашаюсь с этим.

Однако основной упор должен делаться на разделение проблем. Не 100% без логики. Логика в представлениях должна относиться к тому, как визуализировать "модель". Насколько мне известно, логика в взглядах совершенно прекрасна. У вас может быть логика просмотра, которая не является бизнес-логикой.

Да, еще в тот день, когда мы писали JSP, PHP или ASP-страницы с небольшим разделением логики кода и логики просмотра или без него, обслуживание этих веб-приложений было абсолютным кошмаром. Поверь мне, я знаю, я создал, а затем поддерживал некоторые из этих чудовищ. Именно на этом этапе обслуживания я действительно понял (в визуальном порядке) ошибку моих и моих коллег.:-): -)

Итак, эдикт с высоты (отраслевые эксперты) стал, вы должны структурировать свои веб-приложения, используя что-то вроде контроллера на переднем плане (который отправляется обработчикам или действиям [выберите ваш веб-фреймворк]), и ваши взгляды должны не содержат кода. Представления должны были стать немыми шаблонами.

Таким образом, я согласен в целом с вышеупомянутым чувством, а не на специфику пунктов эдикта, а скорее на мотивацию эдикта - это стремление к разграничению проблем между взглядом и бизнес-логикой.

В одном проекте, в котором я участвовал, мы пытались следовать идее без логики с нелепым экстремалом. У нас был домашний движок шаблонов, который позволил бы нам отображать объекты модели в html. Это была простая система на основе токенов. Это было ужасно по одной простой причине. Иногда в представлении мы должны были решить, должен ли я отобразить этот небольшой фрагмент HTML.. или нет.. Решение обычно основывается на некотором значении в модели. Когда у вас нет абсолютно никакой логики в представлении, как вы это делаете? Ну, ты не можешь. У меня были некоторые серьезные аргументы в пользу нашего архитектора. Внешние HTML-люди, которые пишут наши взгляды, были полностью укоренились, когда они столкнулись с этим, и были очень подчеркнуты, потому что не могли достичь своих простых целей. Поэтому я представил концепцию простой IF-инструкции в нашем шаблоне. Я не могу описать вам облегчение и спокойствие, которое последовало. Проблема была решена с помощью простой концепции IF-Statement в наших шаблонах! Вдруг наш шаблонный двигатель стал хорошим.

Итак, как мы попали в эту глупую стрессовую ситуацию? Мы сосредоточились на неправильной цели. Мы следовали правилу, у вас не должно быть логики в ваших взглядах. Это было неправильно. Я думаю, что "правило большого пальца" должно быть, минимизируйте количество логики в ваших представлениях. Потому что, если вы этого не сделаете, вы можете непреднамеренно позволить бизнес-логике проникнуть в представление - что нарушает разделение проблем.

Я понимаю, что когда вы заявляете, что "у вас не должно быть логики в представлениях", становится легко узнать, когда вы являетесь "хорошим" программистом. (Если это ваша мера добра). Теперь попробуйте реализовать веб-приложение даже средней сложности с помощью приведенного выше правила. Это не так легко сделать.

Для меня правило логики в представлениях не так ясно и откровенно, что я хочу, чтобы это было.

Когда я вижу много логики в представлениях, я обнаруживаю запах кода и пытаюсь устранить большую часть логики из представлений - я пытаюсь обеспечить жизнь бизнес-логики в другом месте - я пытаюсь разделить проблемы. Но когда я начинаю болтать с людьми, которые говорят, что мы должны удалить всю логику из представления, ну, для меня, это просто поражает фанатизм, поскольку я знаю, что вы можете оказаться в ситуациях, подобных описанным выше.

Я закончил с моей напыщенностью.: -)

Приветствия,

Дэвид

Ответ 8

Самый лучший аргумент, который я придумал для безликих шаблонов, - это то же самое, что и на клиенте и на сервере. Однако вам действительно не нужен логичный, просто тот, у которого есть собственный "язык". Я согласен с людьми, которые жалуются, что усы бессмысленно ограничивают. Спасибо, но я большой мальчик, и я могу сохранить свои шаблоны без вашей помощи.

Другим вариантом является просто найти синтаксис шаблонов, который использует язык, который поддерживается как на клиенте, так и на сервере, а именно на javascript на сервере либо с помощью node.js, либо вы можете использовать js-интерпретатор и json через что-то вроде therubyracer.

Тогда вы можете использовать что-то вроде haml.js, которое намного чище, чем любой из приведенных примеров, и отлично работает.

Ответ 9

В одном предложении: Logic-less означает, что сам движок шаблона менее сложный и, следовательно, имеет меньший размер и существует меньше способов для него вести себя неожиданно.

Ответ 10

Несмотря на то, что вопрос старен и отвечает, я хотел бы добавить свой 2 ¢ (что может показаться напыщенным, но это не так, его ограничения и когда они становятся неприемлемыми).

Цель шаблона - выдать что-то, а не выполнять бизнес-логику. Теперь есть тонкая грань между тем, что вы не можете делать то, что вам нужно сделать в шаблоне, и иметь в них "бизнес-логику". Несмотря на то, что я действительно позитивно относился к Усы и пытался использовать его, я оказался не в состоянии делать то, что мне нужно, в довольно простых случаях.

"массирование" данных (использование слов в принятом ответе) может стать реальной проблемой - даже простые пути не поддерживаются (что-то, что касается Handlebars.js). Если у меня есть данные просмотра, и мне нужно настроить его каждый раз, когда я хочу что-то сделать, потому что мой механизм шаблонов слишком ограничен, тогда это не помогает в конце. И он побеждает часть независимости платформы, которую утверждает усы для себя; Я должен дублировать логику массажа везде.

Тем не менее, после некоторого разочарования и после того, как мы попробовали другие механизмы шаблонов, мы создали собственный (... еще один...), в котором используется синтаксис, созданный шаблонами .NET Razor. Он анализируется и компилируется на сервере и генерирует простую автономную JS-функцию (фактически как модуль RequireJS), которую можно вызвать для "выполнения" шаблона, возвращая в качестве результата строку. Образец, представленный brad, будет выглядеть так, когда мы используем наш движок (который я лично нахожу намного лучше в читабельном сравнении по сравнению с Mustache и Underscore):

@name:
<ul>
@for (items) {
  <li>@.</li>
}
</ul>

Еще одно ограничение без логики поразило нас, когда вы вызывали частицу с Усы. Хотя частичные файлы поддерживаются Mustache, нет возможности настроить данные, которые будут переданы в первую очередь. Поэтому вместо того, чтобы создавать модульный шаблон и повторно использовать небольшие блоки, я в конечном итоге делаю шаблоны с повторяющимся кодом в них.

Мы решили, что, реализуя язык запросов, вдохновленный XPath, который мы назвали JPath. В принципе, вместо использования/для перемещения к детям мы используем точки, и поддерживаются не только строковые, числовые и булевы литералы, но также объекты и массивы (как JSON). Язык является свободным от побочных эффектов (который является обязательным для шаблонов), но позволяет "массировать" данные по мере необходимости, создавая новые литералы.

Предположим, мы хотим отобразить таблицу "сетки данных" с cusomizable заголовками и ссылками на действия над строками, а затем динамически добавлять строки с помощью jQuery. Поэтому строки должны быть частичными, если я не хочу дублировать код. И там, где возникает проблема, если какая-то дополнительная информация, например, какие столбцы должны быть визуализированы, является частью модели представления и одинакова для этих действий в каждой строке. Вот какой-то фактический рабочий код с использованием нашего шаблона и механизма запросов:

Шаблон таблицы:

<table>
    <thead>
        <tr>
            @for (columns) {
                <th>@title</th>
            }
            @if (actions) {
                <th>Actions</th>
            }
        </tr>
    </thead>
    <tbody>
        @for (rows) {
            @partial Row({ row: ., actions: $.actions, columns: $.columns })
        }
    </tbody>
</table>

Шаблон строки:

<tr id="@(row.id)">
    @for (var $col in columns) {
        <td>@row.*[name()=$col.property]</td>
    }
    @if (actions) {     
        <td>
        @for (actions) {
            <button class="btn @(id)" value="@(id)">@(name)...</button>
        }
        </td>
    }
</tr>

Вызов из JS-кода:

var html = table({
    columns: [
        { title: "Username", property: "username" },
        { title: "E-Mail", property: "email" }
    ],
    actions: [
        { id: "delete", name: "Delete" }
    ],
    rows: GetAjaxRows()
})

В нем нет бизнес-логики, но он многократно используется и настраивается, и он также является побочным эффектом.

Ответ 11

Вот три способа рендеринга списка, с символьным числом. Все, кроме первого и самого короткого, имеют логические схемы без шаблонов.

CoffeeScript (с реактивный кофе производитель DSL) - 37 символов

"#{name}"
ul items.map (i) ->
  li i

Нокаут - 100 символов

<span data-bind="value: name"/>
<ul data-bind="foreach: items">
   <li data-bind="value: i"/>
</ul>

Ручки/Усы - 66 символов

{{name}}:
<ul>
  {{#items}}
    <li>{{.}}</li>
  {{/items}}
</ul>

Подчеркивание - 87 символов

<%- name %>:
<ul>
<% _.each(items, function(i){ %>
  <li><%- i %></li>
<% }); %>
</ul>

Обещание шаблонов без логики было, я полагаю, тем, что люди с более широкими навыками могли бы управлять шаблонами без логики, не стреляя себе в ногу. Однако то, что вы видите в приведенных выше примерах, заключается в том, что при добавлении минимально-логического языка к разметке на основе строк результат более сложный, не менее. Кроме того, вы выглядите так, как будто вы используете PHP старой школы.

Ясно, что я не возражаю против сохранения "бизнес-логики" (расширенного вычисления) из шаблонов. Но я думаю, что, давая им псевдоязык для логики отображения вместо языка первого класса, цена оплачивается. Не просто больше набирать, а отвратительное сочетание контекстного переключения, кому-то нужно его прочитать.

В заключение я не вижу логики шаблонов без логики, поэтому я бы сказал, что их преимущество для меня ноль, но я уважаю, что многие в сообществе видят это по-другому:)

Ответ 12

Я согласен с Брэдом: стиль underscore легче понять. Но я должен признать, что синтаксический сахар не может понравиться всем. Если _.each несколько запутанно, вы можете использовать традиционный цикл for.

  <% for(var i = 0; i < items.length; i++) { %>
    <%= items[i] %>
  <% } %>

Всегда хорошо, если вы можете отказаться от стандартных конструкций, таких как for или if. Просто используйте <% if() %> или <% for() %>, а Mustache используйте несколько неологизм для if-then-else (и сбив с толку, если вы не читали документацию):

{{#x}}
  foo
{{/x}}
{{^x}}
  bar
{{/x}}

Механизм шаблонов отлично работает, когда вы можете легко вставлять вложенные шаблоны (стиль underscore):

<script id="items-tmpl" type="text/template">
    <ul>
        <% for(var i = 0; i < obj.items.length; i++) { %>
            <%= innerTmpl(obj.items[i]) %>
        <% } %>
    </ul>
</script>

<script id="item-tmpl" type="text/template">
    <li>
        <%= name %>
    </li>
</script>

var tmplFn = function(outerTmpl, innerTmpl) {
    return function(obj) {
        return outerTmpl({obj: obj, innerTmpl: innerTmpl});
    };
};

var tmpl = tmplFn($('#items-tmpl').html(), $('#item-tmpl').html());
var context = { items: [{name:'A',{name:'B'}}] };
tmpl(context);

В основном вы передаете свой внутренний tmpl как свойство вашего контекста. И назовите его соответствующим образом. Сладкий:)

Кстати, если единственным интересующим вас материалом является механизм шаблонов, используйте автономную реализацию шаблона. Он только 900 символов при минировании (4 длинные строки):

https://gist.github.com/marlun78/2701678

Ответ 13

Основными преимуществами использования шаблонов без логики являются:

  • Строго обеспечивает разделение представления модели, см. этот документ для подробностей (рекомендуется)
  • Очень легко понять и использовать, потому что не нужна логика программирования (и знание!), а синтаксис минимален
  • (конкретный Mustache) высоко портативный и независимый от языка, может использоваться без изменений практически во всех средах программирования