2008-08-25 19 views

答えて

18

コードのどの部分でも使用できるスコープは、セッション、クライアント、Cookie、アプリケーション、およびリクエストです。いくつかの方法で使用することはお勧めできません(つまり、カスタムタグまたはCFCの内部でリクエストまたはアプリケーションのスコープを使用する、これはcouplingで、カプセル化原則に違反し、悪い習慣とみなされます)。また、セッションスコープ変数はユーザー固有であり、Webサイト上のユーザーのセッションで期限切れになります。

変数が極端に変更されることはほとんどありません(すべての目的や目的に対して定数です)。アプリケーションの起動時に単純に初期化して再度書き込むことはできません。一般に、アプリケーションスコープに入れる必要があります。セッション。適切に実装されると、それは一度書き込まれ、N回読み出されます。 Application.cfmでのアプリケーション変数の

適切な実装は次のようになります。もし二人のユーザーように、アプリケーションのスコープ内の変数の存在は、ロックの前と後にチェックされていることを

<cfif not structKeyExists(application, "dsn")> 
    <cflock scope="application" type="exclusive" timeout="30"> 
     <cfif not structKeyExists(application, "dsn")> 
      <cfset application.dsn = "MyDSN" /> 
      <cfset foo = "bar" /> 
      <cfset x = 5 /> 
     </cfif> 
    </cflock> 
</cfif> 

注意をアプリケーション起動時に競合状態を作成すると、そのうちの1つだけがアプリケーション変数の設定を終了します。

このアプローチの利点は、ユーザーの時間とサーバーの処理サイクルを無駄にすることなく、すべての要求でこれらの格納された変数を定期的に更新しないことです。トレードオフは少し冗長で複雑です。

これは、Application.cfcを追加すると大幅に簡略化されました。のすべてを含むのApplication.cfcの詳細については

<cfcomponent> 
    <cfset this.name = "myApplicationName" /> 

    <cffunction name="onApplicationStart" returnType="boolean" output="false"> 
     <cfset application.dsn = "MyDSN" /> 
     <cfset foo = "bar" /> 
     <cfset x = 5 /> 
     <cfreturn true /> 
    </cffunction> 
</cfcomponent> 

:さて、あなたは、アプリケーションの起動時に作成され、ロックや存在をチェックし、その楽しいことのすべてを心配する必要はありませんどの変数を指定することができます様々な特別な機能を利用でき、何をどのように使用するかについての詳細はほとんどありません。I recommend this post on Raymond Camden's blog

要約すると、リクエストスコープはコードのどこでも利用できますが、必ずしもどこにでも使用できるとは限りません。あなたの前任者がカプセル化を中断させる可能性があり、それがリファクタリングに煩わ​​しい可能性があります。あなたはそれをそのまま残しておくのが最も良いかもしれませんが、どのスコープが仕事にとって最善のツールであるかを理解することは、間違いなくあなたの将来のコードをより良くするでしょう。

15

これは非常に主観的な質問であり、現代のColdFusionアプリケーションでリクエストスコープを使用することは決して「適切」ではないと主張する人もいます。

この免責条項を外して、リクエストスコープが何であるか、またどこが有用かを定義しましょう。

リクエストスコープは、1回のColdFusionページリクエスト内の絶対的なグローバルスコープです。アプリケーション、サーバー、クライアント、セッションスコープなどの共有スコープではないため、スレッドセーフである必要はありません(CF8のCFTHREADタグを使用して単一の要求からワーカースレッドを生成しない場合)。グローバルスコープとして、親から呼び出し元に変数を渡すことなく、リクエストのスタック内のどのレベルからでも変数を永続化することができます。これは、古いCFアプリケーションでネストされたカスタムタグを再帰的に使用して変数を永続化する非常に一般的な方法でした。

多くのアプリケーションでは、このスコープを使用してアプリケーションレベルの変数(設定など)を格納していますが、要求スコープとアプリケーションスコープの大きな違い(場合によっては微妙な違い)は、同じ要求範囲指定の変数は、個々のページ要求ごとに異なる場合があります。

私はあなたの前任者は、便利の周りに明示的に渡すことなく、コードのカプセル化またはネストされたユニット間のジャンプを生き残るために必要な変数を設定するための手段として、このスコープを使用したことを推測します。

0

さて、私は自分のコードにコメントしたかったです。私が狂ったようであれば私を許してください。しかし、あなたはすでにstructKeyExistsが先頭にあることを確認しました。あなたは本当のことになるだろう知っているので、それは別のチェックを実行しても意味がありません。だから、私のバージョンはこれになります...しかし、それは私だけです。


<cfif not structKeyExists(application, "dsn")> 
    <cflock scope="application" type="exclusive" timeout="30"> 
      <cfset application.dsn = "MyDSN" /> 
      <cfset foo = "bar" /> 
      <cfset x = 5 /> 
    </cflock> 
</cfif> 

よし。

+0

ベストプラクティスでは、競合状態を回避するためにcflock内で再度チェックすることを義務付けています –

+2

CFMX6.0はCFLOCKのみを使用するため、アプリケーションスコープ変数を設定するための「ベストプラクティス」は存在しない競合状態の可能性がありますコードはここで提供されます。一つは、単にアプリケーションスコープの変数に単純な値を設定したいし、全体のプロセスは原子である場合(すなわち:それはある文だし、競合状態のための余地がありませんが、この例のように)、ちょうどCFPARAMタグを使用することです良い。 –

0

私たちのサイトに電力を供給するために使用されます私の会社の枠組みを書いてきました。

リクエスト変数を使用して、他のCFCで使用できる特定のデータを設定しました。データを継続的に渡す必要なく、アプリケーション全体でデータを利用できるようにしました。私は正直にその限り静的な機能コンポーネントを要求し、アプリケーションを使用すると、あなたは問題があるべきではないと信じています。私はこれで私の考えで間違っているかはわからないが、私はフレームワークを離すと、我々が表示されます。

関連する問題