Come posso dividere un componente usando cfinclude ed ancora utilizzare l'ereditarietà?

StackOverflow https://stackoverflow.com/questions/3030056

  •  26-09-2019
  •  | 
  •  

Domanda

UPDATE: Railo non ha questo problema a tutti .

UPDATE: Sto votando per chiudere la questione, come ho come tatto le persone si stanno concentrando più su tutto "Se qualcuno ha un'idea migliore frazionamento componenti di grandi dimensioni" Una parte di questa domanda (che ho non dovrebbe mai hanno messo in), allora il vero problema di utilizzare cfincludes con cfcomponent.

. Nota: questo è solo un esempio semplificato di quello che sto cercando di fare per ottenere l'idea attraverso

Il problema che sto avendo è che voglio usare cfinclude cfcomponent all'interno in modo che io possa gruppo come metodi in file separati per più gestibilità. Il problema che sto funzionando in è quando si tenta di estendere un altro componente che anche usi cfinclude di gestirlo di metodo come illustrato di seguito. Si noti che Componenta estende 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>

Il problema è che quando cerco di inizializzare Componenta ottengo un l'errore: ". Le routine non può essere dichiarato più di una volta la routine è stato dichiarato due volte in diversi modelli"

Tutta la ragione di questo è perché quando si utilizza cfinclude è valutato in fase di esecuzione, invece di tempo di compilazione.

A corto di spostare i metodi nei componenti stessi ed eliminando l'uso di cfinclude, come posso ottenere intorno a questo o fa qualcuno ha un'idea migliore frazionamento componenti di grandi dimensioni?

È stato utile?

Soluzione

Il mio consiglio è: rianalizzare gli oggetti, cercare di applicare a tutte le regole di programmazione orientata agli oggetti e le migliori pratiche (astrazione, incapsulamento, la modularità, il polimorfismo, ereditarietà, SECCO, ecc).

Quindi, in pratica si vuole componente B di avere il metodo isCrunchable (), quindi il componente A si estende B, e isCrunchable () è disponibile da eredità. Sia A e B torneranno stati diversi in modo da non vedo alcun problema con questo. Se si effettua una classe "al di sopra", che ha tutti i metodi e le componenti A e B estendere quello, si otterrebbe la soluzione per "componenti di grandi dimensioni", ma ancora una volta, mi piacerebbe provare a sgranocchiare questo un po 'di più.

Se questa risposta non risolve il problema, è possibile inviare esempio concreto, forse avremo una migliore idea del perché avete bisogno di questo fatto in quel modo.

Altri suggerimenti

Non testato, ma vorrei provare a mettere il contenuto di ogni funzione in un include, ma la definizione delle funzioni all'interno del file componente stesso. `

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

In bocca al lupo.

Sono con Zarko su questo, si dovrebbe riorganizzare i vostri oggetti, ma se si deve ...

In CF5 ho usato un trucco di mettere funzioni nel campo di applicazione richiesta. Questo può essere fatto assegnando il nome della funzione a una variabile di richiesta con lo stesso nome, vale a dire per una funzione chiamata getLatestUpdate:

Request.getLatestUpdate = getLatestUpdate

dunque, prima di includere il file con le funzioni, fare un chech per l'esistenza della variabile nel campo di applicazione richiesta. cfinclude il file funziona solo se la richiesta ambito variabile non esiste.

L'unico lato negativo è che è necessario fare riferimento alle funzioni con il prefisso di richiesta campo di applicazione, e anche questo sarà solo il lavoro nella metafora tradizionale di una richiesta di pagina, è molto probabile che pausa in cose come le chiamate remote.

Non ho testato questa e YMMV.

Non ho provato, ma per quanto riguarda avvolgendo il cfinclude con qualcosa di simile:

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

Se il problema è puramente di evitare enormi oggetti ingombranti, forse si può rompere gli oggetti verso il basso in diversi oggetti più piccoli. Componente A potrebbe ancora contenere metodi ABCD, ma Metodo A chiede ComponentA_A metodo A, Metodo B chiama ComponentA_B metodo B ecc Meglio se ogni sottocomponente non si basa su un gruppo arbitrario, ma un raggruppamento ragionevole base di funzionalità. Un'altra cosa da sperimentare (questa è una pugnalata selvaggio al buio) funzioni sono solitamente descritto come strutture annesse ad un certo margine. Si può ad esempio le funzioni di eliminazione da un Application.cfc da structDelete (questo, onRequestStart). Forse è possibile utilizzare lo stesso approccio per eliminare le funzioni precedentemente attaccati al campo di applicazione richiesta l'inclusione?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top