3

WACK说:

如果你觉得你需要有很多争论,可以考虑创建一个 CT。

...

CT 比自定义函数更强大、更灵活。尝试将 UDF 用于简单的事情......将 CT 和组件用于更多涉及的过程,尤其是那些您可以将其视为离散动作而不是简单的“按摩”的过程

好的,但是您通常如何做出决定?了解现实生活中的实践和例子很有趣。

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

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

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

提前致谢。

4

7 回答 7

5

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

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

更新:出于好奇,您指的是哪本书(版本和卷)以及哪一页?

于 2009-03-16T12:29:10.850 回答
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 的方法。

于 2009-03-16T12:37:34.977 回答
1

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

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

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

另外,正如另一位评论的那样,允许你做一些聪明的事情......我特别使用的一件事是我设置了 prefix="" 然后我基本上可以强制简单的 html 标签(如 <a> 标签)被踢在运行时通过自定义标签处理程序 - 因此 html 标签在运行时变得智能......我这样做是为了分析 href 和目标属性并决定是否要显示 pdf 图标(或其他 mime 类型图标)下一个到链接......它很漂亮!这在内容管理系统中特别有用,或者当 7 有 html 开发人员使用 Dreamweaver 或做出贡献时,您希望他们的标签触发智能冷融合标签,而不需要他们在标准 html 之外做任何事情 - 编辑器不知道任何区别,他们不需要进入“代码”视图以创建一些相当强大的功能。

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

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

乔恩

于 2009-03-27T21:41:56.423 回答
0

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

我还认为我更喜欢函数,因为我喜欢 cfscript 编码。有几次我不得不将遗留 CT 包装到 UDF 中,以便能够在完全 cfscript-ed 页面上使用它。这是 UDF 的一个优点。

于 2009-03-16T19:51:17.743 回答
0

不知道为什么我会陷入这种模式,但一般来说,我对任何输出 HTML 和 UDF 的东西都使用自定义标签(总是使用 cfmodule)来处理任何只返回简单数据/对象的东西。我意识到 UDF 也可以输出,但我不喜欢我的函数有任何副作用,这感觉就像一个。出于类似的原因,我现在在以前使用 cfinclude 的任何地方使用自定义标签,因为它们提供数据封装。

于 2009-03-27T22:11:41.687 回答
0

cfmodule对功能没有优势;cfinvoke工作原理一样。

当然,cfimport您可以启用一个漂亮整洁的命名空间 CT 语法 - 这是自定义标签很好的时候:当使用清晰的打开/关闭构造时,或者如果嵌套逻辑很重要。

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

于 2009-03-16T00:09:05.450 回答
0

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

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

于 2009-03-22T00:35:57.830 回答