2012-01-20 9 views
9

Así que la compañía para la que trabajo tiene un enfoque bastante desorganizada cuando se trata de nuestro sitio. Todos nuestros scripts son de procedimiento con cfincludes arrojados dentro. He estado esperando para organizar esto en una API interna que los otros desarrolladores web usarían para hacer lo que (porque hacer un cambio me ha de ir a través y localizar todos los demás casos que el cambio necesita ser actualizada).API - CFC vs cfinclude

fin tengo un ejemplo vivo y mostró el jefe. Sigue lo que asumí que es el método normal (de mi Google). Capa de servicio> Puerta de enlace & DAO> Frijoles, con algunas fábricas para ayudar a la creación de objetos. Funciona bien y hace exactamente lo que yo quería que lograra. Que está impresionado con él y está de acuerdo en que necesitamos para arreglar nuestro código y organizar mejor, pero no ve la ventaja de utilizar este método de orientación a objetos llamadas a la API a una larga lista de cfincludes a lograr lo mismo. En esencia, por la forma en que explicó el cfincludes, funcionaría de la misma manera que una llamada a método.

Se ha pedido las ventajas de mi acercamiento vs este cfinclude y para la vida de mí en realidad no puede encontrar ventajas obvias que no sean la agrupación de datos similares todo dentro de un objeto. ¿Hay algo más o tal vez sería ventajoso seguir el enfoque cfinclude?

Respuesta

25

legibilidad, el mantenimiento, y la adhesión a paradigmas orientados a objetos probados serían los aspectos más importantes de la construcción de una aplicación ColdFusion usando una verdadera capa de servicio de CFC/objetos, en lugar de una multitud de cfincludes, que es un aficionado a mejor, y puede causar pesadillas de recolección de basura en su peor momento.

legibilidad

Digamos que usted tiene una llamada cfinclude _queries.cfm, que incluyen todas las llamadas para su aplicación. A continuación, en la parte superior de la página de los empleados, justo antes de la salida de todos los empleados, esto se hace:

<cfinclude template="_queries.cfm" /> 

<cfoutput query="employeeQry"> 

dónde employeeQry viene? ¿Es una de las consultas en esa plantilla? ¿Qué hace? ¿Debo incluir esa plantilla cuando solo quiero empleados? Lo que si tiene todas las consultas en el sitio ... es lo que todos necesitan ser incluidos cada vez?

Por qué no algo un poco más legible, como esto:

<cfset employeeQry = request.model.queries.getEmployees() /> 

<cfoutput query="employeeQry"> 

Ahhh, ahí vamos. A primera vista, sin saber nada acerca de los matices de su sistema, puedo identificar de inmediato:

  • donde la variable employeeQry vino de
  • Qué caché CFC Estoy llamando a la consulta desde
  • Que soy llamando a una y solo una consulta, y no en masa, incluyendo una serie de consultas, ninguna de las cuales es necesaria para la página.

La lógica de negocios encapsulante en una capa de servicio (CFC) aumenta la legibilidad de su código, lo que marcará la diferencia cuando pase al siguiente tema.

Mantenimiento

Se obtiene una bodega de una nueva aplicación CF que está a cargo de, y abre la página de los empleados a encontrar la plantilla <cfinclude template="_queries.cfm"> anteriormente.

Dentro de eso, el desarrollador original deja un comentario diciendo algo en el sentido de: "No vamos a ejecutar todas las consultas, vamos a ejecutar una consulta específica en base a un parámetro", y luego se ve algo como esto:

<cfswitch case="#param#"> 
    <cfcase value="employee"> 
    <cfinclude template="_employeeQry.cfm"> 
    </cfcase> 
    <cfcase value="employees"> 
    <cfinclude template="_employeesQry.cfm"> 
    </cfcase> 
    <cfcase value="employeesByDept"> 
    <cfinclude template="_employeesByDept.cfm"> 
    </cfcase> 
</cfswitch> 

... así que a ver esto y pensar, bueno ... tengo que modificar la consulta employeesByDept, por lo que la plantilla grieta que se abre y se encuentra:

<!--- employees by department ---> 
<cfif args.order_by is "ASC"> 
    <cfinclude template="_employeeQryByDeptOnASCOrder.cfm"> 
<cfelse> 
    <cfinclude template="_employeeQryByDeptOnDESCOrder.cfm"> 
</cfif> 

... y por esta punto, quieres dispararte en la cara.

Este es un ejemplo exagerado, pero es muy familiar en el mundo de ColdFusion; una mentalidad de aficionado al diseñar aplicaciones de nivel empresarial. Esta pesadilla de "incluir dentro de incluir dentro" es algo que los desarrolladores de CF enfrentan con más frecuencia de lo que piensas.

¡La solución es simple!

Una sola CFC que encapsula la lógica de negocio de la producción de consultas para sus empleados.

<cfcomponent> 

    <cffunction name="getEmployees" returntype="query"> 

    <cfquery name="tmp"> 
    select employeeID, name, age 
    from employees 
    </cfquery> 

    <cfreturn tmp /> 
    </cffunction> 

    <cffunction name="getEmployeesByDept" returntype="query"> 
    <cfargument name="deptID"> 
    <cfargument name="order_by" required="false" default="ASC"> 

    <cfquery name="tmp"> 
    select employeeID, name, age 
    from employees e 
    inner join empToDept etd on (e.employeeID = etd.employeeID) 
    where etd.deptID = #arguments.deptID# 
    order by name #iif(arguments.order_by is 'asc',de('asc'),de('desc'))# 
    </cfquery> 

    <cfreturn tmp /> 

    </cffunction> 

</cfcomponent> 

Ahora, usted tiene un único punto de referencia para toda la información que desea producir cuando se consulta la base de datos de los empleados, y puede parametrizar/ajustar todo a la vez, sin tener que excavar a través de las montañas de los incluye dentro de incluye dentro incluye ... que es engorroso y difícil de mantener recto (incluso con un control de fuente adecuado).

de forma elegante le permite escribir una sola línea:

<cfset empQry = request.model.queries.getEmployees() /> 

o

<cfset empQry = request.model.queries.getEmployeesByDept(14,'DESC') /> 

y hace que el mantenimiento de su trabajo el código que mucho más fácil.

La adhesión a paradigmas orientados a objetos probadas

Su jefe anuncia que una estrella de rock Java se ha unido al equipo. Estás muy ansioso y emocionado de sentarte con él, ya que durante los últimos años has estado atrapado principalmente en la FQ, y quieres una oportunidad para mostrarle algunas de tus cosas, y posiblemente aprender de él también.

"Entonces, ¿cómo accede la aplicación a los datos?" él te pregunta.

"Oh, tenemos una serie de consultas que llamamos en varias páginas, y en base a los parámetros, vamos a tirar diferentes tipos de información."

"agradable", dice, "Así que ... usted tiene una capa de servicio para el modelo de objeto de datos, que es grande."

No realmente, que piensan.Es sólo incluye dentro incluye ... pero él sigue adelante,

"Eso es excelente, porque una de las cosas nuevas se irán sumando es un objeto contratista, que es básicamente un subconjunto de Empleado, que va a tiene algunos aspectos diferentes de la funcionalidad, pero en general se comportará como un empleado. Seguiremos adelante y subclase Empleado, y anularemos algunas de esas consultas ... "

... y ahora estás perdido . Porque no hay subclases ni incluyen. No hay herencia en una inclusión. Una inclusión no tiene conocimiento de un dominio o un objeto comercial, o cómo se supone que interactúa con otros objetos.

Un cfinclude es una conveniencia de reutilizar elementos comunes, como un encabezado o un pie de página. No son un mecanismo para reflejar las complejidades de un objeto comercial.

Al diseñar/construir/implementar los CFC como objetos que reflejan las entidades de su aplicación, que está hablando un langauge común: OO. Significa que no le ofrece la capacidad de diseñar un sistema basado en una estructura comprobada, sino que extiende ese lenguaje de "OO-ness" a los programadores de otras tecnologías. Programadores Java, programadores C++/C#, etc ... cualquiera que tenga un conocimiento razonable del desarrollo orientado a objetos hablará automáticamente su idioma y podrá trabajar con usted y su sistema.

Tenga en cuenta esta nota final: No todas las aplicaciones deben estar orientadas a objetos. Si su jefe quiere que prepare rápidamente un volcado XML de la tabla de empleados y lo abra en el sitio web, sí, probablemente pueda renunciar a un modelo completo de oo para eso. Pero si está creando una aplicación desde cero, y va a contar con empleados, usuarios, departamentos, consultas, roles, reglas, tickets ... en resumen: entidades en un dominio, será hora de dejar de lado los cfincludes como su herramienta principal para reutilizar el código.

Ah, y PD: Esa pequeña nota que dejé en la parte superior sobre la recolección de basura - no es una broma. He visto aplicaciones CF incorrectamente construidas, por lo que el Application.cfc sí llama cfincludes, y después de enganchar CF hasta un JVM that can monitor realtime creation/destruction of objects in the GC, he visto mirada memoria como un monitor ECG.

No es bueno.

+0

Increíble. Gracias por el increíble detalle en su respuesta. – Antares

+0

En otra nota, ¿hay otros documentos que detallen esto que pueda leer para ayudar a convencer a mi jefe? – Antares

1

La respuesta de Shawn definitivamente cubre los puntos principales. Para resumir todo eso en los puntos clave que su jefe entenderá ... el enfoque de CFC le ahorrará una gran cantidad de dinero en términos de mantenimiento, y mantendrá a sus desarrolladores mucho más felices ya que su trabajo será mucho más fácil, y la tasa de retención de desarrolladores capacitados/motivados será mucho más alta que si se mantuviera con el código de spaghetti como estándar.

+1

Esto sería mejor como un comentario a la respuesta de Shawn. No te voy a rechazar, sino una sugerencia. –

1

estoy completamente de acuerdo con la respuesta de Shawn ... y si quiere llevar su código a un nivel aún más alto, utilice un marco! Entonces realmente le ahorrará a usted y a otros desarrolladores mucho tiempo, ya que todos se adherirán a sus propios estándares.

Mi preferencia personal es caja fría, pero cualquiera de los marcos/OO populares MVC hará - caja fría, Mach-II, Model-Glue, FW/1. También he escuchado cosas buenas sobre CFWheels pero no las he usado.

+0

He oído muchas cosas sobre Frameworks y tenemos una aplicación de chat construida sobre Mach-II pero se ha convertido en algo más que esperamos nunca falle porque todo el mundo odia tener que depurarlo. Me temo que el uso de marcos agregará más complejidad a algo que debería ser bastante sencillo, pero esa podría ser mi limitada comprensión de ellos. – Antares

Cuestiones relacionadas