我重新组织我ColdFusion目录结构和我很好奇怎么有经验的CF开发组织图书馆的小cffunctions.

我不是因为好奇的精心组成部分(目的),因为我有关的几十个小的实用功能,我们所有建立随时间。

  • 你使用一个大的单一文件与cffunctions和cfinclude?
  • 你使用一个大的单一文件作为cfcomponent,并呼creatobject/cfinvoke?
  • 你把每一个实用工具cffunction在其自己的氟氯化碳,并呼则/cfinvoke?
  • 你使用的cfimport标签库法?
  • 你使用的CustomTags或cfmodule?
  • 你有更好的办法?

因为我不喜欢详细的语法我已经只是cfincluding一lib。cfm,有一堆共同cffunctions。我可能"重构"他们分组的氟氯化碳,我可以则上只要有更好的孤立变量范围。

有没有更好的方式做到这一点?

有帮助吗?

解决方案

这是一个重印的 我没有博客 回June13,2007年。我已经用这种方法对于相当一段时间以及它的伟大工程!情况因人而异。

谁不喜欢用户定义的职能(Udf)?如果你已经做了任何程序,机会是,你已经使用了他们广泛。最大的问题,人们已经与他们是如何为包括并组织他们在你的申请。

我发现了什么,大多数人做的是创建一个工具.氟氯化碳或Udf。氟氯化碳和剪切和粘贴他们的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() 如果你使用的应用程序。氟氯化碳或者通过只加入的应用程序。cfm如果您使用的是:

<cfset application.functions = CreateObject("component", "udfs").init()>

任何一个你正在使用的应用程序。氟氯化碳或应用程序。cfm,结果是相同的;你所有的Udf可用于应用程序并可以使用他们的自由。唯一的区别是什么样的变量名称使用。我使用的应用程序。功能,其中一些使用的应用程序。工具或应用程序。udf;不要紧,再一次,结果都是相同的。

有一个问题,我已经用这种方法虽然,这是繁琐和Udf组成部分将得到巨大的。该问题具有如此巨大的分量的文件是编辑,它变成了一场噩梦,因为滚动通过万行代码不是很有趣的而且我已经注意到,CFEclipse沼泽下来,在巨大的文件。一定代码的崩溃并提供一些救济,但必须有一个更好的办法。

什么我想要的是只有一个文件针对每个UDF我用和方式对我的应用程序负荷。这背后的原因是如此,如果我需要编辑 myUDF1, 我可以打开文件 myUDF1.cfm 和编辑什么我需要的。我也希望能够抓住Udf从 CFLib.org 只是把它们变成我的应用程序,而不必编辑的东西。如果我需要去除UDF从我的应用程序,这将是作为容易,因为删除该段文件和重新初始化我应用程序。

来完成我想要的,我修改了我的Udf。氟氯化碳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 在相同的目录中,我有我的Udf。cfc。这是目录,我把我所有的UDF CFM文件。什么Udf。氟氯化碳不是扫描这个目录,当它被称为和自动包括每个CFM文件,它的发现。因此它会自动加载的任何Udf在Udf文件夹入本身(通常称为"混合").

所以我的目标是达到!我们每位在其自己的文件,因此我没有滚动通过一个巨大的组成文件中找到它。我现在可以打开并进行编辑容易。只看目录,我知道什么Udf我的应用程序使用。我可以自动添加一个从UDF CFLib.org 通过就节省的文本浏览器进入一个文件的目录。再加上如果我不再需要使用UDF在我的应用程序,我简单地删除该文件的目录,它是从我的应用程序期间的下一个重init。所有这一切都是不必触摸主Udf。氟氯化碳的文件。

下面是一个例子是一个UDF CFM文件看起来象。该文件称为 fullLeft.cfm 和驻留在Udf目录。

<!--- 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>

其他提示

我想这取决于你的编程方式,无论风格你是最舒服。我找到简单的方法是在应用程序。cfm,设定中的一个变量的应用范围的一cfcomponent用我所有的实用功能:

<cfif not isDefined("application.utilities")>
    <cfset application.utilities = createObject("component", "Utilities")>
</cfif>

现在你可以打电话的方法在应用程序。utitlies从任何地方。请注意,如果你改变你的cfcomponent,你已经刷新你的程序变量有一个新的实例的工具。

如果您使用的应用程序。氟氯化碳(如果你不是我强烈建议迁移到它的应用程序。cfm-它很容易做到的)可以建立一个baseComponent.氟氯化碳的用你所有的UDF方法和应用程序。氟氯化碳的继承baseComponent.然后在onRequestStart方法设置一个变量所谓的请求。app=这一点;

为entiure请求,然后可以使用的请求。应用程序。code()访问UDF。它非常好的,简单的方式处理Udf

还有,如果你喜欢,你可以有你所有的氟氯化碳的继承相同的baseComponent因此,你所有的氟氯化碳有这些工具的功能,作为本土方法。使单元的测试,各类氟氯化碳非常容易,因为氟氯化碳不需要答复关于一个通过(注)参考UDf成分,它们是死亡人员的!

一个挑战,这种方法,延伸的属性的一个氟氯化碳的无法表达...所以取决于你如何包件,这可能很难实施。最简单的方法来处理它与coldfusion映射。

禾田 乔恩

我们的使用。cfm文件功能的图书馆,并呼吁适当的文件与cfinclude.一些。cfm文件已经被下载cflib.org 和其他书面通过我们。该文件是在一个目录,名为UDF这是一个子目录的另一个目录,该目录的映射到正斜角色。该cfinclude的发言是简单:

<cfinclude template="/UDF/filename.cfm">

这种做法使职能提供给所有应用程序服务器。

我们也喜欢的几个小型图书馆的方法。每个图书馆是特定主题的(数学、串名单阵等)

选项:你使用一个大的单一文件与cffunctions和cfinclude?

A:我已经做了,但我这样做是越来越少。我想把优势的继承权和cfcexplorer

选项:你使用一个大的单一文件作为cfcomponent,并呼creatobject/cfinvoke?

A:是的,我经常这样做

选项:你把每一个实用工具cffunction在其自己的氟氯化碳,并呼则/cfinvoke?

A:我可能会这样做,如果我希望额外的功能后添加

选项:你使用的cfimport标签库法?

A:我做i18n的东西那种方式

选项:你使用的CustomTags

A:不是在很长一段时间。氟氯化碳的是更好地在这

选项:或cfmodule?

A:不是在很长一段时间。氟氯化碳的是更好地在这个。呼叫者。* 范围可以使它难以调试

我意识到这是一个老问题,但是我用的一点小小的不同方法对这些问题。

实用功能/单一办法'的注射'

我创建了一个'核心'或'实用'cfc。在我的包我的所有实用新型的职能是:

  • 经常使用所有的时间到处(如一般 viewRecord() 道和一个核心 checkSecurity() 功能,et al.)
  • 是基本功能,恕我直言,应该是核心,在CF(例如 lpad(), capitalize(),et al)
  • 有包装的一些标签,请允许我利用 cfscript 无处不在(例如 exit() 其中包裹 <cfexit>)

onApplicationStart(), 我创建的一个实例,这个目,并将其分配给 Application 范围从而创造一个静态的单独的排序。

然后,而不是延长或重新包括这为几乎所有我的氟氯化碳的,它让我可以使用的扩展对于更为传统类型的继承,然后我注入这些方法的构造(init)的我所有的氟氯化碳的是我建立的。我这样做是通过调用的方法上的实用工具的对象本身这样的:

public/remote any function init() {
  structAppend( Variables, Application.MyApp.Objects.oCore.injectCoreMethods() ); 
  return this; // Return instance of this object
}

injectCoreMethods() 方法的选择返回的结构的实用功能,我想几乎扩展到所有我的对象。它并不一定注射 所有 用新方法。不经常使用的,包括 injectCoreMethods() 本身,仍然需要加以解决经由全单的应用程序的指针,这样的 Application.MyApp.Objects.oCore.infrequentMethod().

通过注射吸入 Variables 范围,这是受保护的,这些方法将有效地将私方法。因此,任何垃圾场的对象将不会显示这些工具的功能,但是完全可以在氟氯化碳通过其所有的直接方法。

文件的组织:

我一般都陷入的模式具有一个氟氯化碳的每个文件夹。在每个文件夹,我有一个氟氯化碳的文件的成分和init。所有其它方法我闯入了cfm文件,包括物件在这cfc。我这样做:

  1. 避免巨大的氟氯化碳的文件的1000+线,可以减慢我的IDE(I使用集锦/cfeclipse)
  2. 允许更改被记/追踪的更多分散在一个文件中每个文件的基础上,并因此记录在我SCM/版本控制软件。
  3. 允许多个人的工作一定的对象与推撞码。

因此,一道对象,其中包含4个污物的方法看起来像这样的东西:

/code/dao/dao.cfc
/code/dao/_removeRecord.cfm
/code/dao/_addRecord.cfm
/code/dao/_viewRecord.cfm
/code/dao/_editRecord.cfm

Cfc是的 init() 和自的记录的意见和伪构造的区域包括我的四个方法。这也让我抓住任何氟氯化碳通过其文件夹,并把它移动的地方。

同样的实用cfc。它坐落在其自己的文件夹和具有约30奇的功能之间的10个或以cfm文件(一些简单的功能,我离开的在相同文件的诸如 _string.cfm 它实际上包含了 lpad(), rpad(), 等所有串相关。你的想法。)

模块的定制标签

我避免这些不惜一切代价,因为他们需要进行登记,并妨碍容易移动/部署。我不喜欢的事情,不只是自配置上的拖从一个环境中到另一个。CF5-你不得不做的事情,这种方式更多。但是,由于CF6和能够使用的对象在一个真正面向对象的图案,为什么你想要?有极少数情况下你会想要的/需要。

其他的

我曾把"核心"职能进入基地。cfc是自动延伸到所有的氟氯化碳的产生CF(寻找它,增加一个功能,瞧!有点像添加的东西的原型在js).我曾真的很喜欢这个,但这是一个问题对于部署/维护。

在某种程度上,我的一家工厂的方法。我经常投入大量的静态氟氯化碳是在这样的应用程序的核心之一。一个控制器读取的一般控制表和设置的所有对象在循环随着一些其他的东西上应用程序的开始喜欢的应用程序的变量。但是,一些对象的实例如需要,显然重的对象和目的,包含有可操纵的[半]的持久数据属于这一类别

我有,在某些方面,已经这样做,因为CF7.与CF9+到了很容易、成熟和华而不实的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top