В чем разница между прицелом 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, удаленный вызов...)

Другие вопросы по тегам