将CFC文件拆分为多个文件

时间:2011-01-27 05:18:54

标签: coldfusion cfc

我被要求更新旧项目。当我进入cfc文件时,它有超过3000行代码和超过100个cffunctions。我想知道我是否可以将cfc分成多个文件,这些文件的cffunction在逻辑上分组而不必更改任何其他页面中的代码。

4 个答案:

答案 0 :(得分:5)

遇到类似的问题。我创建了新的cfcs并修改了原始函数以调用新cfcs中的函数。

例如

 <cffunction name="GetStuff" access="remote" returntype="Struct">
      <cfreturn createObject("component","myNewCFC").GetStuff(argumentCollection=arguments)/>
 </cffunction>

答案 1 :(得分:2)

重构,重构,重构......

最简单的方法可能是使用cfinclude来注入函数(mixin's)

答案 2 :(得分:2)

问题意味着有足够的客户端代码使用这个对象,如果对象分开,那么将其他地方的调用更改为繁琐。在这种情况下,将现有对象视为Facade - 这是一个为底层类层次结构提供统一接口的对象。

生成层次结构的方法是识别应该结合在一起的那些函数。每当我遇到这个问题时,函数通常不共享任何状态,而是它们就像static java方法,但如果有共享状态的函数,它们是这个分组的一个很好的候选者。否则,它通常是共享相同输入参数的函数,或者在其名称中往往具有相同的措辞(即saveMyDataloadMyData等...)。

鉴于此示例,这些函数复制到新的CFC中(例如MyData) - 此时您可以更改函数名称以消除重复或提高其清晰度(例如{{ 1}})。回到原始对象(即MyData.load())中删除这些函数的实现,而是将调用委托给新创建的CFC(您可以考虑将新CFC作为旧组合的一部分)。所以它看起来像这样:

BigCFC

<cffunction name="loadMyData"> <cfargument name="id" type="numeric"/> <cfreturn variables.myData.load(arguments.id)/> </cffunction> 设置为CFC初始化的一部分。

采用这种方法意味着您现有的客户端代码不受更改的影响,但仍将所有内容分解为逻辑分组,并定位新代码以使用更精细的CFC。

答案 3 :(得分:0)

这是一个老问题,我只是偶然发现它,但我想我会在这里发出声音,因为这是我在很多场合都要处理的事情。

如果目标只是从代码管理角度更好地组织事情(而不是说,特别是减少每个CFC中的方法数量)那么我主张将CFC分解为多个CFM页面并且包括他们在CFC中。从代码管理的角度来看,您可以将多个函数组合到一个名为CFM的文件中,这一切都变得容易处理。调用代码保持不变,因为所有函数仍然像以前一样在CFC中实例化。

我在init方法中使用了一些代码,它自动包含它在同一文件夹中找到的所有CFM文件,并且我在每个文件夹中包含一个base.cfc以及分组函数。

e.g。

<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>