Documente Academic
Documente Profesional
Documente Cultură
MONOGRAFÍA
Cochabamba - Bolivia
2018
1
AGRADECIMIENTOS
1. INTRODUCCION. ........................................................................................................... 7
2. GENERALIDADES.......................................................................................................... 8
3. METODOLOGÍA............................................................................................................. 9
3
5.2. Aplicaciones de la programación reactiva ...................................................... 39
6. ANGULAR ................................................................................................................. 50
6.2.5. Pipes................................................................................................................... 59
8. CONCLUSIONES........................................................................................................... 61
9. BIBLIOGRAFIA ............................................................................................................ 63
4
TABLA DE FIGURAS
5
Figura 27: Ejemplo Reactivo con Excel .......................................................................................... 45
Figura 28: Ejemplo reactivo Programación ..................................................................................... 46
Figura 29: Resultado sin RxJS ...................................................................................................... 48
Figura 30: Ejemplo de Código sin usar RxJS .................................................................................. 48
Figura 31: Ejemplo con RxJS ....................................................................................................... 49
Figura 32: Ejemplo de código con RxJS .......................................................................................... 49
Figura 33: Aplicación de RxJS ..................................................................................................... 50
Figura 34: Arquitectura Angular ................................................................................................... 52
Figura 35: Módulo raíz Angular ................................................................................................... 53
Figura 36: Estructura de los componentes Angular ........................................................................... 54
Figura 37: Código AppComponent ................................................................................................ 55
Figura 38: Plantilla de angular .................................................................................................... 56
Figura 39: Módulo en Angular ..................................................................................................... 58
Figura 40: Directiva Angular ....................................................................................................... 59
Figura 41: Pipe ......................................................................................................................... 60
6
1. INTRODUCCION.
Desarrollar aplicaciones en JavaScript puede convertirse en todo un desafío una vez que
empieza a crecer tanto la aplicación como el equipo, originalmente se pensó como un
lenguaje para hacer efectos sencillos en las páginas estáticas, y se está intentando usar
para hacer aplicaciones mucho más complejas de lo que se pensó originalmente posible.
Por otro lado, en los últimos tiempos están sucediendo cambios en el ámbito de la
computación y están apareciendo nuevos conceptos y paradigmas que dan respuesta a la
situación social y tecnológica actual.
7
La programación reactiva son un conjunto de patrones y técnicas que ganan mucha
importancia en los últimos años, esto es producido porque los requerimientos en la
computación están cambiando.
Problemas por los que sigue tropezando JavaScript como estructurar un código sea más
fácil de mantener para otros programadores, problemas para bases de código grandes,
aplicaciones en gran escala, y proyectos con muchos años de desarrollo y también los
errores de tipado por los que se siguen tropezando, hace buscar una mejor manera de
programar y desarrollar aplicaciones.
Este documento nos servirá para poder optar una mejor manera de programar de manera
que sea una ayuda para los equipos de desarrollo y para futuros programadores con
respecto al mantenimiento del código desarrollado y se pueda mejorar e incluso prevenir
los errores que siempre nos están saliendo al momento de programar y ejecutar el código,
especialmente cuando las aplicaciones se tornan más grandes y complejas.
También podremos determinar las arquitecturas y paradigmas que debemos optar para
poder estar a la altura de los avances de la tecnología y poder satisfacer las necesidades
de los usuarios, del mercado y de los mismos productores de aplicaciones.
El resultado de esta monografía será que los programadores puedan tomar en cuenta que
con la programación reactiva en TypeScript se puede mejorar la entrega de los productos
de software y eficiencia de las aplicaciones desarrolladas de tal modo poder satisfacer de
manera óptima las necesidades de los usuarios en la actualidad.
2. GENERALIDADES.
2.1. Antecedentes generales
Los Datos del Instituto Nacional de Estadística nos indican que en los últimos 11 años la
construcción ha sido uno de los principales motores de la economía y registrando un
8
crecimiento mayor al del Producto Interno Bruto (PIB) de Bolivia durante el mismo
periodo, lo que ha convertido al rubro en el cuarto mayor generador de empleo del
mercado nacional. (Castel, 2017)
La construcción es una actividad arriesgada, hecho que está comprobado por los índices
de siniestralidad laboral, que colocan a este sector en primer lugar en comparación con
otras actividades, ya que este tipo de trabajo pueden ocasionar accidentes mortales o
producir perjuicios para la salud.
Por lo cual es muy necesario que el sistema construido para resolver este tipo de
problemas deba estar constantemente actualizado y trabajar con datos o información en
tiempo real.
3. METODOLOGÍA
9
Método Bibliográfico, debido a que se realizará la lectura y compilación de libros y
páginas de internet relacionados al tema de estudio
Es muy importante recalcar que en años anteriores la necesidad con respecto al desarrollo
de aplicaciones no tenía tantas exigencias como las que hoy en día se tiene. Por lo cual
JavaScript que es uno de los lenguajes más populares, que de hecho ha evolucionado y
mejorado a pasos agigantados en los últimos años, ha sido un lenguaje que ha estado
cubriendo las necesidades como se ha demandado y en la medida que se requería.
Sin embargo se puede ver que JavaScript en algún punto fue un lenguaje que presentaba
muchos problemas para bases de código grandes, aplicaciones de gran escala y proyectos
con muchos años de desarrollo.
10
En este documento se pretende mencionar y profundizar todos los aspectos a considerar
para poder realizar una efectiva aplicación de la programación en TypeScript.
Este lenguaje de programación (TypeScript) fue creado bajo el estándar de código abierto
y desarrollado por Microsoft en el año 2012 para el desarrollo de aplicaciones con
JavaScript a gran escala, para ellos y para sus clientes. Está basado en JavaScript, con el
agregado de tipado estático y objetos basados en clases. Fue desarrollado por el mismo
creador C#, Delphi y turbo Pascal, Anders Hejlsberg, y soporta tanto desarrollos del lado
del cliente, como del lado del servidor utilizando, para este último caso, Node.JS. Está
incluido en Visual Studio desde la versión 2013, y se continuó su expansión en esta
plataforma hacia las versiones 2015 y 2017 del framework.NET. Su web oficial es
www.typwscriptlang.org (Luna & Peña, pág. 22).
Entre sus notables versiones están 0.8 (2012), 0.9 (2013), 1.0 (2014), 1.8 (2016), 3.1(2018).
Reconocido para anotaciones de tipo, control estático, Usos notables clientes web
grandes, etiquetas orientadas a objetos, estructuradas, imperativas, funcionales.
Uno de los muchos lenguajes de compilación a JavaScript para el desarrollo de lado del
cliente, el TypeScript de Microsoft, es un súper conjunto de JavaScript; conociendo
JavaScript, se puede comenzar a utilizar TypeScript de inmediato, las anotaciones de tipo
permiten que abran posibilidades para el análisis estático de código fuente. Además,
TypeScript también presenta clases, herencia, genéricos y módulos, respaldando su lema
"JavaScript que escala", descrito según (Toal & Rivera, 2017, pág. 293)
TypeScript compila código JavaScript que se ejecuta en cualquier navegador, host, sistema
operativo o motor de JavaScript que admita ECMA Script 3 (o más reciente). Se podría
decir que TypeScript es una evolución de JavaScript mejorada como podemos ver en la
figura 1, pero con la cual se puede desarrollar aplicaciones más robustas, escalables y de
mayor eficiencia.
TypeScript
- Tipos
- Atributos privados
ES7
ECMAScript 2016
-Decoradores
-asyng/await
ES6
ECMAScript2015
-Clases
-Métodos
ES5
12
en todas las plataformas, ya sea en móviles, web o escritorio. Sin embargo, cuando
JavaScript fue creado por primera vez su propósito no fue este, sino que fue diseñado
para un uso simple en aplicaciones muy pequeñas.
13
4.4. Instalación de TypeScript
Como cualquier otro lenguaje de programación para poder probarlo, testearlo y verificar
su potencial es necesario hacer una instalación cabe decir que es muy fácil.
Para poder instalar TypeScript el único requisito necesario es tener instalado en nuestro
equipo la herramienta NodeJs y su administrador de paquetes (npm).
Para poder instalarlo tan solo tenemos que ejecutar en una terminal de comandos la
siguiente línea:
14
Figura 5: Hola Mundo en TypeScript
Fuente: Elaboración propia
Como se puede ver en la figura 5 observamos que se crea otro archivo helloword.js
después de la compilación, lo cual podemos ejecutar en el navegador o como lo haremos
en este caso, con node:
4.5. Características.
15
A continuación se nombrará algunas características que hacen a TypeScript como un
lenguaje de programación favorito.
TypeScript es un lenguaje que añade a JavaScript una capa de tipado estático y algunas
otras incorporaciones de OOP tradicional. Esta capa puede resultarnos de muchísima
ayuda durante el desarrollo. Sin embargo, todas estas características son simplemente
para ayudar a trabajar con JavaScript en tiempo de diseño, ya que como habíamos visto
más adelante TypeScript compila todo como JavaScript tradicional. A continuación
veremos las diferencias de los tipados:
Tipado estático o fuertemente tipado: Se debe de definir el tipo de dato, obligando a que
no pueda haber errores con los tipos de datos
16
Figura 7: Tipos en TypeScript
Fuente: Elaboración propia
Estos ejemplos son posibles problemas que tienen los lenguajes débilmente tipadas.
(Valverde Ramos, Hernandez, & Fuen, 2017, pág. 12)
Lo bueno de estos lenguajes que son los de tipado dinámico, como JavaScript, suelen ser
mucho más flexibles, lo que nos permite escribir código menos verboso.
• Autocompletado de código
• Recomendación de qué argumentos recibe una función
• Recomendación de qué tipo retorna una función
• Auto documentación del código
• Mejor análisis para detectar errores
Tipos primitivos.
String y number, estos tipos puede decirse que lo usan la gran mayoría de los lenguajes
de programación, por lo que no se profundizará mucho al respecto, ya que un ejemplo
vale más que mil palabras. Veamos con un ejemplo de las ventajas que nos ofrece:
17
Además de los tipos String y Number, TypeScript también admite los siguientes tipos
básicos primitivos:
• Boolean: tipo de dato lógico que representa verdadero o falso. De igual manera son
tipos muy simples que responden a la pregunta con un sí o un no.
• Array: tipo de dato estructurado que permite almacenar una colección de elementos.
• Null: Es cuando un objeto o variable no está accesible.
• Undefined: Es cuando un objeto o variable existe pero no tiene un valor. Si nuestro
código interactua con alguna API podemos recibir null como respuesta.
Void
Indica que una función no devolverá ningún valor. Este tipo solo está disponible en
TypeScript.
Any
Indica que la variable puede ser de cualquier tipo. Es muy útil a la hora de trabajar con
librerías externas donde podría tener datos que ni están tipeados y no se sabe de qué tipo
es. Está disponible solo para TypeScript, es el tipo más flexible en lo que se asemeja más a
la naturaleza libre de JavaScript.
Tuple/Tuplas
Similar al array, pero con un número fijo de elementos escritos, esto se define al
momento de crear el tipo. También disponible solo para TypeScript.
Enum
18
Let
En JavaScript hay dos formas de declarar variables: var y let, var no tiene un ámbito de
bloque mientras que let si.
Const
Funciones
Este tipo de funciones hacen referencia al objeto que llama a esta función. Lo que hacen
es que el this no hace referencia al padre sino al objeto que contiene la función.
Genéricos
Los tipos genéricos, son aquellos que como las interfaces no se verán compiladas en
JavaScript ya que solo están accesibles en tiempo de compilación, La manera adecuada de
realizar la sobrecarga de métodos es con los tipos genéricos.
Quizás la mayor diferencia entre JavaScript y los lenguajes .NET actuales es la forma en
que se usan las funciones. Ambos los usan para agrupar declaraciones de código para
reutilización, pero en JavaScript (actualmente), las funciones también son la única forma
de estructurar el contenido.
Pero todavía JavaScript tiene sus falencias en cuanto al manejo de tipos dentro de las
funciones. He ahí de donde muchas veces se vienen los errores.
19
clase en JavaScript / TypeScript, por lo que pueden asignarse a una variable, pasarse como
un parámetro (por ejemplo, como una devolución de llamada) o devueltos de una función
(de fábrica).
En palabras simples podemos resumir que las funciones en TypeScript son las máquinas
de procesamiento que se encargan de analizar entradas y digerir la información y aplicar
las transformaciones necesarias a los datos que se les proveen ya sea para modificar el
estado de una aplicación o para devolver salidas que posteriormente servirá en la toma de
decisiones de la empresa o simplemente para uso del usuario final.
• Las funciones de nivel superior (global) se definen fuera de una clase o módulo.
Tienen alcance global y se pueden llamar en cualquier punto del código. Ellos
tienen un nombre.
• Los métodos de clase, se denominan funciones declaradas como parte de una
clase de objeto. Se pueden llamar solo después de que la clase haya sido
instanciada a menos que estén marcados como estáticos.
• Las funciones anónimas, no tienen un nombre. Normalmente se usan al declarar
una función que se usará en un solo lugar.
Al igual que con las declaraciones de variables, TypeScript permite escribir con firmeza la
firma de una función con el resultado neto de que TLS (Servicio de Lenguaje TypeScript) te
alerta sobre cualquier valor de parámetro pasado inválido También le proporciona
IntelliSense para esos parámetros cuando llama a la función (que resulta invaluable
cuando intenta pasar funciones de devolución de llamada). Por ejemplo:
20
Figura 9: Funciones en TypeScript
Fuente: Elaboración propia
Se puede proporcionar un tipo para cada argumento en la firma de una función y su tipo
de retorno utilizando la misma sintaxis de postfijo para escribir variables.
Los parámetros para la función se declaran como una lista separada por comas dentro de
un par de paréntesis, seguidos por dos puntos y el tipo de retorno. Si la función no
devuelve un tipo, debe indicarlo utilizando el tipo Void. Al igual que con las variables, TLS
hará todo lo posible para inferir la firma correcta para aquellas funciones que no tienen
tipos explícitos. Simplemente coloque el cursor sobre un parámetro o el valor de retorno,
y aparecerá una información sobre herramientas, que mostrará lo que el TLS considera
que es el tipo correcto, aunque de manera predeterminada será el tipo any si su uso es
ambiguo de alguna manera.
De hecho, el resultado neto es exactamente el mismo que debería declarar un tipo para
una expresión de función (una variable que tiene una función) con un cambio opcional. El
tipo de retorno de la función puede estar precedido por dos puntos o una flecha (=>). Por
ejemplo:
21
Figura 11: Asignación de Variables
Fuente: Elaboración propia
Las funciones se pueden asignar a variables solo si su firma coincide completamente con
la "marca" de la variable. En otras palabras, todos los nombres y tipos de parámetros
deben coincidir, no solo los tipos. La comparación no se basa únicamente en la posición de
los parámetros y sus tipos.
Las funciones de TypeScript pueden tomar tres tipos de parámetros cuando se definen:
• Parámetros posicionales
• Parámetros opcionales
• Parámetro Rest o de reposo
Todo esto según (Naharry, 2013, pág. 36), lo cual más adelante veremos también.
Por otro lado (Nwamba, 2017, págs. 37-38) en su libro dice que: Las funciones de
JavaScript están mal escritas y son algunas de las fuentes más comunes de errores en el
lenguaje. Así es como se ve una función básica:
function stringToArray(char) {
return char.split(' ')
}
Por ejemplo la seguridad de que ese char no es un número. Bueno, es posible que no
tengamos ningún control sobre lo que el desarrollador que consume stringToArray pasará.
Por eso tenemos que ser estrictos con los tipos de valores que usan TypeScript.
Parámetros de función
Estos parámetros pueden decirle a TypeScript qué tipo de valores debe esperar una
función, y se adherirá estrictamente a ella. El siguiente ejemplo muestra una función que
recibe una cadena de caracteres y un número como sus parámetros:
// Typed parameters
function stringIndex(char: string, index: number) {
const arr = char.split(' ')
return arr[number];
}
23
Valor de retorno de la función
Parámetros opcionales
Cuando el parámetro de una función está estrictamente tipado, se siente rígido cuando la
función necesita ser flexible.
24
de parámetros que no se suministren en el cuerpo de la función, como se muestra en el
ejemplo anterior.
Parámetros Rest
Los parámetros Rest o de reposo también sirven para que TypeScript siga teniendo la
misma flexibilidad de JavaScript.
4.5.3. Clases
Las clases son los bloques de construcción de este lenguaje de programación, aunque el
nombre class fue una palabra reservada en JavaScript, este lenguaje no tubo nunca una
implementación real para las clases orientadas a objeto tradicionales como lo hacen otros
lenguajes java o c++ por ejemplo.
Los desarrolladores de JavaScript por mucho tiempo intentaron imitar este tipo de
funcionalidad aprovechando el objeto function como un tipo constructor que podía
posteriormente ser instanciado con el operador new. Otras tácticas comunes como las de
25
extender estos objetos function se implementaba mediante la aplicación de herencia de
prototipos usando composition, se tratan en general de apaños que intentaban solucionar
el problema de que JavaScript no era un lenguaje orientado a objetos.
Ahora con TypeScript contamos con una real funcionalidad class que es flexible y lo
bastante poderosa para implementar la funcionalidad que nuestras aplicaciones
requieren. Es una de las principales causas de la revolución ECMA Script 6 y TypeScript de
convertir a JavaScript en un verdadero lenguaje de programación orientada a objetos.
4.5.4. Interfaces
A medida que las aplicaciones escalan se van creando más clases y constructores
entonces necesitamos asegurar la consistencia y el cumplimiento de determinadas
normas por parte de nuestro código, como puede ser la validación de tipos y uno de los
mejores modos de hacerlo es creando interfaces.
En pocas palabras una interface es un proyecto de código que define un esquema, este
esquema contiene ciertos campos o tipos que pueden ser de clases o firmas de funciones.
Cuando una clase o método implemente estas interfaces, tiene que cumplir con este
esquema, esto es muy útil cuando queremos forzar el tipado estricto en clases cuando
26
definimos firmas de función para asegurarnos que un cierto tipado de propiedad se
encontrara en la carga, veremos en algunos de los ejemplos en la cual el uso de las
interfaces puede ser de gran ayuda.
Las interfaces son contratos que nuestro código también cumple. Es un acuerdo que las
estructuras de datos deben seguir. Esto ayuda a que cada dato/lógica que implementa
una interfaz se mantenga a salvo de tipos inadecuados o no coincidentes. También valida
los tipos y la disponibilidad de los valores pasados.
Las interfaces se declaran utilizando la palabra clave de interfaz y puede hacer que una
interfaz esté disponible fuera de un módulo utilizando la palabra clave export, de la misma
manera que lo hace con una clase.
27
donde se requiera un ILogger. Esto no afectará el código de llamada porque puede
garantizar que las clases concretas sean compatibles. (Fenton, 2013, pág. 43)
4.5.5. Decoradores
Los decoradores son un modo de añadir metadatos a declaraciones de clase para ser
usados por inyecciones de dependencia o compiladores de directivas, son anotaciones
especiales que modifican el comportamiento de las clases, también aumentan
poderosamente las funcionalidades de los tipos sin tener que crear sub-clases o heredar
de otros tipos. Es una de las características más importantes por las que TypeScript se
vuelve favorito. Aunque todavía son una propuesta de etapa 2 para JavaScript están
disponibles como una característica experimental de TypeScript.
Los decoradores, a primera vista, son confusos debido al signo @ inusual que precede a su
uso:
28
los miembros de lo que está decorando. Las clases, propiedades, métodos y accesorios
están autorizados a ser decorados. (Nwamba, 2017, págs. 43-44)
Tipos de Decoradores
Los tipos de decoradores dependiendo del tipo de elemento que estén destinados a
decorar son:
Decoradores de clase.
Estos decoradores nos permiten aumentar el contenido y ampliar las características de las
clases a las cuales se decora o realizar operaciones sobre cualquiera de sus miembros,
estos decoradores se ejecutan justo antes de que la clase sea instanciada.
De hecho, en Angular, casi todas las clases (componentes, servicios, módulos, filtros y
directivas) están decoradas. Por eso es importante comprender la importancia de la
existencia de decoradores. El decorador de clases se aplica al constructor de la clase y se
puede usar para observar, modificar o reemplazar una definición de clase. Un decorador
de clase no se puede usar en un archivo de declaración ni en ningún otro contexto
ambiental (como por ejemplo en una declaración de clase).
29
Figura 16: Decoradores de Clase
Fuente: Elaboración propia
Decoradores de métodos
Aquí un ejemplo donde aplicamos los tres argumentos de lo que son los decoradores de
métodos:
30
Figura 17: Decorador de Método
Fuente: Elaboración propia
Decoradores de propiedad
Estos decoradores están destinados a ser aplicados dentro de campos de una clase y
pueden ser definidos mediante la creación de una función property decorator cuya firma
toma dos parámetros; el primero target el prototipo de clase que queremos decorar y el
segundo key el nombre de la propiedad que queremos decorar.
31
El decorador de propiedad se declara justo antes de la declaración de la propiedad. Como
tal, un decorador de propiedades solo puede usarse para observar que una propiedad de
un nombre específico ha sido declarada para una clase.
Decoradores de parámetro
32
3. El índice ordinal del parámetro en la lista de parámetros de la función.
4.5.6. Módulos
Los módulos son declarativos; las relaciones entre los módulos se especifican en términos
de importaciones y exportaciones a nivel de archivo.
33
que se usan en JavaScript son el cargador de módulos CommonJS para Node.js y require.js
para aplicaciones web.
En TypeScript, al igual que en ECMAScript 2015, cualquier archivo que contenga una
importación o exportación de alto nivel se considera un módulo. Por el contrario, un
archivo sin ninguna declaración de importación o exportación de alto nivel se trata como
un script cuyos contenidos están disponibles en el ámbito global (y por lo tanto también
para los módulos).
Como pudimos ver, tenemos módulos externos e internos los cuales los vamos a definir de
la siguiente manera:
Los módulos internos son envoltorios simples que contienen una variedad de clases,
objetos, funciones o variables que tienen el ámbito interno que están lejos del alcance
global o externo, para poder exponer públicamente a una clase de modulo se utiliza la
palabra export antepuesto a la clase, lo cual para poder acceder desde fuera del módulo
se debe utilizar la palabra import.
Los módulos externos son la solución para realizar aplicaciones diseñadas para ser
escalables, con la diferencia de que estos módulos son visibles de manera global. Para
acceder al módulo también se hace el uso de la palabra import pero también debemos
llamar al archivo con el uso de require.
Los módulos son clases decoradas con el decorador NgModule. El decorador toma un
objeto, al igual que el decorador de componentes. Este objeto describe todos los
miembros de funciones que necesita asociar a este módulo. Los posibles miembros
(aunque no todos los miembros) son los siguientes:
34
Bootstrap: Este es el componente de entrada para iniciar la aplicación.
Providers: Dado que aún no tenemos ningún servicio, los proveedores pueden omitirse o
la matriz puede dejarse vacía.
35
5. RXJS Y LA PROGRAMACIÓN REACTIVA.
El mundo de hoy está avanzando de manera muy rápida lo cual hace que las personas y
usuarios de las aplicaciones modernas requieran de mayores necesidades, que los
programas sean también más eficientes al momento de su uso. Hace solo unos años una
aplicación grande tenia decenas de servidores, segundos de tiempo de respuesta, horas
de mantenimiento sin conexión y gigabytes de datos.
Hoy en día las aplicaciones se implementan en todo, desde dispositivos móviles hasta
clusters basados en la nube que ejecutan miles de procesadores multi-core.
Estos puntos que acabamos de tocar nos hacen buscar nuevas maneras de desarrollar
aplicaciones para hoy y el futuro, lo que nos lleva a investigar y analizar las nuevas
tecnologías que se tienen como respuestas a estas demandas, como por ejemplo la
programación reactiva.
36
información de la base de datos, mientras la base de datos vaya a enviar la información la
aplicación sigue ejecutándose sin pausa alguna y al momento donde llega la información
la aplicación realiza una serie de eventos que fue programada cuando fue desarrollado
(esto es programación asíncrona). (Chakraborty, 2017, pág. 9)
Scale up: hace uso del paralelismo en sistemas con múltiples core.
Resistencia a fallos. Se considera que una aplicación es resistente a fallos cuando es capaz
de recuperarse rápidamente por si misma de los fallos del tipo:
• Fallos en el software.
• Fallos en el hardware.
• Fallos de conectividad.
37
El intercambio de mensajes garantiza bajo acoplamiento entre componentes, aislamiento
y transparencia en la ubicación. La minimización de los bloqueos garantiza menor
consumo de recursos.
Investigando sobre este tema, se encuentra que el manifiesto Reactivo fue publicado el
año 2014, con el objetivo de diseñar aplicaciones altamente escalables y confiables
también pensando en los que estén inmersos en el desarrollo de esta, por ejemplo:
desarrolladores, arquitectos, líderes de proyectos, ingenieros de gestión de calidad, etc.
Propone que los sistemas reactivos son más flexibles, ligeramente acoplados (loosely-
coupled) y escalables. Esto los hace más fáciles de ser desarrollados y susceptibles a los
cambios. Son de manera significativamente más tolerantes a las fallas, y cuando suelen
haber fallas lo satisfacen responden de manera muy elegante en lugar de que se produzca
un desastre. Los sistemas reactivos son altamente receptivos y brindan a los usuarios un
feedback interactivo efectivo. De ahí la fama de introducir estos principios que, la
programación reactiva propone construir sistemas Responsivos, Resilentes, Elásticos y
Guiados por mensajes o eventos.
Responsive
VALUE
38
“Las arquitecturas de software de ayer simplemente no satisfacen las demandas de hoy”.
(Chakraborty, 2017, pág. 11)
Los usuarios esperan datos en tiempo real. Ellos quieren sus tweets ahora. Su orden
confirmada ahora. Necesitan precios precisos a partir de ahora. Sus juegos en línea deben
ser receptivos. Como desarrollador, exiges mensajes de fuego y olvido. No se quiere ser
bloqueado esperando un resultado. Desea que se le envíe el resultado cuando esté
listo. Aún mejor, cuando trabaje con conjuntos de resultados, desea recibir resultados
39
individuales cuando estén listos. No desea esperar a que se procese todo el conjunto
antes de ver la primera fila. Los usuarios esperan datos reales. Los desarrolladores
necesitan herramientas para reaccionar a los datos de empuje.
40
Se ve y se entiende entonces que Rx es una librería para .NET al igual que las distintas
librerías creadas para los distintos lenguajes de programación según sus características,
(ReactiveX, 2018, pág. 1). Más adelante veremos una específicamente para cumplir el
objetivo de este documento (RxJS).
Observable: Los Observables son las secuencias de datos. El observable empaqueta los
datos que se pueden pasar de un hilo a otro. Básicamente emiten los datos
periódicamente o solo una vez en su ciclo de vida en función de sus configuraciones y
basado en empuje es decir el observable empuja el valor o dato al observador. Existen
varios operadores que pueden ayudar al observador a emitir algunos datos específicos
basados en ciertos. Por ahora, podemos pensar en los observables como proveedores.
Procesan y suministran los datos a otros componentes.
41
• El Observer reacciona a cualquier elemento que emite el Observable.
Pareciera que no hay mucha diferencia con el patrón tradicional de Observer. Pero en
realidad hay dos diferencias esenciales:
Creando Observables
Hay varias maneras de crear Observables, siendo el operador de creación el más obvio. El
operador de creación en el objeto Rx.Observable toma una devolución de llamada que
acepta un Observer como parámetro. Esa función define cómo el Observable emitirá
valores. Así es como creamos un Observable simple:
42
El método creado en el objeto Rx.Observer toma funciones para los casos onNext,
onCompleted y onError y devuelve una instancia de Observer. Estas tres funciones son
opcionales y puede decidir cuáles incluir. Por ejemplo, si nos suscribimos a una secuencia
infinita, como clics en un botón (el usuario podría seguir haciendo clic para siempre),
nunca se llamará al controlador onCompleted.
Según, (Mansilla, 2015, págs. 10-11) si confiamos en que la secuencia no puede generar
errores (por ejemplo, al hacer un Observable a partir de una matriz de números), no
necesitamos el método onError.
Como se muestra en esta figura 25, el operador SubscribeOn designa en qué subproceso
comenzará el funcionamiento del Observable, sin importar en qué punto de la cadena de
operadores se llame al operador.ObserveOn , por otro lado, afecta el hilo que el
43
Observable usará debajo de donde aparece ese operador. Por esta razón, puede llamar
a ObserveOn varias veces en varios puntos durante la cadena de operadores Observable
para cambiar en qué subprocesos operan algunos de esos operadores.
44
Observable: Emits data
Thread 1
Thread 2
Observer: Data Consumer
Es importante mencionar que extiende del patrón Observador para admitir secuencias de
datos y/o eventos. Además propone operadores que permiten componer secuencias de
forma declarativa; mientras abstrae el subprocesamiento de bajo nivel como el threading,
sincronización, seguridad de subprocesos, estructuras de datos concurrentes y entradas y
salidas no bloqueante.
Flujo
10 5 15 Flujo 13,5
Flujo
Suma 10% descuento
Figura 27: Ejemplo Reactivo con Excel
Fuente: (Caules & Álvarez, 2016)
45
Son dos celdas iniciales que sumamos en otra celda para finalmente aplicar un descuento
del 10% en otra. Hemos construido un flujo de datos y cualquier administrativo lo
entiende. Es algo muy natural, cada vez que cambiemos un dato de las celdas actuales el
resto se actualizará. Si enfocamos esto desde el mundo del desarrollo clásico como en la
figura 28 nos encontraremos con un enfoque muy diferente:
5.3.2. Rx.JS
Rx.JS es una de las librerías JavaScript que cada día se usa más y más en el desarrollo de
aplicaciones de la actualidad, es uno de los representantes de la programación reactiva.
Rx comenzó con una implementación para .NET, pero hoy tiene una implementación de
código abierto bien mantenida en todos los lenguajes principales (y algunos menores).
46
Se está convirtiendo en el estándar para programar aplicaciones reactivas, y el tipo
principal de datos de Rx, el Observable, se propone para su inclusión en ECMAScript 7
como parte integral de JavaScript. Esto según el libro Reactive Programming with RxJS de
mansilla. (Mansilla, 2015, pág. 2)
Rx.JS es la biblioteca reactiva más famosa y usada en este momento; se usa en casi todas
partes, desde Angular 2, donde la biblioteca está integrada dentro del framework a
muchos otros framework más pequeños o más grandes que están adoptando esta
biblioteca y aprovechando su poder.
Es una de las bibliotecas reactivas más completas con muchos operadores y una gran
documentación, Rx.JS es parte de Reactive Extensions, (http://reactivex.io) en esta página
se puede seguir de más cerca todas las actualizaciones sobre esta librería.
Teniendo en cuenta qué tan grande es Rx.JS es importante tener bien en claro todos
conceptos y que mejor desde una fuente oficial como es su página. Como ya
mencionamos más adelante adentrándonos en la página oficial de Rx sabemos que las
extensiones reactivas para JavaScript son un conjunto de bibliotecas para componer
programas asíncronos y basados en eventos que utilizan secuencias observables y
operadores de consultas fluidas que muchos desarrolladores ya conocen por Array #
extras en JavaScript. Usando RxJS, los desarrolladores representan flujos de datos
asíncronos con Observables, consultan flujos de datos asincrónicos usando nuestros
muchos operadores, y parametrizan la concurrencia en las secuencias de datos
asincrónicas usando Schedulers. En pocas palabras, RxJS = Observables + Operadores +
Programadores (Observables + Operators + Schedulers).
Debido a que las secuencias observables son flujos de datos, se puede consultar utilizando
operadores de consulta estándar implementados por el tipo Observable. Por lo tanto,
47
puede filtrar, proyectar, agregar, componer y realizar operaciones basadas en el tiempo
en múltiples eventos fácilmente mediante el uso de estos operadores. Además, hay varios
otros operadores de flujo reactivo específicos que permiten escribir consultas potentes. La
cancelación, las excepciones y la sincronización también se manejan con elegancia
utilizando los métodos en el objeto Observable. https://github.com/Reactive-
Extensions/RxJS.
Para poder entender de forma sencilla RxJS debemos de empezar a trabajar con un
ejemplo (figura 30). En este caso se eligió un simple botón que cada vez que le pulsamos
nos imprime por consola las veces que hemos hecho click.
48
Vamos a convertir ahora nuestro código a un enfoque más reactivo. En este caso vamos a
usar RxJS para convertir los clicks en un flujo de datos.
Flujo de
click click click click click
49
último paso es subscribirse al stream o flujo de datos e imprimir su resultado por consola,
para ello usamos el método subscribe.
click
fromEvent
sum
subscribe
Figura 33: Aplicación de RxJS
Fuente: (Caules & Álvarez, 2016)
6. ANGULAR
En los últimos años Angular ha ido haciéndose más popular como uno de los mejores
frameworks para desarrollar aplicaciones. Pero para seguir adelante con este subtema de
este documento, revisaremos la definición de qué es en realidad angular.
Angular es una plataforma que facilita la creación de aplicaciones con la web. Angular
combina plantillas declarativas, inyección de dependencia, herramientas de extremo a
extremo y mejores prácticas integradas para resolver los desafíos de desarrollo. Angular
permite a los desarrolladores crear aplicaciones que viven en la web, el móvil o el
escritorio. (Angular, 2018)
Angular está escrito en TypeScript lo cual facilita más aun el desarrollo con dicho lenguaje
de programación.
50
Para estar más al tanto y entender mejor de este poderoso framework Angular y la
aplicación de la programación reactiva se hacen una breve introducción sobre Angular.
Recientemente, como en 2017, Google lanzó una nueva versión que debería mejorar la
experiencia de los desarrolladores de JavaScript con Angular, proporcionando un
ecosistema completo de herramientas y patrones para trabajar fácilmente con este
framework sin la necesidad de eliminar la Web para ensamblar múltiples bibliotecas
dentro del mismo proyecto
Desde la versión 2, Angular adopta TypeScript como su idioma principal; JavaScript ES6 y
Dart también son compatibles, pero la gran mayoría de los recursos en el sitio web
Angular están preparados con TypeScript; lo cual es el objetivo de esta monografía,
inducir a la programación reactiva de aplicaciones con TypeScript.
Angular como framework proporciona una arquitectura completa y utilidades listas para
usar con una herramienta CLI interesante para acelerar la productividad de un
desarrollador. (Mezzalira, 2018, pág. 51)
Funcionamiento de Angular
51
arquitectura de angular, por lo que no se tomará en cuenta la anterior versión porque se
ha comprobado anteriormente que funciona de manera diferente.
app.component.css app.component.html
Objetos
UpdatetotalService.ts
Módulo raíz
• Inyección de dependencia.
• Modularidad con NgModules y componentes.
• Enlace de datos entre plantillas y los componentes
• Gran uso de decoradores para definir objetos como Componentes o Módulos
Ahora profundizaremos más en esta arquitectura, analizando las diferentes partes que
componen un proyecto angular.
52
Por ejemplo este es el código de un módulo raíz de la arquitectura declarada en la imagen
anterior:
Como se puede ver en este fragmento de código, Angular está compuesto principalmente
por decoradores (@NgModule) para envolver nuestro código dentro del marco angular.
Otra cosa muy importante de saber es que el equipo de Angular desarrolló una
herramienta todo en uno para ayudarlo a prestar menos atención a las herramientas que
lo rodean pero a prestar más atención a la construcción de su proyecto. Se conoce como
53
Angular CLI, y con solo unos pocos comandos CLI está construyendo su aplicación. El
tiempo dedicado a la administración de herramientas de JavaScript en estos días es
alarmante, y nadie desea quedarse atrapado en ese lío.
Para instalar la Angular CLI, debe ejecutar el siguiente comando con npm:
npm install -g @ angular/cli
Cuando se complete la instalación, para verificar ejecute los siguientes comandos:
# Ayuda comando
ng help
# Comando de versión
ng version
# crear una nueva
Aplicación.
ng new miAplicacion
Esta es la estructura (Figura 36) de la creación de una
nueva aplicación mediante el comando anterior
también se instala las dependencias de npm y para
verificar debería revisar package.json, también
podemos encontrar la librería RxJS para la
programación reactiva (por la que estamos
desarrollando este documento) y una serie de
archivos que ayudan en el proceso de compilación y la Figura 36: Estructura de los componentes Angular
Fuente: Elaboración propia
gestión de paquetes, de lo cual el desarrollador no se
tiene que preocupar. (Nwamba, 2017, págs. 47-54)
54
Los componentes son pequeñas clases que cumplen tareas específicas. Una aplicación en
angular debería estar basada en múltiples componentes.
Los componentes son el corazón de cualquier proyecto angular. Son los componentes
básicos, y todas las demás funciones solo están destinadas a admitir componentes. Los
archivos mencionados contienen componentes angulares escritos en TypeScript. Esto es lo
que se ve en app.component.ts:
Un componente es una clase decorada con una plantilla. El tipo de decoración es lo que
importa, en este caso, un decorador de componentes. Como habíamos visto
anteriormente que los decoradores son solo funciones que amplían la función que están
decorando. Eso es lo que está sucediendo en el ejemplo anterior (Figura 37).
<!--./src/index.html-->
...
<body>
<app-root></app-root>
</body>
55
templateUrl: los componentes representan una plantilla para la vista. Necesitamos una
forma de decirle al componente qué plantilla representar. Esto es posible a través del
template o la propiedad templateUrl. La propiedad template toma una cadena de
contenido HTML mientras que templateUrl toma una URL para el archivo HTML de
plantilla.
styleUrls: esta es una matriz de Urls de estilo que se aplican a la plantilla definida.
6.2.1. Templates.
Las plantillas o templates son solo archivos normales html, aunque sobrealimentados con
interpolación y directives. La siguiente imagen es una plantilla app.component.html del
AppComponent continuando al anterior ejemplo.
Las plantillas pueden realizar muchas tareas como por ejemplo interpolación con valores
vinculantes al componente perteneciente, enlace de propiedad de evento, enlace
bidireccional, iteraciones y condiciones, estilos y clases vinculantes, expresiones simples,
pipes, directives, etc.
56
La propiedad styleUrls en el argumento del decorador del componente toma una matriz
de URL que apuntan a los estilos que desea aplicar al componente. La mayoría de las
veces, solo se necesita un solo archivo; por lo tanto, la matriz solo contendrá un único
elemento de URL, en nuestro caso, app.component.css. Pero si se desea se puede usar el
archivo para cambiar algunos estilos de ese componente o también de manera global con
solo utilizar el operador *. (Nwamba, 2017, págs. 55-59)
6.2.3. Módulos.
Los módulos son contenedores o también se podría decir que son agrupaciones lógicas de
componentes y otros servicios.
Vale decir que una aplicación angular está dividida en módulos, pero también cada
módulo puede ser una aplicación, de hecho una aplicación siempre debe tener por lo
menos un módulo o modulo raíz. CLI nos genera ese modulo del cual hablamos cada vez
que creamos una nueva aplicación con npm el cual se llama app.Module.ts y está
decorado por @NgModule. Este decorador toma y describe todos los miembros de
funciones que necesita asociar el modulo, estos son los posibles miembros:
57
Figura 39: Módulo en Angular
Fuente: Elaboración propia
6.2.4. Directives
La manipulación del DOM también lo manejan los componentes pero se quiere que su
código sea más simple y reutilizable entonces es necesario que otras instrucciones se
encarguen de esta manipulación ahí es donde entran las directivas.
Las directivas en Angular son instrucciones para la plantilla HTML sobre cómo la plantilla
debe manejar el DOM.
Los componentes, también son directivas con acceso directo a la plantilla que se
manipula. Pero anteriormente ya habíamos visto sobre los componentes así que
pasaremos a analizar las otras directivas.
Para crear una nueva directiva en el proyecto se lo puede hacer mediante el comando:
58
Figura 40: Directiva Angular
Fuente: Elaboración propia
Las directivas estructurales, tienen mucho en común con las directivas de atributo, en
términos de cómo se crean, pero son muy diferentes en cómo se espera que se
comporten. Se espera que una directiva estructural, a diferencia de una directiva de
atributos, cree o elimine un elemento DOM. Esto es diferente de usar una propiedad de
pantalla CSS para mostrar u ocultar un elemento. En este caso, el elemento aún se
encuentra en el árbol DOM, pero no está visible para el usuario final cuando está oculto.
Un buen ejemplo es * ngIf. Cuando se elimina un elemento del DOM utilizando una
directiva estructural * ngIf, la directiva desaparece de la pantalla y se elimina del árbol
DOM.
Obviamente para poder contar una funcionalidad precisa de una directiva tenemos que
hacer una serie de artificios programando por ejemplo en el componente plantilla, por
ejemplo utilizando el método ElementRef en el constructor de la directiva podemos
realizar cambios en los estilos, o también nativeElement para dar acceso al elemento al
que se aplica la directiva de atributo, o también Object.assing para reducir la cantidad de
código que tengamos que escribir. Para más detalles revise el libro de: (Nwamba, 2017,
págs. 135-142)
6.2.5. Pipes
Otra característica de gran funcionalidad en la plantilla son las Pipes. Las Pipes le permiten
formatear el contenido de la plantilla en el lugar, directamente en la plantilla. En lugar de
formatear el contenido en el componente, puede simplemente escribir un pipe para
hacerlo directamente en la plantilla.
59
Aquí hay un buen ejemplo para una Pipe:
<div class="container">
<h2>{{0.5 | percent}}</h2>
</div>
Algunos pipes toman argumentos, que ayudan a ajustar el comportamiento del pipe
cuando se aplica a algún contenido. Un ejemplo de tales canalizaciones es el pipe de
divisas, que toma un argumento para definir con qué moneda se formateará un contenido
en realidad hay distintas maneras de aplicar las pipes.
Creando pipes
Se vio para qué podemos usar pipes y dónde podemos usarlas. Lo siguiente que se debe
entender es cómo crear nuestros propios pipes personalizados utilizando clases de
TypeScript. Pero primero se necesita tener generado un pipe y se hace ejecutando el
siguiente comando:
Este ejemplo toma una cadena y devuelve la versión invertida de la cadena. La clase
ReversePipe implementa una interfaz PipeTransform, que define un método de
transformación que se debe crear con una firma determinada, como se vio anteriormente.
60
La clase está decorada con un decorador Pipe, el cual toma la configuración de un objeto
como un argumento.
El objeto debe definir una propiedad de nombre, que sirve como el identificador para el
pipe cuando se aplica a una plantilla. En este caso, el nombre de la pipe es reverse.
Para poder aprender más sobre pipes y estar siempre actualizado es bueno revisar la
documentación oficial. https://angular.io/guide/pipes.
Mientras se investigaba, se encontró este amplio portafolio que ilustra las compañías que
actualmente usan las versiones Angular 2.0 y posteriores: Google, VMWare, Teradata,
Youtube TV, CVS, Barnes & Noble, Citibank, Freelancer, AIESEC, Chase, Air Asia, Udacity,
Crunchbase, y Kaplan, entre las principales marcas.
8. CONCLUSIONES.
TypeScript es uno de los lenguajes de programación con mayor futuro. Estas son algunas
características con las que TypeScript se convierte en un lenguaje de programación muy
poderosa: Fuertemente tipado, es una de sus más importantes características que tiene,
con la que se pueden construir aplicaciones más robustas y en gran manera escalables,
también la estructura de los componentes y módulos que hacen al código más
mantenible y que las aplicaciones modernas puedan desarrollarse también de manera
reactiva con RxJS al desarrollar con Angular; lo que hace que las aplicaciones puedan dar
61
respuestas en tiempo real. Decoradores/Anotaciones, El uso de decoradores o
anotaciones (metadatos) es clave para conseguir diseñar aplicaciones potentes.
Como se pudo ver el framework Angular es una buena herramienta y muy poderosa que
combina plantillas declarativas, inyección de dependencia, herramientas de extremo a
extremo y mejores prácticas integradas para resolver los desafíos de desarrollo. Es el
mejor framework para crear aplicaciones complejas listas para usar con una capa de
presentación rica y lo mejor aún; poder desarrollar aplicaciones reactivas. Dado que
cuenta con el respaldo del Team Angular en Google los cuales integraron las librerías
necesarias para trabajar de manera asíncrona RxJS y también un JavaScript mucho más
mejorado podemos decir; hablamos de TypeScript, también cuenta con el apoyo de una
gran comunidad de desarrolladores de todo el mundo, existe una gran cantidad de ayuda
para que los ingenieros de software puedan consultar. Para estar mejor informado y
actualizado invito al lector poder revisar la documentación oficial de angular.
https://angular.io.
62
9. BIBLIOGRAFIA
Bonér, J., Farley, D., & Kuhn, R. (2014). Manifiesto Reactivo. Recuperado el Octubre de
2018, de Manifiesto Reactivo: https://www.reactivemanifesto.org/
Mansilla, S. (2015). Reactive Programming with RxJs. Dallas: The Pragmatic programers.
Naharry, D. (2013). TypeScript Revealed (TypeScript revelado). New york: appress Media.
Nwamba, C. (2017). TypsScript 2.x for Angular Developers. Birmingham: Packt Publishing
Ltd.
63
ReactiveX. (2018). ReactiveX Introduction. Obtenido de ReactiveX:
http://reactivex.io/intro.html
Sebastien, Ollivier. (Mayo 2016). AngularJS, Desarrolle hoy las aplicaciones web de
mañana. Barcelona: Editions ENI.
Toal, R., & Rivera, R. (2017). Programming Languaje Explorations. London New York: Acid-
Free paper.
Valverde Ramos, E., Hernandez, P., & Fuen, M. (2017). TypeScript. Creative Commons.
64