1

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

一些 cfc 文件变得太大,所以我收到一个Invalid method Code length 72645我假设的内容,“你的文件太大而无法解析”..

我通常会在大约 2000 行时达到这一点,并认为这……不多。

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

问题:
我的应用程序不是那么大,所以我想知道,有没有办法绕过“you-can't-have-more-than-2000-lines-in-a-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>

现在我一直在写很多非结构化的东西,但是在功能性cfcs 中拆分然后像这样处理它们对我来说似乎并不是很“没有计划”。

如果是这样,那么设置它的更好方法是什么,因为无论如何我都必须重新做?交换机将有大约 15 个案例,这是我使用的所有主要 cfcs 的平均值。

谢谢!

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 回答
0

基本上发生此错误是因为您在 ColdFusion 中编写的函数或方法超出了每个方法 65535 字节的 Java 限制(大约 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
    }
于 2019-08-09T18:58:33.717 回答