我经常使用Ajax(Jquery)来发送表单以便在ColdFusion中进行处理。我将表单发送到CFC,通过Ajax通知将结果和错误返回给用户。
表单可能非常大(想想带有额外输入的完整HTML页面),并且需要CFC中的大量逻辑才能正确处理,具体取决于表单中选择的选项。
因为CFC中的每个函数都可能很大(可能是1200行代码),所以我得到了可怕的“ 分支目标偏移太大而不能 ”错误ColdFusion的。为了解决这个问题,我已经将一些代码放入.cfm文件中并使用<cfinclude>
将代码返回到cfc中,这样可以“解决”问题,但在尝试组织所有小片段以关联时我觉得很困惑与特定的CFC。它也可能是一种低效的工作方式。
我想知道其他ColdFusion用户如何使用CFC构建/处理处理表单,这些CFC在将表单数据导入数据库时会执行大量其他操作。
我想到的一些选项是:
cfinclude
中,所有代码都是通过子函数从许多其他.cfm文件中获取代码来保持代码最小化上面的选项最终会让我有这样的结构(我不喜欢):
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>
但是这样做似乎很奇怪。有没有人知道的替代/更好/标准方式?
答案 0 :(得分:2)
cfif/cfelseif/cfif
或cfswitch/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>
您可以将这些条件检查移动到单独的函数中,尤其是在您最终只设置单个变量的值时。
如果您处于绑定状态,只需将代码移至include并稍后将其分解即可。单个函数中的1200行代码不算什么。我的最后一场演出的CFCs只是成堆的包括,扩展了其他成堆的包含的CFCs,每个包含可以包含20-30k行代码,其中包含包含include的函数。函数中的包含通常用于专门解决分支偏移问题。
FWIW,我在我的墙上打印出深度子对象的元数据转储作为抽象艺术。