这是我在 2007 年 6 月 13 日发表的一篇博文的重印。我使用这种方法已经有一段时间了,效果很好!YMMV。
谁不喜欢用户定义函数 (UDF)?如果您进行过任何编程,那么您很可能已经广泛使用过它们。人们遇到的最大问题是如何在您的应用程序中包含和组织它们。
我发现大多数人所做的是创建一个 Utils.cfc 或 UDFs.cfc 并将他们想要使用的 UDF 剪切并粘贴到组件中,如下所示:
<!--- UDFs.cfc --->
<cfcomponent output="false">
<cffunction name="init" access="public” returntype="Any" output="false">
<cfreturn this>
</cffunction>
<cffunction name="myUDF1" access="public" returntype="Any" output="false">
</cffunction>
<cffunction name="myUDF2" access="public" returntype="Any" output="false">
</cffunction>
</cfcomponent>
将应用程序将使用的所有 UDF 粘贴到组件中后,您需要使 UDF 可用于您的应用程序。我见过的几乎每个人都将组件加载到应用程序范围内。如果您正在使用 Application.cfc,则将以下行放入,onApplicationStart()
或者如果您正在使用它,只需将其添加到 Application.cfm 中:
<cfset application.functions = CreateObject("component", "udfs").init()>
无论您使用的是 Application.cfc 还是 Application.cfm,结果都是一样的;您的所有 UDF 都可用于您的应用程序,并且您可以在整个过程中自由使用它们。唯一的区别是您使用的变量名称。我使用 application.functions,有些使用 application.utils 或 application.udfs;没关系,再次,结果是一样的。
不过,这种方法有一个问题,它很麻烦,而且 UDF 组件会变得很大。拥有如此庞大的组件文件的问题在于编辑它成为一场噩梦,因为滚动数千行代码并不是很有趣,而且我注意到 CFEclipse 陷入了巨大的文件中。当然,代码崩溃确实提供了一些缓解,但必须有更好的方法。
我想要的是为我正在使用的每个 UDF 提供一个文件,并为我的应用程序提供一种自动加载它们的方法。这背后的原因是,如果我需要编辑myUDF1
,我可以打开文件myUDF1.cfm
并编辑我需要的内容。我还希望能够从CFLib.org获取 UDF,然后将它们放入我的应用程序中,而无需进行任何编辑。如果我需要从我的应用程序中删除 UDF,它就像删除 UDF 文件并重新初始化我的应用程序一样简单。
为了完成我想要的,我将我的 UDFs.cfc 修改为 11 行代码:
<!--- UDFs.cfc --->
<cfcomponent output="false">
<cfset variables.udfdir = GetDirectoryFromPath(GetCurrentTemplatePath()) & "udfs">
<cfset variables.q = "">
<cffunction name="init" access="public" returntype="Any" output="false">
<cfreturn this>
</cffunction>
<cfdirectory action="list" directory="#variables.udfdir#" filter="*.cfm" name="variables.q">
<cfoutput query="variables.q">
<cfinclude template="udfs\#name#">
</cfoutput>
</cfcomponent>
那么究竟发生了什么?
简而言之,这就是正在发生的事情:我有一个名为udfs
UDFs.cfc 的目录中的目录。这是我放置所有 UDF CFM 文件的目录。UDFs.cfc 所做的是在调用它时扫描此目录并自动包含它找到的每个 CFM 文件。因此,它会自动将 UDFs 文件夹中的所有 UDF 加载到自身中(通常称为“mixin”)。
所以我的目标达到了!我在自己的文件中拥有每个 UDF,因此我不必滚动浏览一个巨大的组件文件来找到它。我现在可以轻松地打开和编辑它。通过查看目录,我知道我的应用程序正在使用哪些 UDF。我只需将浏览器中的文本保存到目录中的文件中,就可以自动从 CFLib.org 添加 UDF。另外,如果我不再需要在我的应用程序中使用 UDF,我只需从目录中删除该文件,并在下一次重新初始化期间将其从我的应用程序中删除。所有这些都无需接触主 UDFs.cfc 文件即可完成。
下面是一个 UDF CFM 文件的外观示例。该文件被调用fullLeft.cfm
并位于 UDFs 目录中。
<!--- fullLeft --->
<cffunction name="fullLeft" access="public" displayname="fullLeft" returntype="string" output="false">
<cfargument name="str" type="string" required="true">
<cfargument name="count" type="numeric" required="true">
<cfif not refind("[[:space:]]", arguments.str) or (arguments.count gte len(arguments.str))>
<cfreturn Left(arguments.str, arguments.count)>
<cfelseif reFind("[[:space:]]",mid(arguments.str,arguments.count+1,1))>
<cfreturn left(arguments.str,arguments.count)>
<cfelse>
<cfif count-refind("[[:space:]]", reverse(mid(arguments.str,1,arguments.count)))>
<cfreturn Left(arguments.str, (arguments.count-refind("[[:space:]]", reverse(mid(str,1,arguments.count)))))>
<cfelse>
<cfreturn left(arguments.str,1)>
</cfif>
</cfif>
</cffunction>