Was ist der Unterschied zwischen der Verwendung von CFInvoke und createObject, um eine Komponentenfunktion auszuführen?

StackOverflow https://stackoverflow.com/questions/4605746

Frage

Im Code meines Unternehmens habe ich häufig Komponentendateien gesehen, indem ein Objekt dieser Komponente initialisiert und die Methoden vom Objekt aufgerufen werden. Es scheint mir jedoch etwas einfacher zu sein, die CFInvoke -Methode zu verwenden, insbesondere wenn nur eine Methode aus der Komponentendatei verwendet wird. Was sind die Unterschiede zwischen diesen beiden Methoden zum Aufrufen einer Komponentenfunktion und was sind die Vor-/Nachteile von jedem? Wann sollte ich welches verwenden?

War es hilfreich?

Lösung

CFInvoke kann nur in Tags verwendet werden.

createObject kann sowohl in Tags als auch in CFScript verwendet werden und ist tendenziell etwas schlanker / leichter zu lesen imo.

Bis vor kurzem habe ich es vermieden, CFInvoke zu verwenden, weil ich es "sperrig" fand, aber ein Profi ist, dass Sie die Methoden innerhalb eines CFC dynamisch überschreiten können. In CreateObject können Sie nicht.

Wenn ich beispielsweise einen FAFC habe, der die Methoden hat - Method1, Method2, Method3, Method4. Ich kann sie wie so überfahren:-

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

--

Eine andere Sache, die zu beachten ist, ist, dass einige gemeinsame Hosts auf createObject versperrten. Hauptsächlich wegen des Zugangs, den es dem unterstreichenden Java gibt.

Andere Tipps

Ein weiterer Vorteil der Verwendung createObject() ist, dass Sie die ketten können init() Methode, z

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

Und wenn du init() kehrt zurück this Sie können weiter gehen und die Methode ketten, wenn Sie das Objekt nicht erneut verwenden müssen:

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

Es lohnt sich, darauf hinzuweisen, dass Sie in CF 9 das neue verwenden können (ahem) new Syntax zum Erstellen von Objekten. Zum Beispiel, um dasselbe Objekt wie oben zu erstellen und es anzurufen init() Ich kann schreiben:

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

Es ist ordentlich und ich mag die Möglichkeit, dies zu tun. CF bewegt sich meiner Meinung nach in die richtige Richtung mit solchen Funktionen.

Sie haben es beinahe selbst beantwortet: An der Oberfläche könnte man sagen, wenn Sie nur eine Methode auf einer Seite anrufen, dann ist es in einem Schlag in CFInvoke (was den CFC instanziiert und die eine benannte Methode nennt) Sinn machen . Und wenn Sie mehr als eine Methode des CFC auf einer Seite aufrufen würden, ist das Trennen der Schritte sinnvoll (so instanziieren Sie den CFC mit der Funktion createObject oder cFObject -Tag und rufen Sie dann Methoden auf, wie in diesem Objekt gefunden, einen Zeiger auf den CFC). , damit Sie diese Instanziierung nicht mehr als einmal zahlen.

Denken Sie jedoch daran, dass es auch sinnvoll ist, das Ergebnis der Instanziierung des CFC zu speichern, damit sie auf eine nachfolgende Anfrage an die Seite wiederverwendet werden kann, wenn die Seite oft aufgerufen wird. Sie würden dies tun, indem Sie es (das Ergebnis von CFOBject/createObject) nicht in einer lokalen Variablen, sondern in einem gemeinsam genutzten Umfang speichern: ob Server, Anwendung oder Sitzung, basierend auf "Wer" von einer solchen Wiederverwendung profitieren würde. Natürlich ist es Sie dann auf Sie, programmgesteuert zu handhaben/zu entscheiden, wie lange diese "zwischengespeicherte" CFC -Instanz sparen soll.

Wenn Sie auf diese Weise eine CFC -Instanz speichern, werden Sie anfälliger für den "VAR Scope -Fehler", der im Grunde genommen darauf hinweisen muss, dass Sie immer noch vorsichtiger sind, um var für lokale Variablen, die Sie im CFC erstellen, vorsichtiger sein müssen. Anstatt zu versuchen, mehr darüber auszuarbeiten, werde ich auf eine Meta-Ressourcen hinweisen, die ich dazu erstellt habe:

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

Ich hoffe, das hilft.

Dann werde ich diese Diskussion neu aufgeben. Ich werde Sie einfach auf Google verweisen:

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

Es gibt einige subtile Unterschiede (dh: <cfinvoke> Kann dynamische Methodennamen bearbeiten), aber im Wesentlichen läuft es nur auf persönliche Präferenzen hinaus. Nun, das und die Tatsache, dass Sie nicht verwenden können <cfinvoke>über <cfscript>.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top