В чем разница между использованием cfinvoke и createObject для запуска функции компонента? - PullRequest
6 голосов
/ 05 января 2011

В коде моей компании я часто видел файлы компонентов, используемые при инициализации объекта этого компонента и вызове методов из объекта. Однако мне кажется, что использовать метод cfinvoke несколько проще, особенно когда используется только один метод из файла компонента. Каковы различия между этими двумя методами вызова компонентной функции и каковы плюсы / минусы каждого? Когда я должен использовать какой?

Ответы [ 4 ]

8 голосов
/ 05 января 2011

Еще одно преимущество использования createObject() заключается в том, что вы можете связать метод init(), например,

<cfset myObject = createObject("com.path.MyObject").init() />

И если ваш init() возвращает this, вы можете пойти дальше и связать метод, если вам не нужно использовать объект снова:

<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />

Стоит отметить, что в CF 9 вы можете использовать новый (ahem) new синтаксис для создания объектов. Например, чтобы создать тот же объект, что и выше, и вызвать его init(), я могу написать:

<cfset myObject = new com.path.MyObject() />

Это аккуратно, и мне нравится возможность сделать это. С моей точки зрения, CF движется в правильном направлении.

4 голосов
/ 05 января 2011

Вместо того, чтобы перефразировать это обсуждение, я просто укажу вам на Google:

http://www.google.com/search?q=cfinvoke+vs+createobject

Есть некоторые тонкие различия (IE: <cfinvoke> способен обрабатывать имена динамических методов), но по сути это сводится к личным предпочтениям. Ну, это и тот факт, что вы не можете использовать <cfinvoke> через <cfscript>.

4 голосов
/ 05 января 2011

cfinvoke можно использовать только в тегах.

createObject может использоваться как в тегах, так и в cfscript и имеет тенденцию быть немного тоньше / легче для чтения IMO.

До недавнего времени я избегал использования cfinvoke, потому что он мне показался «громоздким», но в качестве доказательства можно сказать, что вы можете динамически перебирать методы внутри CFC. В createobject вы не можете.

Так, если, например, у меня есть CFC, у которого есть методы - method1, method2, method3, method4. Я могу зациклить их так: -

<cfloop from="1" to="4" index="element">
   <cfif structKeyExists(this,'getMethod#element#')>
<cfinvoke component="#this#" method="getLine#local.element#" returnVariable="methodValue"></cfinvoke>
<cfset arrayAppend(myArray,methodValue) />
   </cfif>

-

Еще одна вещь, которую стоит отметить, это то, что некоторые хосты общего доступа блокируются на createobject. Главным образом из-за доступа, который он дает к подчеркивающей Java.

4 голосов
/ 05 января 2011

Вы почти ответили на это сами: на первый взгляд, можно сказать, что если вы будете вызывать только один метод на странице, то выполняете это одним махом в CFINVOKE (который создает экземпляр CFC и вызывает метод с одним именем). ) имеет смысл. И, конечно, если вы вызовете более одного метода CFC на странице, тогда имеет смысл разделить шаги (создать экземпляр CFC с помощью функции createobject или тега cfobject, а затем вызвать методы, найденные в этом объекте, указатель на CFC) , чтобы вы не оплачивали эту стоимость создания экземпляра более одного раза.

Но имейте в виду, что если страница вызывается часто, возможно, имеет смысл также сохранить этот результат создания экземпляра CFC, чтобы его можно было повторно использовать при последующем запросе к странице. Вы могли бы сделать это, сохранив его (результат cfobject / createobject) не в локальной переменной, а вместо этого в общей области: будь то сервер, приложение или сеанс, основанный на «кто» выиграет от такого повторного использования. Разумеется, после этого вы должны программно обработать / решить, как долго сохранять этот «кэшированный» экземпляр CFC.

Также важно, что когда вы сохраняете экземпляр CFC таким способом, вы становитесь более восприимчивыми к «ошибке области видимости var», которая в основном заключается в том, что вам нужно быть еще более внимательным к VAR с любыми локальными переменными, создаваемыми в CFC. Вместо того, чтобы пытаться более подробно остановиться на этом, я укажу мета-ресурс, который я создал для этого:

http://www.carehart.org/blog/client/index.cfm/2010/3/4/resources_on_the_var_scope_problem

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...