Domanda

Nel codice della mia azienda, ho visto spesso i file dei componenti utilizzati da inizializzare un oggetto di tale componente e chiamando i metodi fuori l'oggetto. Tuttavia, mi sembra un po 'più semplice da utilizzare il metodo cfinvoke, soprattutto se si usano solo un metodo dal file componente. Quali sono le differenze tra questi 2 metodi di chiamare una funzione dei componenti e quali sono i vantaggi / svantaggi di ciascuno? Quando devo utilizzare che?

È stato utile?

Soluzione

cfinvoke può essere utilizzato solo nei tag.

createObject può essere utilizzato in entrambi i tag e cfscript e tende ad essere un po 'più sottile / più facile da leggere IMO.

Fino a poco tempo ho evitato di usare cfinvoke perché l'ho trovato "ingombrante", ma un pro di esso è possibile in modo dinamico ciclo rispetto ai metodi all'interno di una CFC. In CreateObject non è possibile.

Quindi, se per esempio ho un CFC che ha i metodi - method1, Method2, method3, method4. Posso ciclo su di loro in questo modo: -

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

-

Un'altra cosa da notare è che alcuni host di condivisione bloccano giù su createobject. Soprattutto a causa del l'accesso dà alla sottolineatura Java.

Altri suggerimenti

Un altro vantaggio di usare createObject() è che è possibile concatenare il metodo init(), per es.

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

E se le vostre dichiarazioni init() this si può andare oltre e la catena del metodo se non è necessario utilizzare nuovamente l'oggetto:

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

vale la pena di sottolineare che nel CF 9 è possibile utilizzare la nuova sintassi (ahem) new per creare oggetti. Ad esempio, per creare lo stesso oggetto come sopra e lo chiamano di init() posso scrivere:

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

E 'pulito e mi piace la possibilità di fare questo. CF si sta muovendo nella giusta direzione, a mio parere con le caratteristiche come questo.

Hai quasi risposto da soli: in superficie, si potrebbe dire che, se si sarà chiamando un solo metodo in una pagina, poi fare in un sol colpo a cfinvoke (che crea un'istanza del CFC e chiama il metodo di quella denominata ) ha senso. E certamente se si chiamerebbe più di un metodo di CFC in una pagina, poi separando la procedura ha un senso (un'istanza della CFC con la funzione CreateObject o tag CFOBJECT, quindi richiamare i metodi come si trova in questo oggetto, un puntatore al CFC) , in modo che non si paga tale costo esemplificazione più di una volta.

Ma tenere presente che se la pagina si chiama spesso, può essere utile anche per risparmiare quel risultato di istanziare CFC, in modo che possa essere riutilizzato in una successiva richiesta alla pagina. Si potrebbe farlo mediante archiviazione (il risultato di CFOBJECT / CreateObject) non in una variabile locale, ma invece in un ambito comune: se il server, applicazioni, o una sessione, sulla base di "chi" trarrebbero beneficio da tale riutilizzo. Naturalmente, è quindi spetta a voi per gestire a livello di codice / decidere per quanto tempo per salvare la "cache" istanza CFC.

Per quanto importante, quando si salva un esempio CFC in questo modo, si diventa più sensibili alla "var ambito bug", che fondamentalmente è che avete bisogno di essere ancora più attenti a VAR eventuali variabili locali creati in CFC. Piuttosto che cercare di elaborare più su quello, io segnalo una meta-risorsa ho creato che:

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

La speranza che aiuta.

Invece di rimaneggiamento questa discussione mi limiterò a puntare verso Google:

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

Ci sono alcune differenze sottili (IE: <cfinvoke> è in grado di gestire i nomi dei metodi dinamico) ma in sostanza si riduce solo di preferenze personali. Beh, questo e il fatto che non è possibile utilizzare <cfinvoke> <cfscript>via.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top