ColdFusion结构化直接赋值与对象文字符号

时间:2010-03-24 10:54:50

标签: coldfusion

较新版本的ColdFusion(我相信CF 8和9)允许您使用类似于JSON的对象文字符号创建结构。

我的问题是,对于基本上是静态的数据,使用对象文字符号对个别作业是否有特定的好处(执行效率可能)?

例如:

通过个人作业,你可以这样做:

var user = {};
user.Fname = "MyFirstnam";
user.Lname = "MyLastName";
user.titles = [];
ArrayAppend(user.titles,'Mr');
ArrayAppend(user.titles,'Dr.');

对于对象文字,你会做类似的事情。

var user = {Fname = "MyFirstnam",
            Lname = "MyLastName",
            titles = ['Mr','Dr']};

现在这个有限的例子很简单,但如果title是一个结构数组(说一个地址数组),那么文字符号就变得很难处理了。

2 个答案:

答案 0 :(得分:4)

文字符号是声明性编程,而不是程序编程。

使用文字符号,您只需一步即可清楚地告诉计算机您想要的内容。如果没有字面符号,你可以一点一点地慢慢地构建你想要的东西,而且没有清晰度。

请注意,CF8中的文字符号充其量是尴尬和缺陷。它应该很少使用,然后只在简单的情况下使用。 CF9中的字面符号很好。

对于CF8,您可以定义助手:

function $A() {
    var r = [ ];
    var i = 0;
    var m = ArrayLen(Arguments);
    for(i = 1; i <= m; i += 1)
        ArrayAppend(r, Arguments[i]);
    return r;
}
function $S() {
    return StructCopy(Arguments);
}

并使用它们:

var user = $S(
    Fname = "MyFirstnam",
    Lname = "MyLastName",
    titles = $A('Mr', 'Dr')
);

这些帮助程序一直工作,保留struct key case(struct keys不仅仅是大写的,而是在键入时加入),并且无限制地递归嵌套。

答案 1 :(得分:4)

在我尝试任何事情之前,我立刻想到文字会更快,因为你在运行时创建了所需的一切,并且不需要浪费时间创建变量,然后调用函数来追加所有这些。

然后我写了一个小测试,生成一个包含结果的图表。你让我很好奇: - )

结果证明我是对的,因为图表显示了一个惊人的差异,你可以看到: alt text http://i44.tinypic.com/jiz8lw.jpg

但要记住,虽然有人会跳过字面符号,但我认为重要的是要记住字面符号可能很尴尬,并且大部分时间都会混淆更多。

显然,如果你正在开发一个真正需要速度提升的页面,那么字面符号就是你正在寻找的,但要注意有时在CF8上,它会产生一些奇怪的行为。

只是为了向您展示我运行的那种测试:

<cfset aLiterals = arrayNew(1) />
<cfset aDirect = arrayNew(1) />

<cfsilent>
    <cfloop from="1" to="10000" index="mm">

        <!--- LITERAL --->
        <!--- start timer --->
        <cfset start = getTickcount() />
        <cfloop from="1" to="1000" index="ii">  
            <cfset user = {Fname = "MyFirstnam", Lname = "MyLastName", titles = ['Mr','Dr']} />
        </cfloop>
        <!--- end timer --->
        <cfset end = getTickCount()>

        <!--- Display total time --->
        <cfset total = end-start>
        <cfset arrayAppend(aLiterals,total) />

        <!--- DIRECT --->
        <!--- start timer --->
        <cfset start1 = getTickcount() />
        <cfloop from="1" to="1000" index="jj">
            <cfset user = {} />
            <cfset user.Fname = "MyFirstnam" />
            <cfset user.Lname = "MyLastName" />
            <cfset user.titles = [] />
            <cfset ArrayAppend(user.titles,'Mr') />
            <cfset ArrayAppend(user.titles,'Dr.') />
        </cfloop>

        <!--- end timer --->
        <cfset end1 = getTickCount()>

        <!--- Display total time --->
        <cfset total1 = end1-start1>
        <cfset arrayAppend(aDirect,total1) />   
    </cfloop>
</cfsilent>

<!--- The cfchart --->
<cfchart format="png" xaxistitle="function" yaxistitle="Loading Time (in secs.)">
    <cfchartseries type="bar" serieslabel="literal">
        <cfchartdata item="literal" value="#arrayAvg(aLiterals)#">
    </cfchartseries>
    <cfchartseries type="bar" serieslabel="direct">
        <cfchartdata item="direct" value="#arrayAvg(aDirect)#">
    </cfchartseries>
</cfchart>

希望这会对你有所帮助。