你如何决定使用什么:UDF或自定义标签?

时间:2009-03-15 22:22:33

标签: coldfusion user-defined-functions custom-tag

WACK说:

  

如果您觉得需要有很多参数,请考虑改为创建CT。

     

...

     CT显着更强大   比定制功能更灵活。尝试   使用UDF来解决简单问题......使用CT   和组件更多参与   流程,特别是那些你可以做的   我认为这是一种离散的行为   而不是简单的“按摩”

好的,但你通常如何做决定?有兴趣了解真实的实践和例子。

对我来说,当一个函数有许多不需要的参数时,就会发生这种情况,因此我必须将它们称为myFunc(arg1 =“foo”,arg2 =“bar”)。有时<cfmodule>语法变得更易读,但并非总是如此。

其他原因是我不喜欢长(例如,超过2个代码屏幕)UDF。

但所有这些想法都是非常主观的,这就是为什么我有兴趣阅读其他人的意见。也许有更好的规则?

提前致谢。

7 个答案:

答案 0 :(得分:5)

社区中可能有很多人不同意我,但这是我一般的想法。如果您需要做的事情涉及输出到屏幕,并且如果将其“包裹”在其他代码或文本周围是有意义的,那么自定义标记可能是有序的。在所有其他情况下,UDF工作正常,通常更好。话虽如此,在接近8年的CF开发中,我真的没有遇到过定制标签的理由。我不是说原因不存在,但我会说它们很少见。

如果你有一个很长的UDF,可以安全地假设这是你通过调用这个UDF输出到屏幕的东西(不是真的返回我的意思)?如果可能有意义的话,我会考虑将UDF分解为更小的更易于管理的部分,但就像你暗指的那样,最重要的是对你,你的团队和那些可能追随你的人最具可读性的东西。

更新:出于好奇,您所指的CFWACK书籍(版本和数量)以及哪个页面?

答案 1 :(得分:2)

我记得事情,可以随时调用自定义标记,因为必须先定义UDF才能使用它们。这使得自定义标签更容易。如果你拥有庞大的UDF库,那么确保将它们全部包含在内并且服务器可能难以解析它们(至少在过去的日子里)是非常麻烦的。

然而,UDF可以更紧凑的方式使用

<cfif myUdf(myVariable)>

自定义标签的优势在于它们可以很好地与您的标记保持一致。

<h1>Order Page</h1>
<cf_basket_nav>
  <ul>
  <cfloop ...>
    <li>
    <cf_basket_item item="#items[i]#">
    </li>
  </cfloop>
  </ul>
</cf_basket_nav>

现在一般来说,我会有一个'utils'CFC,其中包含UDF的方法。

答案 2 :(得分:1)

关于在udfs或cfc方法上使用自定义标记的一个考虑因素是,当您发现子例程需要传递子项的数组时,您可以使用嵌套的自定义标记将子自定义标记及其元素关联到父自定义标记。这允许你做一个非常好的干净编码,易于阅读:

<cfmenubar ... >
  <cfloop array="menuitems" ...>
    <cfmenubaritem url="#i.url#">
      #i.label#
    </cfmenubaritem>
  </cfloop>
</cfmenubar>

是的,是的,我知道我们有更好的dhtml内容,如菜单和标签,这只是指出一个例子。您可以在自定义标记中使用cfassociate将属性“传递”到父自定义标记,然后在executionmode =“end”中访问关联属性数组中所有动态生成的子项。这是您在此示例中循​​环并将菜单输出到屏幕的位置。

另外,正如另一个评论,允许你做一些聪明的事情...特别是我使用的一件事是我设置前缀=“”然后我可以基本上强制简单的HTML标签(如&lt; a&gt;标签)在运行时通过一个自定义标签处理程序 - 所以一个html标签在运行时变得聪明...我这样做,所以我可以分析href和目标属性,并决定我是否要显示一个PDF图标(或其他哑剧)链接旁边的类型图标...它很漂亮!这在内容管理系统中尤其有用,或者7你有html开发人员使用Dreamweaver或贡献你想让他们的标签激活智能coldfusion标签,而他们没有做任何标准html以外的事情 - 编辑器不知道任何差异,他们不需要进入“代码”视图,制作一些相当强大的功能。

最后,在自定义标记中,您可以选择抑制输出(或使用缓存),因此这对于包装动态生成的html的chunck非常有用...访问executionmode EQ中的thistag.generatedcontent变量“结束“模式

不要把婴儿扔掉这个洗澡水...我同意他们的使用频率低得多,因为我们有cfcs,但是在自定义标签中仍然有一些强大的功能......我通常有一个或两个每个应用程序(至少几十个cfcs)

HTH 乔恩

答案 3 :(得分:0)

cfmodule没有功能优势; cfinvoke的工作原理相同。

当然,使用cfimport,您可以启用一个漂亮整洁的命名空间CT语法 - 这就是自定义标记很好的时候:使用clear open / close构造时,或者嵌套逻辑很重要。

对于其他一切,特别是在返回结果时,函数更容易处理。

答案 4 :(得分:0)

杰里米指出了有用的选择:用CT包装HTML。但这个功能似乎很少使用。无论如何,这对CT来说是一个加分。

另外我认为我喜欢功能因为我喜欢cfscript编码。我很少有时间将传统CT包装到UDF中,只能在完全cfscript-ed页面上使用它。这对UDF来说是一个加分。

答案 5 :(得分:0)

简单的可重用代码可以进入UDF。这可能包括字符串格式化,数据结构操作等等。

对于比这更复杂的事情,我会考虑使用CFC而不是自定义标签。您将能够在OO模型中编写更清晰的代码。如果您希望为更习惯于使用标记的人提供易用性,则可以始终使用自定义标记将逻辑包装在CFC中。

答案 6 :(得分:0)

我不确定为什么会遇到这种模式,但一般情况下我会使用自定义标签(总是使用cfmodule)来输出任何只返回简单数据/对象的HTML和UDF。我意识到UDF也可以输出,但我不喜欢我的功能有任何副作用,这感觉就像一个。出于类似的原因,我现在在之前使用cfinclude的地方使用自定义标签,因为它们提供了数据封装。