如何在Coldfusion中处理“无效的方法代码长度”?

时间:2013-03-09 20:25:52

标签: oop coldfusion cfc filesize cfinvoke

我有一堆cfc个文件(正在运行coldfusion8),其中包含cfswitch个类似功能(用户,搜索,...)。

有些cfc文件变得太大了,所以我收到一个Invalid method Code length 72645,我认为这句话说“你的文件太大而无法解析”。

我通常会在大约2000行达到这个目标,并且认为这是......并不多。

由于我在一堆文件上遇到这个上限,我正在考虑添加另一个功能层=从switch语句中删除所有函数并使用单独的cfc函数调用cfinvoke

问题:
我的应用程序并不是那么大,所以我想知道,有没有办法绕过“你不能超过2000行的cfc”上限,如果没有,对于在应用程序中调用的每个主要方法,是否可以使用单独的CFC /组件?

谢谢!

编辑:重新:“计划”:-)
目前我的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>

现在我已经编写了很多非结构化的东西,但是在功能性cfc中拆分然后像这样处理它们对我来说似乎没有“未计划”。

如果是,那么设置它的更好的方法是什么,因为我不得不重新做到这一点?该开关将有大约15个案例,这是我正在使用的所有主要cfcs的平均值。

谢谢!

2 个答案:

答案 0 :(得分: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 (...) {
        ....
    }
}

...你明白了。这通常也会提高可读性和可维护性。

答案 1 :(得分:0)

基本上会发生此错误,因为您在ColdFusion中编写的函数或方法对Java的限制是每个方法65535个字节(大约2000行CF代码)。

通过从该函数调用较小的函数来简单地缩小该函数。

调用10,000字节的函数只需花费100字节。

Before (blows up):
    Function(){
      10,000 bytes of code
      15,000 bytes of code
      20,000 bytes of code
      30,000 bytes of code
    }

    After (success!):
    Function(){
      100 Byte call to 10,000 bytes of code
      100 Byte call to 15,000 bytes of code
      100 Byte call to 20,000 bytes of code
      100 Byte call to 30,000 bytes of code
    }