0

我经常使用 Ajax (Jquery) 发送表单以在 ColdFusion 中进行处理。我将表单发送到 CFC,该 CFC 通过 Ajax 通知将结果和错误返回给用户。

表单可能非常大(想想带有额外输入的完整 HTML 页面)并且需要 CFC 中的大量逻辑才能正确处理,具体取决于表单中选择的选项。

因为 CFC 中的每个函数都可能很大(可能有 1200 行代码),所以我从 ColdFusion 中得到了可怕的“分支目标偏移量太大而不能短”的错误。为了解决这个问题,我将一些代码放入 .cfm 文件中,并用于<cfinclude>将代码返回到“解决”问题的 cfc 中,但在尝试组织所有小片段以与特定 CFC 关联时,我感到很困惑。这也可能是一种低效的工作方式。

我想知道其他 ColdFusion 用户如何使用 CFC 构建/处理处理表单,这些 CFC 在将表单数据输入数据库时​​会做很多额外的事情。

我想到的一些选择是:

  • 为没有太多代码的创建、更新、读取和删除操作创建“shell”函数
  • 在 shell 函数cfinclude中,所有其他 .cfm 文件中的子函数的代码片段,以将代码保持在最低限度
  • 或调用其他执行子功能的 CFC,并将表单变量作为参数传递给它们

上面的选项最终会让我拥有这样的结构(我不喜欢):

Article.cfc (CreateArticle, EditArticle etc)
  CreateArticle_InsertImage.cfc
  CreateArticle_ProcessBodytext.cfc
  CreateArticle_InsertUser.cfc
  CreateArticle_CheckIfExistingArticle.cfc
  EditArticle_UpdateImage.cfc
  EditArticle_UpdateBodytext.cfc
  EditArticle_CheckIfExistingArticle.cfc

我最终会为每个函数创建一个新的 CFC,而不是它们本身就是类/对象。它们可能是 CFM 文件(并且可以使用<cfinclude>,但这样做似乎很奇怪。有没有人知道的替代/更好/标准方式?

4

1 回答 1

2

大块cfif/cfelseif/cfifcfswitch/cfcase可能导致分支偏移错误。在某些情况下,我们通过将这些移至单独的cfif语句来解决此问题。这大大减少了代码中的分支数量。

休息:

<cfif ListFindNoCase("myString", trim(arguments.event_key)) GT 0>
   <!--- myString code --->
<cfelseif ListFindNoCase("myOtherString", trim(arguments.event_key)) GT 0>
   <!--- myOtherString code --->
</cfif>

编译:

<cfif ListFindNoCase("myString", trim(arguments.event_key)) GT 0>
   <!--- myString code --->
</cfif>
<cfif ListFindNoCase("myOtherString", trim(arguments.event_key)) GT 0>
   <!--- myOtherString code --->
</cfif>

您可以将这些条件检查移动到单独的函数中,特别是如果您最终只是设置单个变量的值。

如果您处于绑定状态,只需将代码移动到包含并稍后将其分解。单个函数中的 1200 行代码不算什么。我的最后一次演出有只是一堆包含的 CFC,扩展了其他一堆包含的 CFC,每个包含可以包含 20-30k 行代码,其中包含包含的函数。函数中的包含通常是为了专门解决分支偏移问题。

FWIW,我在墙上打印出一个深度子对象的元数据转储作为抽象艺术。

于 2018-01-11T16:02:31.127 回答