更新:似乎railo根本没有此问题。
更新:我投票决定关闭此问题,因为我觉得人们更关注整体“有人有更好的想法拆分大组件”这个问题的一部分(我应该永远不会放入)然后使用cfinclude与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时,它会在RUN TIME而不是COMPILE TIME进行评估。
没有将方法移动到组件本身并且不使用cfinclude,我如何解决这个问题,或者有人更好地分割大型组件?
答案 0 :(得分:2)
未经测试,但我会尝试将每个函数的内容放在include中,但是在组件文件本身中定义函数。 `
<cfcomponent name="a">
<cffunction name="aa">
<cfinclude template="componenta/functiona.cfm" />
</cffunction>
</cfcomponent>
祝你好运。
答案 1 :(得分:0)
我的建议是:重新分析您的对象,尝试应用所有OOP规则和最佳实践(抽象,封装,模块化,多态,继承,DRY等)。
所以基本上你希望组件B有方法isCrunchable(),然后组件A扩展B,并且isCrunchable()可以从继承获得。 A和B都将返回不同的状态,所以我没有看到任何问题。 如果你创建一个“上面”的类,其中所有的方法和组件A和B都扩展了那个,那么你就可以获得“大型组件”的解决方案了,但是,我再次尝试更加努力。
如果这个答案没有帮助,你可以发布真实的例子,也许我们会更好地了解为什么你需要这样做。
答案 2 :(得分:0)
我和zarko在一起,你应该重新排列你的对象,但如果你必须......
在CF5中,我使用了将函数放入请求范围的技巧。这可以通过将函数名称分配给同名的请求变量来完成,即对于名为getLatestUpdate的函数:
Request.getLatestUpdate = getLatestUpdate
然后,在包含具有函数的文件之前,请对请求范围中变量的存在进行检查。如果请求范围变量不存在,则只包括函数文件。
下行是你需要引用带有请求范围前缀的函数,而且这只会在页面请求的传统比喻中起作用,它很可能会破坏远程调用。
我没有测试过这个和YMMV。
答案 3 :(得分:0)
我还没有对它进行过测试,但是如果用以下内容包装你的cfinclude呢?
<cfif NOT structKeyExists(this,"someMethodNameInIncludeFile")>
<cfinclude....>
</cfif>
答案 4 :(得分:0)
如果您的问题纯粹是为了避免使用庞大的笨重物体,也许您可以将对象分解为几个较小的物体。组件A仍然可以包含方法ABCD,但方法A调用ComponentA_A方法A,方法B调用ComponentA_B方法B等。如果每个子组件不是基于任意分组,而是基于功能的合理分组,则最佳。 另一件要试验的东西(这是黑暗中的野生刺)功能通常被描述为附加到某个范围的结构。例如,您可以通过structDelete(this,onRequestStart)从Application.cfc中删除函数。也许您可以使用相同的方法删除以前附加到include? p>中的请求范围的函数