Frage

UPDATE: Es scheint, dass Railo hat dieses Problem nicht bei allen .

UPDATE: Ich wähle dieses Problem, wie ich zu schließen, wie die Menschen fühlen sich mehr im Großen und Ganzen konzentrieren „hat jemand eine bessere Idee Aufspaltung große Komponenten“ Teil dieser Frage (was ich habe das eigentliche Problem von cfincludes mit cfcomponent verwendet wird.

nie setzen in), dann

. Hinweis: Dies ist nur ein vereinfachtes Beispiel dafür, was ich versuche, die Idee zu vermitteln zu tun

Das Problem, das ich habe ist, dass ich cfinclude innen cfcomponent verwenden möchten, so dass ich Gruppe wie Methoden in separate Dateien für mehr Verwaltbarkeit. Das Problem, das ich in laufen lasse, wenn ich versuche, eine andere Komponente zu erweitern, die auch Anwendungen cfinclude es Methode zu verwalten, wie unten gezeigt. Beachten Sie, dass Componenta erstreckt 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>

Das Problem ist, dass wenn ich versuche, COMPONENTA Ich erhalte einen um den Fehler zu initialisieren: „. Routines nicht mehr deklariert werden als einmal die Routine eines hat in verschiedenen Vorlagen zweimal erklärt worden“

Der ganze Grund dafür ist, dass, wenn Sie cfinclude verwenden Sie es während der Laufzeit statt der Kompilierung ausgewertet wird.

Kurz das Bewegen der Methoden in die Komponenten selbst und die Verwendung von cfinclude beseitigen, wie kann ich dies umgehen, oder hat jemand eine bessere Idee Aufspaltung große Bauteile?

War es hilfreich?

Lösung

Mein Rat ist: Ihre Objekte erneut analysieren, versuchen Sie, alle OOP Regeln und Best Practices (Abstraktion, Kapselung, Modularität, Polymorphismus, Vererbung, DRY etc.) anzuwenden.

Also im Grunde wollen Sie Komponente B Methode isCrunchable haben (), erstreckt sich dann die Komponente A B und isCrunchable () ist von Vererbung zur Verfügung. Sowohl A und B unterschiedliche Zustände zurückkehren, damit ich kein Problem mit diesem sehen. Wenn Sie eine Klasse „oben“ zu machen, die alle Methoden und Komponenten A und B erstrecken, dass man Sie Ihre Lösung für „große Komponenten“ bekommen würde, aber wieder, würde ich versuchen, diese ein bisschen mehr knirschen.

Wenn diese Antwort nicht hilft, können Sie echtes Beispiel posten, vielleicht werden wir eine bessere Vorstellung bekommen, warum diese so getan benötigen.

Andere Tipps

Nicht getestet, aber ich würde den Inhalt der einzelnen Funktionen in einem Versuch setzen umfassen, aber die Definition der Funktionen innerhalb der Komponentendatei selbst. `

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

Viel Glück.

Ich bin mit zarko auf diesem, sollten Sie Ihre Objekte neu anordnen, aber wenn es sein muss ...

In CF5 Ich benutzen einen Trick von Funktionen in der Anfrage Rahmen setzen. Dies kann durch die Zuordnung der Funktionsnamen auf eine Anfrage Variable mit dem gleichen Namen, das heißt für eine Funktion namens getLatestUpdate getan werden:

Request.getLatestUpdate = getLatestUpdate

dann, bevor die Datei mit den Funktionen, einschließlich, macht einen chech für die Existenz der Variablen in der Anfrage Umfang. cfinclude die Funktionen Datei nur, wenn die Anforderung scoped Variable existiert nicht.

Nachteil ist, müssen Sie mit dem Request-Scope-Präfix auf die Funktionen beziehen, und auch dies nur funktioniert, in der traditionellen Metapher einer Seite Anfrage, es wird höchstwahrscheinlich Pause in Dingen wie Anrufe remoting.

Ich habe dies und YMMV nicht getestet.

Ich habe es nicht getestet, aber was ist mit Ihrem cfinclude mit so etwas wie Verpackung:

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

Wenn Ihr Problem ist rein über große sperrige Gegenstände zu vermeiden, vielleicht können Sie Ihre Objekte brechen in mehrere kleinere Objekte. Die Komponente A noch Methoden ABCD enthalten könnte, aber Methode A ruft ComponentA_A Verfahren A, Verfahren B ruft ComponentA_B Methode B usw. Am besten, wenn jeder Subkomponente nicht auf einer willkürlichen Gruppierung beruht, sondern eine sinnvolle Gruppierung basierend auf Funktionalität. Eine andere Sache zu Experiment mit (dies ist ein wilder Stich im Dunkeln) Funktionen sind in der Regel als Strukturen angebracht zu einem gewissen Umfang beschrieben. Sie können zum Beispiel Löschfunktionen von einem Application.cfc von StructDelete (this, onRequestStart). Vielleicht können Sie den gleichen Ansatz verwenden, um die Funktionen, die zuvor an der Anfrage Umfang löschen in der enthalten?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top