0

有什么区别:

<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>

什么解决方案更有效?使用视觉变量还是调用 getter?

4

2 回答 2

3

正如您所注意到的,不同之处在于,评估${hero.backgroundVideo}缓存在变量中。这对性能有一些影响,因为它消除了进行一些反思以找到合适的调用方法的需要hero;如果调用的方法很昂贵(JCR 查找、远程调用......),影响可能会大得多

于 2017-08-24T08:39:35.747 回答
2

就像任何其他类似领域的编程语言一样,Sightly 不会对变量的使用提出任何要求。一个简单的比较是将代码转换为等效的 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;
    }

}

如果您的HeroPOJO 类如上实现,则getBackgroundVideo()归结为一个简单的 getter,它返回一个字符串值而无需复杂的计算。当然,与本地 HTL 变量相比,函数调用的开销是很小的,而且可能不明显。

总而言之,实际效果只能通过 POJO 实现来衡量,但 HTL 变量方法几乎总是会给您带来缓存的好处。

于 2017-08-25T10:25:02.530 回答