Working on chapter 3
[PFCLatex/.git] / capitulo3 / capitulo3.tex
1 \chapter{Herramientas y tecnologías utilizadas}
2
3 \section{Full-stack frameworks}
4
5
6 Un \emph{full-stack framework\footnote{Framework en Castellano es traducido como marco de trabajo}}, es una solución que incluye seguridad, enrutamiento de URIs, caché, hooks y muchas otras características. Cuando se usa un framework de estas características el desarrollador se adhiere a los estándares y guías que el framework marca para escribir e implementar el código. Además este tipo de frameworks ofrecen todas las librerías y herramientas que el programador necesita para (en este caso que nos ocupa) desarrollar páginas y servicios Web. Ejemplos de estos frameworks en PHP son:
7
8 \begin{itemize}
9     \item CakePHP.
10     \item Symfony.
11 \end{itemize}
12
13
14
15 \section{Glue frameworks}
16
17 Como contra parte a \emph{full-stack frameworks} encontramos los \emph{glue frameworks} donde se da más libertad al programador para implementar su propio código, clases, helpers, o librerías. Un \emph{glue framework} no te ata ni hace que el código siga unos estándares determinados. Usualmente estos tipos de frameworks requieren de más código y más diseño y desarrollo en el lado de los desarrolladores; sin embargo, el desarrollador no está limitado a ningún tipo de funcionalidad o estándares. Unos pocos ejemplos de \emph{glue frameworks} son:
18
19 \begin{itemize}
20     \item Zend.
21     \item Codeigniter.
22 \end{itemize}
23
24
25 \section{Symfony}
26
27 Symfony es un marco de trabajo para el desarrollo de aplicaciones Web escrito en PHP que sigue el paradigma del modelo vista controlador (MVC) Su objetivo es incrementar la velocidad y la eficiencia del desarrollo web. Symfony trae muchas características muy útiles que ayudan a que el desarrollador se concentre en la lógica del negocio de la aplicación en lugar de en la implementación o en los objetos paginadores Web o en las abstracciones con la capada de base de datos. Sin embargo, todo tiene un coste, y es el aprendizaje de cómo usar todas las características que hacen de Symfony un marco de trabajo muy útil~\cite{C3:SymfonyBook14}.
28
29 El objetivo de Symfony es acelerar la creación y mantenimiento de aplicaciones web y remplazar tareas de codificación repetitivas. Está diseñado para optimizar el desarrollo de aplicaciones web a través de varias características clave. Así, Symfony separa las reglas de negocio de la aplicación web, de la lógica del servidor y de las vistas o presentación al usuario. Contiene numerosas herramientas y clases que permiten acortar el tiempo de desarrollo y aplicaciones web compleja. También automatiza tareas comunes así que el desarrollador puede enfocar su actividad enteramente en las tareas relacionadas con casos específicos de la aplicación. Como resultado final de estas características, con Symfony no hay necesidad de reinventar la rueda cada vez que una nueva aplicación web es construida.
30
31 Está escrito completamente en PHP y actualmente se usa en sitios web con alta demanda de páginas. Es compatible con la mayoría de servidores de bases de datos disponibles a la fecha como MySQL, PostgreSQL, Oracle y Microsoft SQL Server. Se ejecuta en entornos *NIX y Windows.
32
33 \subsection{Características de Symfony}
34
35 Symfony ha sido diseñado para alcanzar los siguiente requisitos:
36
37 \begin{itemize}
38     \item Fácil instalación y configuración en la mayoría de plataformas.
39     \item Independiente del tipo de servidor de base de datos.
40     \item Simple de usar en la mayoría de casos, pero flexible para adaptarse a casos complejos.
41     \item Cumple con la mayoría de prácticas recomendadas para el desarrollo Web así como con muchos patrones de diseño también recomendado para este tipo de desarrollos.
42     \item Código leíble, con phpDocumentor para fácil mantenimiento.
43     \item Fácil de extender y permite la integración con librerías de otros vendedores.
44 \end{itemize}
45
46 \subsection{Características de proyectos Web automatizados}
47
48 A continuación se enumeran la mayoría de las características comunes que existen entre proyectos web y que pueden ser automatizadas:
49
50 \begin{itemize}
51     \item Capa de internacionalización ya construida dentro de Symfony para datos, traducción de interfaces y localización del contenido.
52     \item La capa presentación usa plantillas y layouts que pueden ser construidos por diseñadores HTML sin necesidad de ningún conocimiento del framework. Los helpers recuden la cantidad de código de presentación que hay que escribir.
53     \item Los formularios soportan validación automatizada, asegurando una buena calidad de los datos almacenados en la base de datos y un experiencia de usuario más agradable.
54     \item Existe una cache de gestión que reduce el uso de ancho de bando y la carga del servidor.
55     \item Las listas son más fáciles de usar gracias a la paginación, clasificación y filtrado automatizados.
56 \end{itemize}
57
58 \subsection{Object-Relational Mapping, ORM}
59
60 Las bases de datos son relacionales. PHP y Symfony por otro lado están orientados a objetos. Para acceder a una base de datos en la forma en la que se haría si estuvieran orientadas a objetos se necesita un interfaz de traducción de la lógica de objetos a la relacional. Este interfaz es el ORM.
61
62 Un ORM está constituido de objetos que dan acceso a datos y de reglas de negocio. Un beneficio de una capa de abstracción objeto-relacional es que previene de usar una sintaxis que es específica a una base de datos determinada. Esto significa que migrando de un sistema de base de datos en el medio de un proyecto debería ser fácil.
63
64 En el ORM, la capa de abstracción, encapsula la lógica de los datos. El resto de la aplicación no necesita saber las queries SQL y usando los objetos en lugar de las records de la base de datos y clases en lugar de tablas tiene otro beneficio: se pueden añadir nuevos métodos de acceso a las tablas. Por ejemplo si se tiene una tabla llamada Cliente con dos campos, Nombre y Apellido, se puede añadir un nuevo campo NombreCompleto que se componga de los dos sin necesidad de hacer ninguna modificación en la tabla o en la base de datos, simplemente añadiendo un nuevo método al objeto que representa la tabla de la base de datos que devuelva el Nombre y el Apellido concatenados como NombreCompleto.
65
66 Symfony soporta dos ORMs escritos en PHP que son open source: Propel y Doctrine. Integra ambos y cuando se crea un nuevo proyecto se elige qué ORM usar.
67
68 \subsection{El patrón MVC}
69
70 Symfony se basa en el patrón de diseño web clásico conocido como arquitectura MVC, la cual consiste de tres niveles:
71
72 \begin{itemize}
73 \renewcommand{\labelitemi}{$-$}
74     \item El \textbf{Modelo} representa la información con la cual la lógica de negocio de la aplicación opera.
75     \item La \textbf{Vista} renderiza el modelo en una página web adecuada para interactuar con el usuario.
76     \item El \textbf{Controlador} responde a acciones del usuario e invoca cambios en el modelo o en la vista según corresponda.
77 \end{itemize}
78
79 Además de dividir la aplicación en esos tres niveles arriba citados, el diseño MVC define las interacciones entre cada uno de ellos. En la Figura~\ref{fig:MVC}) se representa el patrón MVC.  
80 \begin{figure}[H]
81     \centering
82         \includegraphics[width=0.8\textwidth]{fig/MVC}
83     \caption{\emph{El patrón MVC}}
84     \label{fig:MVC}
85 \end{figure}
86
87 \subsubsection{El Modelo}
88
89 Representa la estructura subyacente de una aplicación Web. Los modelos a menudo son compartidos entre diferentes subaplicaciones de una aplicación Web. Por ejemplo, un modelo LoginForm puede ser usado tanto en el front end como en el back end de una aplicación, también pueden hacer uso del model APIs Web, etc. El modelo debería contener propiedades para representar datos específicos, lógica de negocio como reglas de validación para asegurar que los datos representado se adecuan a los requerimientos de diseño y puede contener código para la manipulación de los datos. En ocasiones, el modelo puede alcanzar proporciones demasiado grandes conteniendo mucho código en una única clase. También puede ser duro de mantener si el código que contiene sirve a diferentes propósitos~\cite{C3:YiiFramework}. De este modo para grandes aplicaciones es conveniente generar una clase base que represente parte del modelo que sea compartido por todas las diferentes subaplicaciones y en cada subapliación se extiende dicha clase base con el código específico para esa subaplicación.
90
91 \subsubsection{La Vista}
92
93 Representa el modelo en el formato que el usuario final desea. Las vistas, en general deberían cumplir estos puntos:
94
95 \begin{itemize}
96     \item Principalmente deben contener código de la capa de presentación, como HTML y código PHP simple para formatear y renderizar daros.
97     \item Debería evitar contener código que realiza queries explícitas a la base de datos. Este código debe estar situado en el modelo.
98     \item La vista puede acceder a propiedades y métodos de controladores y modelos directamente. Sin embargo, esto debería ser realizado solo para presentación.
99 \end{itemize}
100
101 \subsubsection{El Controlador}
102
103 Los controladores enlazan el modelo, la vista y otros componentes de la aplicación. Tratan directamente con peticiones del usuario. 
104
105 \begin{itemize}
106     \item Se debe evitar el uso de sentencias SQL directamente en esta capa. Éstas deben ser mantenidas preferiblemente en el modelo.
107     \item No debería contener código HTML o cualquier otro código relacionado con la capa de presentación. Este código es mejor mantenerlo siempre en las vistas.
108 \end{itemize}
109
110 En una aplicación MVC diseñada correctamente los controladores no contienen mucho código mientras que los modelos sí lo hacen y contienen la mayor parte del código responsable para la representación y manipulación de los datos. Esto se debe a que la estructura de datos y la lógica de negocio representada por los modelos suele ser muy específica para una determinada aplicación, y necesita grandes cambios para lograr los requerimientos de dicho programa; mientras que la lógica del controlador a menudo sigue un modo de funcionamiento similar a través de diferentes aplicaciones y por tanto puede ser simplificado por el framework subyacente o por las clases base~\cite{C3:YiiFramework}.