私の会社のコードでは、そのコンポーネントのオブジェクトを初期化し、オブジェクトからメソッドを呼び出すことによって使用されるコンポーネント ファイルをよく見てきました。ただし、特にコンポーネント ファイルから 1 つのメソッドのみを使用する場合は、cfinvoke メソッドを使用する方がやや簡単に思えます。コンポーネント関数を呼び出すこれら 2 つの方法の違いと、それぞれの長所と短所は何ですか? いつどれを使用する必要がありますか?
4 に答える
使用するもう1つの利点は、メソッドcreateObject()
をチェーンできることです。init()
<cfset myObject = createObject("com.path.MyObject").init() />
また、init()
返品this
の場合、オブジェクトを再度使用する必要がない場合は、さらに進んでメソッドをチェーンすることができます。
<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />
new
CF 9では、新しい(ahem)構文を使用してオブジェクトを作成できることを指摘しておく価値があります。たとえば、上記と同じオブジェクトを作成し、それを呼び出すには、次のようinit()
に記述できます。
<cfset myObject = new com.path.MyObject() />
それはきちんとしていて、私はこれを行うオプションが好きです。私の意見では、CFはこのような機能で正しい方向に進んでいます。
あなたはほとんど自分で答えました: 表面的には、ページで 1 つのメソッドのみを呼び出す場合、CFINVOKE (CFC をインスタンス化し、名前付きメソッドを呼び出す) で一挙に行うことが理にかなっていると言うことができます。 . 確かに、1 つのページで CFC の複数のメソッドを呼び出す場合は、ステップを分離することは理にかなっています (createobject 関数または cfobject タグを使用して CFC をインスタンス化し、そのオブジェクトで見つかったメソッド (CFC へのポインター) を呼び出します)。 、そのインスタンス化コストを複数回支払わないようにします。
ただし、ページが頻繁に呼び出される場合は、CFC のインスタンス化の結果を保存して、ページへの後続のリクエストで再利用できるようにすることも意味があることに注意してください。これを行うには、それ (cfobject/createobject の結果) をローカル変数ではなく、共有スコープ (サーバー、アプリケーション、またはセッションのいずれか) に格納することで、「誰が」そのような再利用の恩恵を受けるかを判断します。もちろん、この「キャッシュされた」CFCインスタンスを保存する期間をプログラムで処理/決定するのはあなたの責任です。
重要なのは、この方法で CFC インスタンスを保存すると、「var スコープのバグ」の影響を受けやすくなります。これは、基本的に、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>
まあ、それと、 via を使用できないという事実<cfscript>
。
cfinvoke はタグでのみ使用できます。
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>
--
もう 1 つの注意点は、一部の共有ホストが createobject でロックダウンすることです。主な理由は、下線を引いている Java にアクセスできるためです。