3

更新:似乎railo根本没有这个问题。

更新:我投票结束这个问题,因为我觉得人们更多地关注整体“有人有更好的想法拆分大型组件”这个问题的一部分(我不应该提出)然后是真正的问题将 cfincludes 与 cfcomponent 一起使用。

注意:这只是一个简化的例子,说明我正在尝试做些什么来传达这个想法。

我遇到的问题是我想在 cfcomponent 中使用 cfinclude ,以便我可以将类似的方法分组到单独的文件中以提高可管理性。我遇到的问题是当我尝试扩展另一个也使用 cfinclude 来管理它的方法的组件时,如下所示。请注意,ComponentA 扩展了 ComponentB:

ComponentA
==========
<cfcomponent output="false" extends="componentb">
    <cfinclude template="componenta/methods.cfm">
</cfcomponent>

componenta/methods.cfm
======================
<cffunction name="a"><cfreturn "componenta-a"></cffunction>
<cffunction name="b"><cfreturn "componenta-b"></cffunction>
<cffunction name="c"><cfreturn "componenta-c"></cffunction>
<cffunction name="d"><cfreturn super.a()></cffunction>

ComponentB
==========
<cfcomponent output="false">
    <cfinclude template="componentb/methods.cfm">
</cfcomponent>

componentb/methods.cfm
======================
<cffunction name="a"><cfreturn "componentb-a"></cffunction>
<cffunction name="b"><cfreturn "componentb-b"></cffunction>
<cffunction name="c"><cfreturn "componentb-c"></cffunction>

问题是,当我尝试初始化 ComponentA 时出现错误:“例程不能被多次声明。例程 a 已在不同的模板中声明了两次。”

这样做的全部原因是因为当您使用 cfinclude 时,它​​是在运行时而不是编译时评估的。

除了将方法移入组件本身并消除使用 cfinclude 之外,我该如何解决这个问题,或者有人有更好的想法来拆分大型组件?

4

5 回答 5

2

未经测试,但我会尝试将每个函数的内容放在包含中,但在组件文件本身中定义函数。`

<cfcomponent name="a">
    <cffunction name="aa">
        <cfinclude template="componenta/functiona.cfm" />
    </cffunction>
</cfcomponent>

祝你好运。

于 2010-06-13T03:22:34.690 回答
0

我的建议是:重新分析您的对象,尝试应用所有 OOP 规则和最佳实践(抽象、封装、模块化、多态性、继承、DRY 等)。

所以基本上你希望组件 B 有方法 isCrunchable(),然后组件 A 扩展 B,并且 isCrunchable() 可以从继承中获得。A 和 B 都会返回不同的状态,所以我认为这没有任何问题。如果你创建一个类“高于”它具有所有方法和组件 A 和 B 扩展该类,你会得到“大型组件”的解决方案,但同样,我会尝试更多地处理这个问题。

如果这个答案没有帮助,您可以发布真实示例,也许我们会更好地了解您为什么需要这样做。

于 2010-06-12T21:17:05.010 回答
0

我同意 zarko,你应该重新排列你的物品,但如果你必须...

在 CF5 中,我使用了将函数放入请求范围的技巧。这可以通过将函数名称分配给同名的请求变量来完成,即对于名为 getLatestUpdate 的函数:

Request.getLatestUpdate = getLatestUpdate

然后,在将文件包含在函数中之前,请检查请求范围内是否存在变量。如果请求范围的变量不存在,则仅 cfinclude 函数文件。

缺点是您需要引用具有请求范围前缀的函数,而且这仅适用于页面请求的传统隐喻,它很可能会中断诸如远程调用之类的事情。

我还没有测试过这个和 YMMV。

于 2010-06-12T22:49:46.010 回答
0

我还没有测试过它,但是用类似的东西包装你的 cfinclude 怎么样:

<cfif NOT structKeyExists(this,"someMethodNameInIncludeFile")>
      <cfinclude....>
</cfif>
于 2010-06-12T23:52:15.633 回答
0

如果您的问题纯粹是为了避免巨大的笨重物体,也许您可​​以将您的物体分解成几个较小的物体。组件 A 仍然可以包含方法 ABCD,但是方法 A 调用 ComponentA_A 方法 A,方法 B 调用 ComponentA_B 方法 B 等等。最好每个子组件不是基于任意分组,而是基于功能的合理分组。另一件要试验的事情(这是在黑暗中的狂野刺伤)功能通常被描述为附加到某个范围的结构。例如,您可以通过 structDelete(this, onRequestStart) 从 Application.cfc 中删除函数。也许您可以使用相同的方法来删除先前附加到包含中请求范围的函数?

于 2010-06-14T03:57:26.980 回答