在coldfusion中访问自定义函数的最佳方式是什么

在coldfusion中访问自定义函数的最佳方式是什么,coldfusion,Coldfusion,我想知道是否有人想到了在coldfusion中存储和访问自定义函数的最佳方法 我目前正在做的事情:目前我有多种CF组件,其中存储了相关功能。例如: <cfcomponent displayname="Math"> <cffunction name="func1"> <!---Code---> </cffunction> <!---Function 2, Func

我想知道是否有人想到了在coldfusion中存储和访问自定义函数的最佳方法

我目前正在做的事情:目前我有多种CF组件,其中存储了相关功能。例如:

    <cfcomponent displayname="Math">
        <cffunction name="func1">
            <!---Code--->
        </cffunction>

        <!---Function 2, Function 3, etc.---->
    </cfcomponent>

然后,当我需要在页面上使用它们时,我会执行以下操作

    <cfset lv_math_obj = createobject("component","cfc.Math")>
    <cfset variable = lv_math_obj.myFunction(parameter)>

我喜欢它的原因:上面的代码很容易阅读和理解,而且我的函数是预编译的

我不喜欢它的原因:对象不应该是相互独立工作的函数列表


有没有人想到一种更好的方法来存储和访问自定义函数?

您目前所做的事情本身并没有错,但是对于每个请求,您都在实例化cfc.Math,这在CF9+中应该不会让人汗流浃背,但不是必需的

您可以通过在ApplicationStart()中实例化一次来优化它,并将对象放入
应用程序
范围。但是,这样做会使调用UDF变得相当冗长,即
Application.math.func1()
。您可以在
onRequest()
中设置
Variables.math=Application.math
,然后所有CFM都可以访问
math.anyFunc()
。为了使您的UDFS可以访问任何CFC方法,您可以考虑将UDF放在<代码>窗体< /代码>或<代码> URL< /Cord>范围中,以避免使用范围前缀。

此外,当更新您的
cfc.Math
时,您需要像大多数框架那样清除旧副本(例如
?init=true
,在
onRequestStart()
中检测,并执行重新初始化),或重新启动应用程序


在我看来,最简单的方法是将UDF放入
math.cfm
中,并在我需要使用它们之前将其包含进去。

您当前所做的本身并没有错,但对于每个请求,您都在实例化
cfc.math
,这应该不会让CF9+汗流浃背,但不是必需的

您可以通过在ApplicationStart()中实例化一次来优化它,并将对象放入
应用程序
范围。但是,这样做会使调用UDF变得相当冗长,即
Application.math.func1()
。您可以在
onRequest()
中设置
Variables.math=Application.math
,然后所有CFM都可以访问
math.anyFunc()
。为了使您的UDFS可以访问任何CFC方法,您可以考虑将UDF放在<代码>窗体< /代码>或<代码> URL< /Cord>范围中,以避免使用范围前缀。

此外,当更新您的
cfc.Math
时,您需要像大多数框架那样清除旧副本(例如
?init=true
,在
onRequestStart()
中检测,并执行重新初始化),或重新启动应用程序


在我看来,最简单的方法是将UDF放入
math.cfm
中,并在我需要使用它们之前将其包括在内。

您可以将常用函数放在请求范围中

<cffunction name="OnRequestStart" access="public" returntype="boolean" output="false">
    <cfargument name="TargetPage" type="string" required="true"/>
    <cfinclude template="/udfs/global.cfm">
    <cfreturn true />
</cffunction>

我觉得这很容易处理。也可以将组件或功能放在应用程序范围内,但正如Henry指出的,当您开发或更改网站时,这可能会非常烦人

如果将函数放在请求范围中,则需要引用该函数。例如,包含的/udfs/global.cfm文件可能包含以下函数:

<cffunction name="func1">
<!---Code--->
</cffunction>
<cfset request.func1 = func1>

在应用程序中,可以使用以下语句调用此函数:

<cfset test = request.func1()>

您可以将常用函数放在请求范围中

<cffunction name="OnRequestStart" access="public" returntype="boolean" output="false">
    <cfargument name="TargetPage" type="string" required="true"/>
    <cfinclude template="/udfs/global.cfm">
    <cfreturn true />
</cffunction>

我觉得这很容易处理。也可以将组件或功能放在应用程序范围内,但正如Henry指出的,当您开发或更改网站时,这可能会非常烦人

如果将函数放在请求范围中,则需要引用该函数。例如,包含的/udfs/global.cfm文件可能包含以下函数:

<cffunction name="func1">
<!---Code--->
</cffunction>
<cfset request.func1 = func1>

在应用程序中,可以使用以下语句调用此函数:

<cfset test = request.func1()>


还有一个。你是否抱怨你有一大堆的,没有一个读过或修改过?还是说函数确实是独立的,而您只是在寻找独立函数库的OO模式?函数是预编译的?嗯,它们都是预编译的,即使您在.cfm afaik中定义了一个内联。我已经看到它以多种方式完成了—如您所描述的CFC,.cfm包括utilities.cfm或udf.cfm,以及.cfm本身。我更喜欢将它们放在一个单独的文件中,以便重用,但我不确定一种方法是否比另一种方法“更好”。CFC并不一定意味着“对象”。使用CFC作为函数库是完全可以接受的。我经常有一个具有相关功能的CFC,例如Formatter.CFC,用于在应用程序中一致地格式化日期、时间等。此外,您所指的是用户定义函数(UDF),而不是“自定义函数”:还有。你是否抱怨你有一大堆的,没有一个读过或修改过?还是说函数确实是独立的,而您只是在寻找独立函数库的OO模式?函数是预编译的?嗯,它们都是预编译的,即使您在.cfm afaik中定义了一个内联。我已经看到它以多种方式完成了—如您所描述的CFC,.cfm包括utilities.cfm或udf.cfm,以及.cfm本身。我更喜欢将它们放在一个单独的文件中,以便重用,但我不确定一种方法是否比另一种方法“更好”。CFC并不一定意味着“对象”。使用CFC作为函数库是完全可以接受的。我经常