Pregunta

He estado revisando el código de mi predecesor y veo el uso del alcance de "solicitud" con frecuencia.¿Cuál es el uso apropiado de este alcance?

¿Fue útil?

Solución

Hay varios alcances que están disponibles para cualquier parte de su código:Sesión, Cliente, Cookie, Aplicación y Solicitud.Algunos no son aconsejables de utilizar de determinadas maneras (p. ej.utilizando el alcance de Solicitud o Aplicación dentro de sus Etiquetas personalizadas o CFC;esto es acoplamiento, viola los principios de encapsulación y se considera una mala práctica), y algunos tienen propósitos especiales:La cookie persiste en la máquina cliente como cookies físicas, y las variables de ámbito de sesión son específicas del usuario y caducan con la sesión del usuario en el sitio web.

Si es muy poco probable que una variable cambie (constante para todos los efectos) y puede simplemente inicializarse al iniciar la aplicación y nunca volver a escribirse, generalmente debe colocarla en el ámbito de la Aplicación porque esto la mantiene entre cada usuario y cada sesión.Cuando se implementa correctamente, se escribe una vez y se lee N veces.

Una implementación adecuada de las variables de aplicación en Application.cfm podría verse así:

<cfif not structKeyExists(application, "dsn")>
    <cflock scope="application" type="exclusive" timeout="30">
        <cfif not structKeyExists(application, "dsn")>
            <cfset application.dsn = "MyDSN" />
            <cfset foo = "bar" />
            <cfset x = 5 />
        </cfif>
    </cflock>
</cfif>

Tenga en cuenta que la existencia de la variable en el alcance de la aplicación se verifica antes y después del bloqueo, de modo que si dos usuarios crean una condición de carrera al inicio de la aplicación, solo uno de ellos terminará configurando las variables de la aplicación.

El beneficio de este enfoque es que no actualizará constantemente estas variables almacenadas en cada solicitud, lo que hará perder el tiempo del usuario y los ciclos de procesamiento del servidor.La desventaja es que es un poco detallado y complejo.

Esto se simplificó enormemente con la adición de Application.cfc.Ahora, puede especificar qué variables se crean al iniciar la aplicación y no tiene que preocuparse por bloquear y verificar su existencia y todas esas cosas divertidas:

<cfcomponent>
    <cfset this.name = "myApplicationName" />

    <cffunction name="onApplicationStart" returnType="boolean" output="false">
        <cfset application.dsn = "MyDSN" />
        <cfset foo = "bar" />
        <cfset x = 5 />
        <cfreturn true />
    </cffunction>
</cfcomponent>

Para obtener más información sobre Application.cfc, incluidas todas las funciones especiales disponibles y cada pequeño detalle sobre qué y cómo usarlo, Recomiendo esta publicación en el blog de Raymond Camden..

En resumen, el alcance de la solicitud está disponible en todas partes de su código, pero eso no necesariamente hace que sea "correcto" usarlo en todas partes.Lo más probable es que su predecesor lo estuviera usando para romper la encapsulación, y eso puede ser complicado de refactorizar.Puede que sea mejor dejarlo como está, pero comprender qué alcance es la mejor herramienta para el trabajo definitivamente mejorará su código futuro.

Otros consejos

Esta es una pregunta muy subjetiva y algunos incluso argumentarían que nunca es "apropiado" utilizar el alcance de la solicitud en aplicaciones ColdFusion modernas.

Dejando de lado ese descargo de responsabilidad, definamos cuál es el alcance de la solicitud y dónde sería útil.

El alcance de la solicitud es el alcance global absoluto en una única solicitud de página de ColdFusion.No es un ámbito compartido, como los ámbitos de aplicación, servidor, cliente y sesión, por lo que no es necesario bloquearlo para que sea seguro para subprocesos (a menos que genere subprocesos de trabajo a partir de una única solicitud utilizando la etiqueta CFTHREAD de CF8).Como alcance global, es una forma muy conveniente de conservar variables en cualquier nivel de la pila de la solicitud sin tener que pasarlas del padre al llamante.Esta era una forma muy común de conservar variables a través de etiquetas personalizadas anidadas o recursivas en aplicaciones CF más antiguas.

Tenga en cuenta que, si bien muchas aplicaciones usan este alcance para almacenar variables a nivel de aplicación (ajustes de configuración, por ejemplo), la gran (y a veces sutil) diferencia entre el alcance de la solicitud y el alcance de la aplicación es que el valor de la misma variable con el alcance de la solicitud puede difieren entre las solicitudes de páginas individuales.

Supongo que su predecesor usó este alcance como un medio para configurar convenientemente las variables que necesitaban sobrevivir al salto entre unidades de código encapsuladas o anidadas sin tener que pasarlas explícitamente.

Bien, solo quería comentar tu código.Por favor perdóname si parezco loco.Pero ya verificaste que structKeyExists al principio.Como sabes que va a ser cierto, no tendría sentido realizar otra verificación.Entonces mi versión sería esta...Pero ese soy solo yo.


<cfif not structKeyExists(application, "dsn")>
    <cflock scope="application" type="exclusive" timeout="30">
            <cfset application.dsn = "MyDSN" />
            <cfset foo = "bar" />
            <cfset x = 5 />
    </cflock>
</cfif>

Está bien.

He estado escribiendo el marco de mi empresa que se utilizará para impulsar nuestro sitio.

Utilizo la variable de solicitud para configurar ciertos datos que estarían disponibles para los otros CFC. Tuve que hacer esto para que los datos estuvieran disponibles en toda la aplicación, sin la necesidad de pasarlos continuamente.Sinceramente, creo que al usar request y application, siempre que sea un componente de función estática, no debería tener ningún problema.No estoy seguro de si estoy equivocado al pensar con esto, pero una vez que publique el marco, lo veremos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top