首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你如何组织你的小的可重复使用的功能?

你如何组织你的小的可重复使用的功能?
EN

Stack Overflow用户
提问于 2009-03-08 23:26:42
回答 5查看 3.5K关注 0票数 15

我正在重组我的ColdFusion目录结构,并对经验丰富的CF开发人员如何组织小型功能库感到好奇。

我对复杂的组件(对象)不感兴趣,就像我对随着时间推移而构建的数十个小的实用函数一样。

  • 您是否使用带有cffunctions的大型单个文件并将其包括在内?
  • 您是否使用一个大的单个文件作为cfcomponent并调用creatobject/cfinvoke?
  • 您是否将每个实用程序功能放在自己的cfc中,并调用createobject/cfinvoke?
  • 是否使用cfimport taglib语法?
  • 您使用的是CustomTags还是or模块?
  • 你有更好的方法吗?

因为我不喜欢冗长的语法,所以我一直在总结一个lib.cfm,其中包含了一些常见的功能。我可能会将它们重构成分组cfcs,我可以在其上创建对象,以便在可变范围内有更好的隔离。

有更好的方法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-09 02:02:01

这是2007年6月13日我写的博文的重印版。我已经用了很长一段时间了,而且效果很好!YMMV

谁不喜欢用户定义的函数(UDF)?如果您做过任何编程,那么很可能您已经广泛地使用了它们。人们面临的最大问题是如何在应用程序中包含和组织它们。

我发现大多数人所做的是创建一个Utils.cfc或UDFs.cfc,并剪切并粘贴他们想要使用的UDF到组件中,如下所示:

代码语言:javascript
复制
<!--- 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.cfc,则只需将其添加到Application.cfm中即可:

代码语言:javascript
复制
<cfset application.functions = CreateObject("component", "udfs").init()>

无论您使用哪个UDF,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行代码:

代码语言:javascript
复制
<!--- 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文件的目录。UDFs.cfc所做的是在这个目录被调用时扫描它,并自动包含它找到的每个CFM文件。因此,它会自动将UDF文件夹中的任何UDF加载到自己(通常称为"mixin")中。

所以我的目标实现了!我在自己的文件中有每个UDF,所以我不必滚动一个巨大的组件文件来找到它。现在我可以轻松地打开和编辑它了。只要看一下目录,我就知道我的应用程序正在使用什么UDF。我只需将浏览器中的文本保存到目录中的一个文件中,就可以从CFLib.org自动添加一个UDF。另外,如果我不再需要在我的应用程序中使用UDF,我只需从目录中删除该文件,并在下一次重新输入时将它从我的应用程序中删除。所有这些都是在不需要触摸主UDFs.cfc文件的情况下完成的。

下面是一个UDF文件的示例。该文件名为fullLeft.cfm,驻留在UDF目录中。

代码语言:javascript
复制
<!--- 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>
票数 20
EN

Stack Overflow用户

发布于 2009-03-09 01:17:35

我认为这取决于你的编程风格,选择你最喜欢的哪种风格。我发现最简单的方法是在application.cfm中,将应用程序范围中的变量设置为包含所有实用程序函数的cfcomponent:

代码语言:javascript
复制
<cfif not isDefined("application.utilities")>
    <cfset application.utilities = createObject("component", "Utilities")>
</cfif>

现在您可以从任何地方调用application.utitlies中的方法。请注意,如果您对cfcomponent进行了更改,则必须使用新的实用程序实例刷新应用程序变量。

票数 1
EN

Stack Overflow用户

发布于 2009-03-27 21:50:10

如果您正在使用Application.cfc (如果不是,我强烈建议从Application.cfm迁移到它--这很容易),您可以用所有的UDF方法构建一个baseComponent.cfc,并让Application.cfc继承baseComponent。然后在onRequestStart方法中设置一个名为request.app=this的变量;

对于实体请求,可以使用request.app.methodname()访问UDF。它是处理UDF的非常好而简单的方法。

此外,如果您愿意,您可以让您的cfc从同一个baseComponent继承,以便您的所有cfc都有那些作为本机方法的util函数。使单元测试cfcs非常容易,因为cfcs不需要对传递(注入) UDf组件的引用作出答复,它们是它的死者!

这种方法的一个挑战是cfc的extends属性不能是表达式.因此,这可能很难实现,这取决于您如何打包组件。处理它的最简单的方法是使用coldfusion映射。

乔恩

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/624541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档