1

古いプロジェクトを更新するように依頼されました。cfcファイルにアクセスすると、3000行を超えるコードと100を超えるcffunctionが含まれていました。他のページのコードを変更せずに、cffunctionsが論理的にグループ化された複数のファイルにcfcを分割できるかどうか疑問に思いました。

4

4 に答える 4

5

同様の問題が発生します。新しいcfcsを作成し、元の関数を変更して、新しいcfcs内の関数を呼び出しました。

例えば

 <cffunction name="GetStuff" access="remote" returntype="Struct">
      <cfreturn createObject("component","myNewCFC").GetStuff(argumentCollection=arguments)/>
 </cffunction>
于 2011-01-27T09:05:56.873 に答える
2

リファクタリング、リファクタリング、リファクタリング...

最も簡単な方法は、cfinclude関数(ミックスイン)を挿入するために使用することです。

于 2011-01-27T07:45:55.047 に答える
2

質問は、このオブジェクトを使用する十分なクライアントコードがあることを意味し、オブジェクトがバラバラになっている場合に他の場所で呼び出しを変更するのは面倒です。この場合、既存のオブジェクトをファサードとして扱います。これは、基礎となるクラス階層への統一されたインターフェイスを提供するオブジェクトです。

階層を作成する方法は、一緒に使用する必要のある機能を特定することです。この問題に遭遇したときはいつでも、関数は通常、状態を共有せず、staticJavaメソッドのようなものですが、状態を共有する関数がある場合は、このグループ化の候補として適しています。それ以外の場合は、通常、同じ入力パラメーターを共有する関数、または名前に同じ言い回しが含まれる傾向がある関数です(つまり、、saveMyDataなどloadMyData)。

その例を考えると、これらの関数を新しいCFCにコピーMyDataします(例)。この時点で、関数名を変更して繰り返しをなくしたり、わかりやすくしたりすることができます(例MyData.load())。元のオブジェクトに戻って(つまりBigCFC)これらの関数の実装を削除し、代わりに新しく作成されたCFCに呼び出しを委任します(新しいCFCを古いものの構成の一部にすることを検討できます)。したがって、次のようになります。

<cffunction name="loadMyData">
  <cfargument name="id" type="numeric"/>
  <cfreturn variables.myData.load(arguments.id)/>
</cffunction>

variables.myDataCFCの初期化の一部としてどこに設定されますか。

このアプローチを採用すると、既存のクライアントコードは変更の影響を受けませんが、すべてをロジックグループに分割し、より詳細なCFCを使用するように新しいコードを配置します。

于 2011-01-27T11:48:44.580 に答える
0

それは古い質問で、ランダムに出くわしたばかりですが、何度も対処しなければならなかったので、ここでチャイムを鳴らそうと思いました。

目標が単にコード管理の観点から物事をより適切に整理することである場合(各CFCのメソッドの量を具体的に減らすことではなく)、CFCを複数のCFMページに分割し、それらをCFCに含めることをお勧めします。コード管理の観点からは、いくつかの関数を適切な名前のCFMファイルにグループ化することができ、すべてを処理するのがはるかに簡単になります。すべての関数が以前と同じようにCFCでインスタンス化されているため、呼び出し元のコードは同じままです。

initメソッドで使用するコードが少しあり、同じフォルダーで見つかったすべてのCFMファイルが自動的に含まれ、グループ化された関数とともに各フォルダーに1つのbase.cfcが格納されています。

例えば

<cfscript>
    // Set CFC name
    Variables.sCFCName = 'appUtils';
    // Set folder
    Variables.sCFCFolder = GetDirectoryFromPath(GetCurrentTemplatePath());
    // Get CFC files
    Variables.qCFCFiles = directoryList(Variables.sCFCFolder, true, 'query');
</cfscript>

<!--- Init function --->
<cffunction name="init" access="public" returnType="any" output="false" hint="Constructor">
    <cfargument name="DSN" type="string" default="" hint="Datasource" />

    <!--- Set DSN --->
    <cfset Variables.DSN        = Arguments.DSN />

    <cfreturn this />
</cffunction>

<!--- Include CFC files --->
<cfoutput query="Variables.qCFCFiles">
    <cfif Variables.qCFCFiles.type EQ 'file' AND GetToken(Variables.qCFCFiles.name, 2, '.') EQ 'cfm'>
        <cfinclude template="#Variables.qCFCFiles.Name#" />
    </cfif>
</cfoutput>
于 2016-01-07T13:04:05.060 に答える