2010-06-12 43 views
3

更新:似乎railo根本沒有這個問題。如何使用cfinclude拆分組件並仍使用繼承?

更新:我投票的感覺的人更注重整體,關閉這個問題,因爲我「是否有人有更好的主意分裂大部件」的一部分這個問題(這是我不應該把in),然後是使用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我得到一個錯誤:「例程不能被多次聲明的例程已經在不同的模板聲明兩次。 「

這樣做的全部原因是因爲當您使用cfinclude時,它在RUN TIME而不是COMPILE TIME評估。

將方法移動到組件本身並消除使用cfinclude的缺點,我如何解決這個問題或者是否有人有更好的想法分離大型組件?

回答

0

我的建議是:重新分析您的對象,嘗試應用於所有OOP規則和最佳實踐(抽象,封裝,模塊化,多態性,繼承,DRY等)。

所以基本上你希望組件B有方法isCrunchable(),那麼組件A擴展B,並且isCrunchable()可以從繼承中獲得。 A和B都會返回不同的狀態,所以我沒有看到任何問題。 如果您製作了一個「上方」的類,其中所有的方法和組件A擴展了這個方法,那麼您可以爲「大型組件」獲得解決方案,但是我會再試一次。

如果這個答案沒有幫助,你可以發表真實的例子,也許我們會更好地瞭解爲什麼你需要這樣做。

+1

問題是,使用cfcomponent內部的cfinclude會導致上述的例程錯誤。這是因爲cfinclude直到運行時才執行,因爲一個組件正在擴展另一個組件,coldfusion正在執行包含相同方法名稱的cfincludes,導致錯誤。我的問題是否有解決方法? – rip747 2010-06-12 21:39:34

+0

我明白你的問題,我理解爲:「我試圖用腿拍自己,沒有工作,因爲我的槍吮吸,不能在同一時間吹雙腿,我怎麼能做到這一點? 我在辦公室裏有一個方法,有66個參數和2k行代碼,位於cfk的7k行代碼中,Eclipse不喜歡它,我不喜歡它,我的經理不喜歡它,但是我認爲我不應該通過將它分成7個不同的文件並將其吐到長輩的臉上,而這些長輩會努力尋找最佳的編程方式:) – 2010-06-13 08:24:25

+0

之所以這樣做,是因爲我在嘗試在CFWheels中實現類似於ActiveModel的東西。如果你想看一看源代碼並給我一些建議,那麼它會很感激。 http://github.com/rip747/cfwheels。特別是看看我們如何實現模型部分http://github.com/rip747/cfwheels/tree/master/wheels/model/ – rip747 2010-06-16 12:30:56

0

我與扎克是這一點,你應該重新安排你的對象,但如果你必須...

在CF5我曾經把功能在請求範圍的一招。這可以通過指定函數名同名的請求變量來實現,即一個名爲getLatestUpdate功能:

Request.getLatestUpdate = getLatestUpdate 

然後,包括與功能的文件之前,爲的存在做了再檢查一下變量在請求範圍內。如果請求範圍變量不存在,則只包含函數文件。

你需要用請求範圍前綴來引用函數,而且這隻會在頁面請求的傳統隱喻中起作用,它很可能會在遠程調用等事件中發生。

我還沒有測試過這個和YMMV。

0

我沒有測試過,但對於喜歡的東西來包裝一下你cfinclude:內

<cfif NOT structKeyExists(this,"someMethodNameInIncludeFile")> 
     <cfinclude....> 
</cfif> 
+0

那麼重寫呢?認爲這打破了整個繼承的想法。 – Sergii 2010-06-13 07:46:11

2

沒有測試,但我會在包括嘗試將每個功能的內容,但定義功能組件文件本身。 `

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

祝你好運。

0

如果您的問題純粹是爲了避免巨大笨重的物體,也許您可​​以將您的物體分解成幾個較小的物體。組件A仍然可以包含方法ABCD,但方法A調用ComponentA_A方法A,方法B調用ComponentA_B方法B等。最好如果每個子組件不是基於任意分組,而是基於功能的合理分組。 另一件需要試驗的東西(這是一種在黑暗中刺穿的)通常被描述爲附屬於某個範圍的結構。你可以通過structDelete(this,onRequestStart)從Application.cfc中刪除函數。也許你可以使用相同的方法刪除之前附加到include請求範圍中的函數?