В чем разница между прицелом var и вызовом геттерной модели?
В чем разница между:
<div data-sly-test.backgroundVideo="${hero.backgroundVideo}" >
Background video URL:
<a href="${backgroundVideo}.html" target="_blank">
${backgroundVideo}
</a>
</div>
а также:
<div data-sly-test="${hero.backgroundVideo}" >
Background video URL:
<a href="${hero.backgroundVideo}.html" target="_blank">
${hero.backgroundVideo}
</a>
</div>
Какое решение более эффективно? Использование переменной зрения или вызова геттера?
2 ответа
С другой стороны, как и любой другой язык программирования аналогичного домена, не предъявляет никаких требований к использованию переменных. Простым сравнением было бы преобразовать код в эквивалентную подпрограмму Java и увидеть эффект оптимизации и производительности (теоретически).
Для простоты давайте создадим класс POJO, как показано ниже:
class Hero {
public string getBackgroundVideo() {
//Some model logic
}
}
Теперь рассмотрим первый фрагмент кода:
<div data-sly-test.backgroundVideo="${hero.backgroundVideo}" >
Background video URL:
<a href="${backgroundVideo}.html" target="_blank">
${backgroundVideo}
</a>
</div>
Это только выполнит getBackgroundVideo()
один раз и сохранить его в переменной для повторного использования.
В качестве альтернативы для второго фрагмента кода:
<div data-sly-test="${hero.backgroundVideo}" >
Background video URL:
<a href="${hero.backgroundVideo}.html" target="_blank">
${hero.backgroundVideo}
</a>
</div>
getBackgroundVideo()
будет выполнен 3 раза.
Таким образом, на первый взгляд это может выглядеть как разница в исполнении 1:3 и выглядеть очень дорого, особенно, если в
getBackgroundVideo()
функция. Это действительно так, и вам следует избегать такого подхода, пытаясь кэшировать выходные данные сложных функций в качестве переменных.
Однако, принимая альтернативный взгляд на проблему, это также сводится к тому, насколько хорошо написан ваш класс POJO. Итак, давайте вернемся к вашему Hero
учебный класс:
class Hero {
private string backgroundVideo;
public void init() {
this.backgroundVide = "some value on business logic";
}
public string getBackgroundVideo() {
return this.backgroundVideo;
}
}
Если твой Hero
Класс POJO реализован, как указано выше, getBackgroundVideo()
просто сводится к простому получателю, который возвращает строковое значение без сложных вычислений. Конечно, есть издержки при вызове функции по сравнению с локальной переменной HTL, но это будет минимальным и, вероятно, незаметным.
Подводя итог, можно сказать, что реальный эффект можно измерить только с помощью реализации POJO, но подход с использованием переменных HTL почти всегда даст вам преимущество в кэшировании.
Разница, как вы заметили, в том, что оценка ${hero.backgroundVideo}
кэшируется в переменной. Это оказывает некоторое влияние на производительность, поскольку устраняет необходимость в некотором размышлении, чтобы найти правильный метод для вызова hero
; влияние может быть намного больше, если вызываемый метод дорогой (поиск JCR, удаленный вызов...)