coldfusion components design-decisions createobject cfinvoke

coldfusion - ¿Cuál es la diferencia entre usar cfinvoke y createObject para ejecutar una función componente?



components design-decisions (4)

Casi lo ha respondido usted mismo: en la superficie, podría decirse que si va a llamar solo un método en una página, hacerlo de una sola vez en CFINVOKE (que ejemplifica el CFC y llama al método nombrado) tiene sentido . Y ciertamente si llamara a más de un método del CFC en una página, entonces tiene sentido separar los pasos (crear una instancia del CFC con la función createobject o la etiqueta cfobject, luego invocar métodos como los encontrados en ese objeto, un puntero al CFC) , para que no pagues esa instanciación cuesta más de una vez.

Pero tenga en cuenta que si la página se llama con frecuencia, también puede tener sentido guardar el resultado de instanciar el CFC, de modo que pueda reutilizarse en una solicitud posterior a la página. Haría eso al almacenarlo (el resultado de cfobject / createobject) no en una variable local, sino en un ámbito compartido: si servidor, aplicación o sesión, según "quién" se beneficiaría de dicha reutilización. Por supuesto, le corresponderá manejar / decidir programáticamente durante cuánto tiempo se guardará esta instancia de CFC "en caché".

Como es importante, cuando guarda una instancia de CFC de esta manera, se vuelve más susceptible al "error var scope", que básicamente es que debe ser aún más cuidadoso para VAR cualquier variable local que cree en el CFC. En lugar de tratar de elaborar más sobre eso, señalaré un meta-recurso que creé sobre eso:

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

Espero que ayude.

En el código de mi compañía, a menudo he visto archivos de componentes utilizados inicializando un objeto de ese componente y llamando los métodos fuera del objeto. Sin embargo, me parece algo más sencillo utilizar el método cfinvoke, especialmente cuando solo se usa un método del archivo componente. ¿Cuáles son las diferencias entre estos dos métodos para llamar a una función componente y cuáles son los pros / contras de cada uno? ¿Cuándo debería usar cuál?


En lugar de volver a repetir esta discusión, simplemente te dirigiré hacia Google:

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

Hay algunas diferencias sutiles (IE: <cfinvoke> es capaz de manejar nombres de métodos dinámicos) pero esencialmente se reduce a preferencias personales. Bueno, eso y el hecho de que no puedes usar <cfinvoke> través de <cfscript> .


Otra ventaja de utilizar createObject() es que puede encadenar el método init() , por ejemplo

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

Y si su init() devuelve, puede ir más allá y encadenar el método si no necesita usar el objeto nuevamente:

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

Vale la pena señalar que en CF 9 puede usar la new sintaxis (ahem) para crear objetos. Por ejemplo, para crear el mismo objeto que el anterior y llamarlo init() puedo escribir:

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

Está limpio y me gusta la opción de hacer esto. En mi opinión, CF se está moviendo en la dirección correcta con características como esta.


cfinvoke solo se puede usar en etiquetas.

createObject se puede usar en ambas etiquetas & cfscript y tiende a ser un poco más delgado / más fácil de leer IMO.

Hasta hace poco, evitaba utilizar cfinvoke porque me pareció "voluminoso", pero una de sus ventajas es que puede recorrer dinámicamente los métodos dentro de un CFC. En createobject no puedes.

Entonces, si, por ejemplo, tengo un CFC que tiene los métodos: method1, method2, method3, method4. Puedo recorrerlos como así:

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

-

Otra cosa a tener en cuenta es que algunos hosts compartidos bloquean en createobject. Principalmente por el acceso que le da al subrayado de Java.