Более новые версии 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']};
Теперь этот ограниченный пример по общему признанию прост, но если заголовки были массивом структур (Скажите, что массив адресов), литеральная нотация становится неудобной работать с.
Прежде чем я что-то пробовал, я сразу подумал, что литералы будут быстрее, поскольку вы создаете все, что вам нужно, во время выполнения, и не нужно тратить время создание переменных, затем вызов функций для добавления и все такое.
Затем я написал небольшой тест, который выдает диаграмму с результатами. Вы меня заинтересовали: -)
Результаты доказывают, что я был прав, поскольку график показывает ошеломляющую разницу, как вы можете видеть:
Но помните, что хотя можно было бы прыгнуть и уйти с буквальным обозначением , Я думаю, важно помнить, что буквальное обозначение может быть неудобным и в большинстве случаев еще больше сбивает с толку.
Очевидно, что если вы разрабатываете страницу, которая действительно нуждается в повышении скорости, буквальная нотация - это то, что вы ищете, но имейте в виду, что иногда на 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>
Надеюсь, это вам поможет.
Буквальная нотация - это декларативное, а не процедурное программирование.
Используя буквенную нотацию, вы четко и одномоментно сообщаете компьютеру, чего вы хотите. Без буквенной нотации вы создаете то, что хотите, медленно, по частям и без ясности.
Обратите внимание, что буквенная нотация в 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 (ключи struct не просто прописные, а в том регистре, в котором вы их набрали), и рекурсивно гнездятся без ограничений.