Pregunta

En el código de mi empresa, a menudo he visto archivos de componentes utilizados inicializando un objeto de ese componente y cancelando los métodos del objeto. Sin embargo, me parece un poco más sencillo usar el método CFINVOKE, especialmente cuando solo usa un método del archivo de componente. ¿Cuáles son las diferencias entre estos 2 métodos para llamar a una función de componente y cuáles son los pros/contras de cada uno? ¿Cuándo debo usar cuál?

¿Fue útil?

Solución

CFINVOKE solo se puede usar en etiquetas.

CreateObject se puede usar en Tags y CFScript y tiende a ser un poco más delgado / más fácil de leer IMO.

Hasta hace poco, evité usar CFINVOKE porque lo encontré "voluminoso", pero un profesional es que puedes recubrir 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 recurrir a ellos 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 se bloquean en CreateObject. Principalmente debido al acceso que da al Java subrayado.

Otros consejos

Otro beneficio de usar createObject() es que puedes encadenar el init() Método, por ejemplo

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

Y si tu init() devoluciones this 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 puedes usar el nuevo (ejem) new Sintaxis para crear objetos. Por ejemplo, para crear el mismo objeto que el anterior y llamarlo es init() Puedo escribir:

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

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

Casi lo ha respondido usted mismo: en la superficie, se podría decir que si llamará solo un método en una página, luego, en una sola caída en CFinvoke (que instanciona el CFC y llama al único método llamado) tiene sentido. . Y ciertamente, si llama a más de un método del CFC en una página, entonces separar los pasos tiene sentido (instanciar el CFC con la función CreateObject o la etiqueta CFObject, luego invocar métodos como se encuentran en ese objeto, un puntero al CFC) , para que no pague ese costo de instancia más de una vez.

Pero tenga en cuenta que si la página se llama a menudo, puede tener sentido también guardar ese resultado de instanciar el CFC, para que pueda reutilizarse en una solicitud posterior a la página. Lo haría almacenándolo (el resultado de CFObject/CreateObject) no en una variable local, sino en un alcance compartido: si el servidor, la aplicación o la sesión, en función de "quién" se beneficiaría de dicha reutilización. Por supuesto, le corresponde a usted manejar/decidir programáticamente cuánto tiempo para guardar esta instancia de CFC "almacenado en caché".

Como importante, cuando guarda una instancia de CFC de esta manera, se vuelve más susceptible al "error de alcance var", lo que básicamente es que debe tener más cuidado con las variables locales que cree en el CFC. En lugar de tratar de elaborar más sobre eso, señalaré un meta-resource que creé en eso:

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

Espero que ayude.

En lugar de repetir esta discusión, solo te señalaré hacia Google:

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top