ColdFusion структурирует прямое назначение по сравнению с буквенной нотацией объекта - PullRequest
7 голосов
/ 24 марта 2010

Более новые версии 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']};

Теперь этот ограниченный пример, по общему признанию, прост, но если заголовки были массивом структур (скажем, массивом адресов), с литеральной нотацией работать неудобно.

Ответы [ 2 ]

4 голосов
/ 24 марта 2010

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

Затем я написал небольшой тест, который выдает диаграмму с результатами. Вы мне здесь любопытно: -)

Результаты подтверждают, что я был прав, поскольку график показывает ошеломляющую разницу, как вы можете видеть: альтернативный текст 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>

Надеюсь, это поможет вам.

4 голосов
/ 24 марта 2010

Дословная запись - декларативное программирование, а не процедурное программирование.

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

Обратите внимание, что буквенное обозначение в 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')
);

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

...