6

私の会社のコードでは、コンポーネントのオブジェクトを初期化し、そのメソッドをオブジェクトから呼び出すことによって、コンポーネントファイルを使用することがよくあります。しかし、特に、コンポーネントファイルから1つのメソッドだけを使用する場合は、cfinvokeメソッドを使用する方がやや簡単です。コンポーネント関数を呼び出す2つの方法とそれぞれの長所と短所との違いは何ですか?どちらを使うべきですか?cfinvokeとcreateObjectを使用してコンポーネント関数を実行する方法の違いは何ですか?

答えて

3

タグでのみ使用できます。

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

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

3

あなたはほぼ自分自身に答えました。表面上は、ページ上に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

お役に立てば幸いです。

4

むしろ、この議論、私はGoogleの方にあなたを指すだけよ焼き直し:

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

は、いくつかの微妙な違いがあります(IEを:<cfinvoke>は、動的なメソッド名を処理することが可能である)が、基本的にそれだけで沸きます個人的な好みに。さて、それと<cfinvoke>から<cfscript>までは使えないという事実。

+0

ここに短いURLを使用する理由はありません。最終的な目的地を指すように更新されました。 ;) –

+0

私は他の無意味なものと一緒にGoogleから直接コピーしましたので、私はちょうどそれをきれいにするために「bit.ly」のブックマークレットで短縮しました。更新していただきありがとうございます。 –

8

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は私の意見ではこのような特徴を持って正しい方向に動いています。

関連する問題