2013-03-09 74 views
1

我有一堆cfc文件(运行coldfusion8),其中包含一个cfswitch捆绑类似的功能(用户,搜索,...)。如何在Coldfusion中处理“无效的方法代码长度”?

有些CFC文件变得过大,所以我收到Invalid method Code length 72645我假设说,“你的文件太大,无法解析” ..

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

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

问:
我的应用程序并不大,所以我不知道,有没有办法来规避“你 - 不能具备的,更比2000线-IN-A -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> 

现在,我已经写了很多非结构化的东西,但分裂的functional- cfcs然后像这样处理它们对我来说似乎不是“非计划”的。

如果是这样,那么更好的方法来设置它,因为我不得不重新执行它?交换机将有大约15个案例,这是我使用的所有主要cfcs的平均值。

谢谢!

+2

而不是担心编译器的上限(和2000行等,不是硬性限制,它不是那么简单),你可能更好地重新组合你的CFC和方法有点多一点。呃......“计划中”。看看子类的东西,看看你的方法是否太复杂了,等等(方法应该做一件事)。 – 2013-03-09 20:44:33

+0

我以为我的CFC是“计划好的”:-)给我一分钟,我张贴一个简短的草图。子类化意味着什么? – frequent 2013-03-09 21:03:45

+0

@AdamCameron:好的。我开始通过从交换机调用另一个功能层来分离我的交换机。我想这很接近子类,是吗? – frequent 2013-03-10 00:37:29

回答

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 (...) { 
     .... 
    } 
} 

...你的想法。这通常也会提高可读性和可维护性。

+0

啊。我懂了。就我现在正在做的事情而言,只将B,B1,C分开来分开文件。谢谢! – frequent 2013-03-10 09:50:40

相关问题