gpt4 book ai didi

architecture - 你如何组织你的小型可重用 cffunctions?

转载 作者:行者123 更新时间:2023-12-03 20:19:52 24 4
gpt4 key购买 nike

我正在重新组织我的 ColdFusion 目录结构,并对有经验的 CF 开发人员如何组织较小的 cffunctions 库感到好奇。

我对复杂的组件(对象)并不像我对我们随着时间的推移而建立的几十个小实用函数那么好奇。

  • 您是否使用带有 cffunctions 和 cfinclude 的大型单个文件?
  • 您是否使用大型单个文件作为 cfcomponent 并调用 creatobject/cfinvoke?
  • 您是否将每个实用程序 cffunction 放在自己的 cfc 中并调用 createobject/cfinvoke?
  • 你使用 cfimport taglib 语法吗?
  • 你使用 CustomTags 还是 cfmodule?
  • 你有更好的方法吗?

  • 因为我不喜欢冗长的语法,所以我只是在 cfinclude 一个 lib.cfm,其中有一堆常见的 cffunctions。我可以将它们重构为分组 cfc,我可以在其上创建对象,以便更好地隔离变量作用域。

    有一个更好的方法吗?

    最佳答案

    这是一篇 blog post I did 的转载回到 2007 年 6 月 13 日。我已经使用这种方法有一段时间了,效果很好!天啊。

    谁不喜欢用户定义函数 (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 可用于您的应用程序。我见过的几乎每个人都将组件加载到应用程序范围内。将以下行放入 onApplicationStart()如果您使用的是 Application.cfc 或者只是将其添加到 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>

    关于architecture - 你如何组织你的小型可重用 cffunctions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/624541/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com