代码之家  ›  专栏  ›  技术社区  ›  rip747

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

  •  3
  • rip747  · 技术社区  · 14 年前

    更新: 似乎 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>
    

    问题是,当我尝试初始化组件时,我得到一个错误: “不能多次声明例程。例程A在不同的模板中声明了两次。“

    这完全是因为当使用cfinclude时,它是在运行时而不是编译时进行评估的。

    除了将方法移入组件本身并消除cfinclude的使用之外,我如何才能绕过这个问题,或者有人对拆分大型组件有更好的想法吗?

    5 回复  |  直到 14 年前
        1
  •  0
  •   zarko.susnjar    14 年前

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

    所以基本上,您希望组件B具有方法iscrunchable(),然后组件A扩展了B,iscrunchable()可以从继承中获得。A和B都会返回不同的状态,所以我看不出有任何问题。 如果您让一个类“above”具有所有方法和组件A和B扩展该类,那么您将获得“大型组件”的解决方案,但我再次尝试对此进行更多的分析。

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

        2
  •  2
  •   Ben Doom    14 年前

    没有测试,但我会尝试将每个函数的内容放入include中,但在组件文件本身中定义函数。`

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

    祝你好运。

        3
  •  0
  •   David Collie    14 年前

    我和扎尔科在这件事上,你应该重新安排你的物品,但如果你必须…

    在CF5中,我使用了一个将函数放入请求范围的技巧。这可以通过将函数名分配给同名的请求变量来实现,例如,对于一个名为getlatestudate的函数:

    Request.getLatestUpdate = getLatestUpdate
    

    然后,在将文件包含在函数中之前,对请求范围中的变量的存在进行检查。只有当请求范围的变量不存在时,才包含函数文件。

    缺点是您需要引用带有请求作用域前缀的函数,而且这只在传统的页面请求隐喻中有效,它很可能会打断远程处理调用之类的事情。

    我没有测试过这个和YMMV。

        4
  •  0
  •   marc esher    14 年前

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

    <cfif NOT structKeyExists(this,"someMethodNameInIncludeFile")>
          <cfinclude....>
    </cfif>
    
        5
  •  0
  •   John M    14 年前

    如果您的问题纯粹是为了避免巨大的不易处理的对象,那么您可以将对象分解为几个较小的对象。组件A仍然可以包含方法abcd,但方法A调用组件A方法A,方法B调用组件B方法B等。如果每个子组件不是基于任意分组,而是基于功能的合理分组,则最佳。 另一个要试验的东西(这是一个黑暗中的疯狂刺伤)功能通常被描述为附属于某个范围的结构。例如,您可以通过structDelete(this,onRequestStart)从application.cfc中删除函数。也许您可以使用相同的方法删除include中先前附加到请求范围的函数?