私の会社のコードでは、コンポーネントのオブジェクトを初期化し、そのメソッドをオブジェクトから呼び出すことによって、コンポーネントファイルを使用することがよくあります。しかし、特に、コンポーネントファイルから1つのメソッドだけを使用する場合は、cfinvokeメソッドを使用する方がやや簡単です。コンポーネント関数を呼び出す2つの方法とそれぞれの長所と短所との違いは何ですか?どちらを使うべきですか?cfinvokeとcreateObjectを使用してコンポーネント関数を実行する方法の違いは何ですか?
答えて
タグでのみ使用できます。
createObjectは両方のタグで使用することができます& cfscriptそして少しスリムである/ IMOを読むのがより簡単です。
最近まで、私は「かさばる」と感じていたので、私はcfinvokeの使用を避けましたが、プロの方はCFC内のメソッドを動的にループすることができます。 createobjectではできません。
たとえば、method1、method2、method3、method4というメソッドを持つCFCがあるとします。私はそれらをループのようなことができます: -
<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の下線にアクセスするためです。
あなたはほぼ自分自身に答えました。表面上は、ページ上に1つのメソッドしか呼び出さない場合、CFINVOKE(CFCをインスタンス化し、メソッド)は意味をなさない。ページ上で複数のCFCメソッドを呼び出す場合は、ステップを分けることは意味があります(createobject関数またはcfobjectタグを使用してCFCをインスタンス化し、そのオブジェクトにあるメソッドを呼び出す、CFCへのポインタ)そのインスタンシエーションコストを2回以上支払うことはありません。
しかし、ページが頻繁に呼び出されると、CFCのインスタンス化の結果を保存して、ページへの後続の要求で再利用できるようにすることもできます。ローカル変数にではなく、共有スコープに格納する(cfobject/createobjectの結果)代わりに、そのような再利用の恩恵を受ける "who"に基づいて、サーバー、アプリケーション、またはセッションのいずれかを格納します。もちろん、この「キャッシュされた」CFCインスタンスをプログラムで処理/保存する時間を決定することは現状のままです。
重要なことに、このようにCFCインスタンスを保存すると、基本的にCFCで作成するローカル変数をさらに注意深くする必要があるという「varスコープのバグ」の影響を受けやすくなります。その上で、より詳しく説明しようとするのではなく、私はその上に作成したメタ・リソースを指摘します:
http://www.carehart.org/blog/client/index.cfm/2010/3/4/resources_on_the_var_scope_problem
お役に立てば幸いです。
むしろ、この議論、私はGoogleの方にあなたを指すだけよ焼き直し:
http://www.google.com/search?q=cfinvoke+vs+createobject
は、いくつかの微妙な違いがあります(IEを:<cfinvoke>
は、動的なメソッド名を処理することが可能である)が、基本的にそれだけで沸きます個人的な好みに。さて、それと<cfinvoke>
から<cfscript>
までは使えないという事実。
ここに短いURLを使用する理由はありません。最終的な目的地を指すように更新されました。 ;) –
私は他の無意味なものと一緒にGoogleから直接コピーしましたので、私はちょうどそれをきれいにするために「bit.ly」のブックマークレットで短縮しました。更新していただきありがとうございます。 –
createObject()
を使用する他の利点の1つは、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は私の意見ではこのような特徴を持って正しい方向に動いています。
- 1. 関数の引数とテンプレートの引数としてstd :: enable_ifを使用する違いは何ですか?
- 2. PHPのpreg_関数の引用符として '{' ... '}'と '%' ... '%'を使用することの違いは何ですか?
- 3. EventEmitterの使用と関数の使用の違いは何ですか?
- 4. Angular2 - ディレクティブを使用してコンポーネントを失うスコープで関数を実行する
- 5. apply()関数とクラスのオブジェクトを使用する関数呼び出しの違いは何ですか?
- 6. Djangoで__str__関数を実行していることは何ですか?
- 7. netbeansからアプリケーションを実行してjarを実行することとの違いは何ですか?
- 8. C++でrand()関数を使用する正しい方法は何ですか?
- 9. javascriptのvar関数と関数の違いは何ですか?
- 10. TypeScriptメソッドを実行する2つの方法の違いは何ですか?
- 11. Seq関数とofList関数の違いは何ですか?
- 12. 関数と*関数の違いは何ですか?
- 13. MPI_ *関数とPMPI_ *関数の違いは何ですか?
- 14. コールバック関数と正規関数の違いは何ですか?
- 15. JS:関数式と関数式の違いは何ですか?
- 16. スレッドエントリ関数と通常関数の違いは何ですか?
- 17. javascriptのsetTimeoutを使用して何度か匿名関数を実行する
- 18. 複数の関数を実行する関数を作成する最適な方法は何ですか
- 19. setTimeout関数を実行してループを使用して終了する方法
- 20. プロセスを作成して実行し、コマンドラインで実行することの違いは何ですか?
- 21. パラメータを使用して関数を何度も実行するにはどうすればよいですか?
- 22. ファイヤーベース関数を使用してカウンタ関数を実装する方法は?
- 23. Angular 2コンポーネントとWebコンポーネントの違いは何ですか?
- 24. jQueryで変数を使用して関数を実行する
- 25. Androidでwait()関数を使用しているときに同期実行する方法は?
- 26. オプションの引数を使用してSQLクエリを実行する最適な方法は何ですか?
- 27. 関数を使用して別の関数を実行するにはどうすればよいですか?
- 28. ジェネリックパラメータを使用して関数に「オプションのアンラッピング」を実行する方法
- 29. JavaファイルのonClick関数を使用してXMLファイルのonClick()を書くリスナーとの違いは何ですか?
- 30. PHPで使用する匿名関数と匿名関数の違いは何ですか?
-1のための "しかし、プロのそれはCFCの中でメソッドを動的にループすることができます。createobjectではできません。" (O中のvar K){ \t場合ため (isCustomFunction(O [K])){ \t \t O [K](argumentCollection =何でも)。 \t} } これは、Railoでそのまま使用できます。 Adobe CF 7-9の場合は、次の操作を行う必要があります。 var k = ''; (k in o){ \t var m = o [k]; ; \t if(isCustomFunction(m)){ \t \t m(argumentCollection = whatever); \t} } –