如何使用cfinclude拆分组件并仍使用继承?

时间:2010-06-12 20:58:02

标签: oop coldfusion cfwheels

更新:似乎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,我如何解决这个问题,或者有人更好地分割大型组件?

5 个答案:

答案 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?中的请求范围的函数