【问题标题】:Large form processing with ColdFusion via ajax通过 ajax 使用 ColdFusion 处理大型表单
【发布时间】:2018-01-09 19:36:42
【问题描述】:

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

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

因为 CFC 中的每个函数都可能很大(可能有 1200 行代码),所以我得到了可怕的“branch target offset too large for short”错误冷融合。为了解决这个问题,我将一些代码放入 .cfm 文件并使用<cfinclude> 将代码重新放入 cfc 中,这“解决”了问题,但在尝试组织所有小 sn-ps 以进行关联时,我感到很困惑使用特定的 CFC。这也可能是一种低效的工作方式。

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

我想到的一些选项是:

  • 为没有太多代码的创建、更新、读取和删除操作创建“shell”函数
  • 在 shell 函数cfinclude 中,所有代码都通过来自许多其他 .cfm 文件的子函数进行 sn-ps,以将代码保持在最低限度
  • 或调用其他执行子功能的 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>,但这样做似乎很奇怪。有没有人知道的替代/更好/标准方式?

【问题讨论】:

  • 您使用的是什么版本的 ColdFusion?也基于这篇文章:coldfusionmuse.com/index.cfm/2007/9/28/Branch.Target.Offset 你可能有太多的ifs 或循环,Java 简直要疯了。
  • 你在使用事务吗?我已经看到cftransaction 的长块创建了这个问题。
  • @JamesAMohler 使用 ColdFusion 2016 企业版。有很多 cfif 标签,但我无法进一步降低它们。我尝试减少它们,并删除 <cftransaction> 标签,但它没有用。唯一的方法是将代码抽取到 .cfm 文件中,然后使用 <cfinclude> 在 CFC 中将它们重新组合在一起。这让我想到可能有更好的/模块化/oop 方式来做到这一点。
  • 我不以这种方式使用 ajax 或 cfc。但是,通常被认为是一种良好的编程习惯的事情是函数应该只做一件事。如果你有超过 1000 行的函数,你可能没有遵循这种做法。

标签: ajax coldfusion coldfusion-2016


【解决方案1】:

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,我在墙上打印出一个深度子对象的元数据转储作为抽象艺术。

【讨论】:

  • 您意识到这两个代码示例在逻辑上并不等效,我相信。
  • @DanBracuk 大多数应用程序都不合逻辑。 :)
  • 敬畏重构遗留的乐趣
  • 这很有趣,我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-24
  • 2013-05-04
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多