我被要求更新旧项目。当我进入cfc文件时,它有超过3000行代码和超过100个cffunctions。我想知道我是否可以将cfc分成多个文件,这些文件的cffunction在逻辑上分组而不必更改任何其他页面中的代码。
答案 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方法,但如果有共享状态的函数,它们是这个分组的一个很好的候选者。否则,它通常是共享相同输入参数的函数,或者在其名称中往往具有相同的措辞(即saveMyData
,loadMyData
等...)。
鉴于此示例,将这些函数复制到新的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>