1

たくさんのcfcファイル(実行coldfusion8中)があり、それらはcfswitchバンドルされた同様の機能(ユーザー、検索、...)で構成されています。

一部のcfcファイルが大きくなりすぎているためInvalid method Code length 72645、「ファイルが大きすぎて解析できません」というメッセージが表示されます。

私は通常約2000行でこれに到達しており、これは...それほど多くはないと思います。

この上限を多数のファイルに適用しているので、別の関数レイヤーを追加することを検討しています= switchステートメントからすべての関数を削除し、関数cfinvokeごとに個別のcfcを使用して呼び出します。

質問:
私のアプリケーションはそれほど大きくないので、「2000ラインを超えるフロンを持てない」という上限を回避する方法はありますか?そうではなく、アプリケーションで呼び出されるすべてのメインメソッドに対して個別のCFC /コンポーネントを用意することは実行可能なアプローチですか?

ありがとう!

編集: re:「計画済み」:-)
現在、私のCFCは次のように構成されています。

<cfcomponent extends="controllers.main" output="false" hint="handle all user interactions">     
    <cfscript>
        VARIABLES.Instance.Validation = {   
            // all user-relate form fields including validation method to call (pass = no validation)
            id="spec_id"
          , corp="pass"
          ...
        };
    </cfscript> 

    <cffunction name="Init" access="public" returntype="any" output="false" hint="Initialize form data">
        <cfreturn true />
    </cffunction>   
    <cffunction name="Defaults" access="public" returntype="struct" output="false" hint="Assign defaults">
       <cfscript>
          // form default values assigned to instance
          var formDefaults = {
              id=""
            , comp=""
            ...
          };
       </cfscript>
       <cfreturn formDefaults />
    </cffunction>

    <cffunction name="Commit" access="remote" returntype="struct" output="false" hint="Main handler">
        <cfscript>
        // all var declarations
        var userID = "";
        var strRememberMe = "";
        var timestamp = now();
        ... 
        var defaultValues = THIS.Defaults();
        var LOCAL = {};

        structAppend(defaultValues, VARIABLES.Instance.FormData);
        LOCAL.User = defaultValues;
        LOCAL.User.timestamp = timestamp ;
        </cfscript> 

        <!--- the switch --->       
        <cfswitch expression = #LOCAL.User.submitted_form#>

            ... lot of stuff ...

        </cfswitch>

        <cfreturn LOCAL.Response />
    </cffunction>

    <!--- UTILITY FUNCTIONS --->
    <cffunction name="Validate" access="public" returntype="array" output="false" hint="validate form inputs">
        <cfscript>
        var LOCAL = {};
        var double = structNew();
        double.criteria = VARIABLES.Instance.Validation;
        double.form = VARIABLES.Instance.FormData;
        </cfscript>

        <!--- Get error name and type --->
        <cfinvoke component="form_validate" method="validate_fields" double="#double#" returnvariable="validation_errors"></cfinvoke>
        <cfset LOCAL.ErrorMessages = validation_errors />
        <cfreturn LOCAL.ErrorMessages />
    </cffunction>                                   
</cfcomponent>

今、私は多くの構造化されていないものを書いていますが、functional-cfcsに分割して、このように処理することは、私にはあまり「計画外」のようには見えませんでした。

もしそうなら、とにかくやり直さなければならないので、これを設定するためのより良い方法は何でしょうか?スイッチには約15のケースがあります。これは、私が使用しているすべての主要なcfcの平均です。

ありがとう!

4

2 に答える 2

3

この問題は、CF8 でも少し前に経験しました。一般的な「2000 行の制限」はありませんが、JVM にはサブルーチン内でジャンプするためのアドレス オフセットの最大値があります。オフセットは 2 バイト (WORD) を超えてはなりません。それ以外の場合は、この例外に直面します。サブルーチン (関数) 内の大きなアドレス オフセットを回避するには、条件付きジャンプ (if/else/switch) の大きなブロックを最小限に抑える必要があります。代わりに複数のサブルーチンを使用してこれを行うことができます (これらの呼び出しは最大 4/8 バイトまでのフル レジスタを使用する場合があります)。

例: 再設計...

function A (x, y) {
    if (...) {
        switch (...) {
            case ...:
                switch (...) {
                    ...
                }
            ...
        }
    } else {
        switch (...) {
            ...
        }
    }
}

のようなものに...

function A (x, y) {
    if (...) {
        call B(x, y);
    } else {
        call C(x, y);
    }
}

function B (x, y) {
    switch (...) {
        case ...:
            call B1(x, y);
        ...
    }
}

function B1 (x, y) {
    switch (...) {
        ....
    }
}

function C (x, y) {
    switch (...) {
        ....
    }
}

…お分かりですね。これにより、通常、読みやすさと保守性も向上します。

于 2013-03-10T03:16:03.750 に答える