【问题标题】:What is the best way to access custom functions in coldfusion在coldfusion中访问自定义函数的最佳方法是什么
【发布时间】:2013-06-19 18:37:05
【问题描述】:

我想知道是否有人对他们认为在冷融合中存储和访问自定义函数的最佳方式有什么想法。

我目前在做什么: 目前我有各种 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)>

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

为什么我不喜欢它: 对象不应该是相互独立工作的函数列表。

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

【问题讨论】:

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

标签: coldfusion


【解决方案1】:

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

您可以通过在onApplicationStart() 中实例化一次并将对象放入Application 范围内来优化它。但是,这样做会使调用 UDF 变得相当冗长,即 Application.math.func1()。您可以在onRequest() 中设置Variables.math = Application.math,然后您的所有CFM 都可以访问math.anyFunc()。要使任何 CFC 方法都可以访问您的 UDF,您可以考虑将 UDF 放在 FormUrl 范围内,以避免需要使用范围前缀。

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

IMO 最简单的方法是将 UDF 放入 math.cfm 并在我需要使用它们之前包含它。

【讨论】:

  • 我认为将函数放在 CFC 中并将其存储在共享范围中会更容易 - 最有可能是应用程序范围,并且更有可能使用 ColdSpring,这样您就可以在您的服务层以及任何“视图”文件中(从 MVC 的角度来看)
【解决方案2】:

您可以将经常使用的函数放在请求范围内。

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

我发现这很容易使用。也可以将组件或功能放在应用程序范围内,但正如亨利指出的那样,当您开发或更改网站时,这可能真的很烦人。

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

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

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

<cfset test = request.func1()>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2022-07-03
    • 2010-11-20
    • 2014-02-28
    • 2012-04-30
    • 2013-09-07
    相关资源
    最近更新 更多