Charla para JS Day Madrid 2015 09/05/2015:
- Video: https://goo.gl/jOm4aN
- Slideshare: http://goo.gl/cnTQw9
- Github: https://goo.gl/as8pdD
Cada lenguaje, cada tecnología, cada paradigma de programación persigue siempre la reutilización de código. En la comunidad de desarrollo se habla frecuentemente de DRY (Don’t Repeat Yourself) o WORE (Write Once Run Everywhere). Pero estos manidos mantras se quedan frecuentemente en una mera declaración de principios.
El código desarrollado para su reutilización no es capaz de reubicarse en otros contextos arquitectónicos de aquellos para los que fue inicialmente diseñado. Las capacidades de meta-programación de JavaScript le convierten en un lenguaje flexible y lo suficientemente plástico como para adaptarse dinámicamente a cualquier solución construida.
En esta charla exploramos como construir programas que se modifiquen a si mismos para resolver estos problemas y discutiremos mecanismos, técnicas y patrones de metaprogramación basados en componentes de software.
Learn about Agile Methodology of Software Engineering and study concepts like What is Agile, Why Agile is there, Agile Principles, Agile Manifesto with Pros & Cons of it.
Presentation also include Agile Testing Methodology like Scrum, Crystal Methodologies, DSDM, Feature Driven Development, Lean Software Development & Extreme Programming.
If you watch this one please rate it and do share this presentation to others so then can easily learn more about the Agile Methodology.
This presentation is about a lecture I gave within the "Software systems and services" immigration course at the Gran Sasso Science Institute, L'Aquila (Italy): http://cs.gssi.infn.it/.
http://www.ivanomalavolta.com
Learn about Agile Methodology of Software Engineering and study concepts like What is Agile, Why Agile is there, Agile Principles, Agile Manifesto with Pros & Cons of it.
Presentation also include Agile Testing Methodology like Scrum, Crystal Methodologies, DSDM, Feature Driven Development, Lean Software Development & Extreme Programming.
If you watch this one please rate it and do share this presentation to others so then can easily learn more about the Agile Methodology.
This presentation is about a lecture I gave within the "Software systems and services" immigration course at the Gran Sasso Science Institute, L'Aquila (Italy): http://cs.gssi.infn.it/.
http://www.ivanomalavolta.com
Following presentation answers:
- Why do we need evolution?
- What happens if we do not evolve the software?
- What are the types of software evolution?
- What are Lehman's laws
- What are the strategies for evolution?
A brief report on Client Server Model and Distributed Computing. Problems and Applications are also discussed and Client Server Model in Distributed Systems is also discussed.
Cette présentation explique quelques concepts fondamentaux de Hazelcast dans l'écosystème du Big Data, et montre comment :
- Créer un cache mémoire distribué basé sur un cluster Hazelcast
- Faire du traitement distribué avec Hazelcast
- Créer une application de messagerie asynchrone utilisant les Topic d'un cluster Hazelcast
- Autres ...
Bon apprentissage
This is an introductory lecture to Architecture Description Languages, part of the Advanced Software Engineering course, at the University of L'Aquila, Italy (www.di.univaq.it/muccini/SE+/2012)
La reutilización ha sido desde siempre uno de los objetivos más perseguidos dentro de la ingeniería del software. La idea de convertir los procesos de construcción de aplicativos en algo automatizable, sencillo y económico siempre ha estado ahí en la cabeza de los desarrolladores. Pero, de manera recurrente, esta iniciativa se ha dado de bruces con los inamovibles mimbres de unos paradigmas de programación demasiado inflexibles a este respecto.
Sin embargo, lenguajes como Javascript se prestan mucho más a hacer del desarrollo de código un ejercicio de verdadera reutilización. A lo largo de esta charla explicaremos cuáles son las barreras paradigmáticas que suelen impedir la reutilización y cómo y en qué sentido JavaScript consigue soslayarlas con éxito. Asimismo presentaremos una colección de modelos arquitectónicos basados en Mixins, Traits, Roles, Aspectos, Subjects, etc. que se están usando en proyectos de software actuales con este lenguaje precisamente por las bondades que ellos.
Programación Funcional en Javascript. 27/10/2014. NodeJS Madrid
Video: http://bit.ly/1xTizFc
Code: http://bit.ly/1qmmR3Q
La programación funcional está cogiendo fuerte tracción en los últimos años dentro de la comunidad de desarrollo. Tal vez ello se deba al surgimiento de nuevas arquitecturas que demandan cotas de escalabilidad, resistencia y flexibilidad en el marco de soluciones centradas en procesos de transformación. Pero más allá de una simple moda, como trataremos de mostrar en esta charla, la programación funcional conduce a soluciones de código robustas, versátiles y expresivas que difícilmente son comparables con las propias de la orientación a objetos.
Además JavaScript, como la mayoría de los lenguajes de scripting es un lenguaje idiomático que invita a pensar en términos funcionales. De hecho muchas veces, cuando programamos en Javascript, desarrollamos soluciones funcionales casi sin darnos cuenta. Pero para trabajar correctamente en el marco de este paradigma debemos saber, qué es exactamente la programación funcional, cuáles son sus ventajas y principios fundacionales, de qué mecanismos se sirve, qué técnicas de programación se utilizan, qué patrones de diseño funcional existen a nuestra disposición y qué estilos arquitectónicos emergen.
En esta charla descubriremos cómo se construyen arquitecturas funcionales dirigidas por los datos, hablaremos de programación por capas basada en orden superior y presentaremos modelos de programación concomitantes como la programación reactiva basada en streams o las arquitecturas map/reduce propias de las técnicas de big data.
Following presentation answers:
- Why do we need evolution?
- What happens if we do not evolve the software?
- What are the types of software evolution?
- What are Lehman's laws
- What are the strategies for evolution?
A brief report on Client Server Model and Distributed Computing. Problems and Applications are also discussed and Client Server Model in Distributed Systems is also discussed.
Cette présentation explique quelques concepts fondamentaux de Hazelcast dans l'écosystème du Big Data, et montre comment :
- Créer un cache mémoire distribué basé sur un cluster Hazelcast
- Faire du traitement distribué avec Hazelcast
- Créer une application de messagerie asynchrone utilisant les Topic d'un cluster Hazelcast
- Autres ...
Bon apprentissage
This is an introductory lecture to Architecture Description Languages, part of the Advanced Software Engineering course, at the University of L'Aquila, Italy (www.di.univaq.it/muccini/SE+/2012)
La reutilización ha sido desde siempre uno de los objetivos más perseguidos dentro de la ingeniería del software. La idea de convertir los procesos de construcción de aplicativos en algo automatizable, sencillo y económico siempre ha estado ahí en la cabeza de los desarrolladores. Pero, de manera recurrente, esta iniciativa se ha dado de bruces con los inamovibles mimbres de unos paradigmas de programación demasiado inflexibles a este respecto.
Sin embargo, lenguajes como Javascript se prestan mucho más a hacer del desarrollo de código un ejercicio de verdadera reutilización. A lo largo de esta charla explicaremos cuáles son las barreras paradigmáticas que suelen impedir la reutilización y cómo y en qué sentido JavaScript consigue soslayarlas con éxito. Asimismo presentaremos una colección de modelos arquitectónicos basados en Mixins, Traits, Roles, Aspectos, Subjects, etc. que se están usando en proyectos de software actuales con este lenguaje precisamente por las bondades que ellos.
Programación Funcional en Javascript. 27/10/2014. NodeJS Madrid
Video: http://bit.ly/1xTizFc
Code: http://bit.ly/1qmmR3Q
La programación funcional está cogiendo fuerte tracción en los últimos años dentro de la comunidad de desarrollo. Tal vez ello se deba al surgimiento de nuevas arquitecturas que demandan cotas de escalabilidad, resistencia y flexibilidad en el marco de soluciones centradas en procesos de transformación. Pero más allá de una simple moda, como trataremos de mostrar en esta charla, la programación funcional conduce a soluciones de código robustas, versátiles y expresivas que difícilmente son comparables con las propias de la orientación a objetos.
Además JavaScript, como la mayoría de los lenguajes de scripting es un lenguaje idiomático que invita a pensar en términos funcionales. De hecho muchas veces, cuando programamos en Javascript, desarrollamos soluciones funcionales casi sin darnos cuenta. Pero para trabajar correctamente en el marco de este paradigma debemos saber, qué es exactamente la programación funcional, cuáles son sus ventajas y principios fundacionales, de qué mecanismos se sirve, qué técnicas de programación se utilizan, qué patrones de diseño funcional existen a nuestra disposición y qué estilos arquitectónicos emergen.
En esta charla descubriremos cómo se construyen arquitecturas funcionales dirigidas por los datos, hablaremos de programación por capas basada en orden superior y presentaremos modelos de programación concomitantes como la programación reactiva basada en streams o las arquitecturas map/reduce propias de las técnicas de big data.
La programación funcional está cogiendo fuerte tracción en los últimos años dentro de la comunidad de desarrollo. Tal vez ello se deba al surgimiento de nuevas arquitecturas que demandan cotas de escalabilidad, resistencia y flexibilidad en el marco de soluciones centradas en procesos de transformación. Pero más allá de una simple moda, como trataremos de mostrar en este taller, la programación funcional conduce a soluciones de código robustas, versátiles y expresivas que difícilmente son comparables con las propias de la orientación a objetos.
Además JavaScript, como la mayoría de los lenguajes de scripting es un lenguaje idiomático que invita a pensar en términos funcionales. De hecho muchas veces, cuando programamos en Javascript, desarrollamos soluciones funcionales casi sin darnos cuenta. Pero para trabajar correctamente en el marco de este paradigma debemos saber, qué es exactamente la programación funcional, cuáles son sus ventajas y principios fundacionales, de qué mecanismos se sirve, qué técnicas de programación se utilizan, qué patrones de diseño funcional existen a nuestra disposición y qué estilos arquitectónicos emergen.
Este taller trata de dar una introducción a la programación funcional que comienza desde lo más básico y va pasando progresivamente hacia conceptos más avanzados. A continuación se resume una relación del programa de contenidos para que os hagáis una idea de lo que se va a abordar.
- Diseño de Funciones I. Recursión
- Diseño de Funciones II. Inmersion
- Orden Superior I. Famila map & reduce
- Orden Superior II. Evaluación Partial
- Orden Superior III. Closures & Retentión Léxica
- Composición I. compose & sequence
- Composición II. Inversión de control
- Composición III. Streams
- Diseño sin Estado I. Fundamentos
- Diseño sin Estado II. Mónadas
- Conceptos Avanzados I. Optimización
- Conceptos Avanzados II.Inmutabilidad
Todos estos temas se abordan en 12 ficheros `.js` que se encuentran en [https://goo.gl/YwXtkV], en la carpeta `code/`. Para falilitar la realización y autoevaluación, el material de este taller se ha dividido en dos carpetas. En `code/problems` puede encontrarse una descripción de cada ejercicio planteado junto con una plantilla de código que ayuda a escribir la solución y probarla. En la carpeta `code/solutions` se ofrece una propuesta de solución para cada ejercicio planteado. Se anima al lector a no consultar la solución hasta haber intentando cada ejercicio por si mismo.
Arquitecturas de Componentes Web. Patrones de ComposiciónJavier Vélez Reyes
La tecnología de componentes web ha supuesto un revulsivo en la forma en la que se desarrollarán soluciones web en los próximos años. Si algo hemos aprendido, en este sentido, es que debemos dejar de construir aplicaciones monolíticas y empezar a pensar en crear componentes Web estratégicamente diseñados para que cubran las necesidades más comunes dentro de este tipo de problemas.
Polymer y los estándares de componentes Web nos proporcionan ya toda una panoplia de herramientas para construir este tipo de soluciones de manera más sencilla. Sin embargo, aun faltan muchos mimbres por establecer. La necesidad de un modelo arquitectónico de referencia se dibuja como una necesidad insoslayable para poder articular soluciones de éxito de esta naturaleza. En efecto una arquitectura nos ofrece un marco prescriptivo preciso donde dar forma a las contribuciones de múltiples partes para crear un catálogo de componentes coherente que pueda ser utilizado por la comunidad para construir soluciones orientadas a componentes web.
En relación a lo anterior, a lo largo de esta charla centraremos nuestra atención en un problema nuclear: ¿Cómo deben articularse los procesos de composición en el marco de esta tecnología? Para responder esta pregunta no debemos olvidar que este nuevo paradigma prescribe un proceso constructivo desarrollado en el ámbito declarativo del lenguaje HTML y no en el espacio programático de JavaScript, dado que así se consiguen procesos de desarrollo más sencillos, ágiles y productivos. En relación a la composición todo esto implica que no sólo debemos esforzarnos por crear componentes visuales que den respuesta a las necesidades recurrentes de interacción en el plano del front sino que, adicionalmente, debemos elaborar un conjunto de componentes dedicado a a estereotipar y encapsular toda aquella lógica de composición más común. De esta manera el desarrollo de soluciones orientadas a componentes web alcanzará su madurez plena al convertir un tedioso proceso constructivo en un ejercicio de confección compositiva asistido por componentes que proporcionan código pegamento. Todo esto se resume en que debemos crear componentes visuales, sí, pero además componentes para componer.
La Web está evolucionando y los procesos de desarrollo en relación a la misma también lo hacen. Es una realidad vigente que cada vez más este tipo de soluciones pasarán por la construcción de componentes Web de negocio, etiquetas de autor que extienden el léxico del estándar HTML. Google vehicula esta solución a través del framework Polymer, cuya version 1.0 vio la luz hace pocos meses coincidiendo con la Google I/O 2015.
Pero en esta charla, no nos limitaremos a presentar las novedades de este Framework que pueden leerse directamente en la Web, que también. Hablaremos de los resultados de nuestra investigación en este terreno. Cuáles son los principios de diseño de componentes web, cuál es el modelo adecuado de componentes y cómo debe desarrollarse una arquitectura basada en componentes que cumpla con las necesidades arquetípicas de las soluciones Web y Mobil de hoy en día.
Video: http://goo.gl/acVK2t
Slideshare: http://goo.gl/2OChM4
Github: http://goo.gl/29ldtQ
La Web se está orientando a componentes. El objetivo es alcanzar una Web cada vez más madura, dirigida a fomentar la sencillez en las tareas de diseño y construcción, aumentar la rapidez y agilidad de desarrollo y mejorar la productividad general de las soluciones Web. Todo esto se consigue en parte debido al carácter declarativo que confiere la tecnología de componentes Web que, además, permite encapsular un comportamiento complejo, absorber la gestión adaptativa de los contenidos y, a la postre, generar un vocabulario propio de etiquetas de autor que fomenta la reutilización de código desde el front end.
Sin embargo, la comunidad demanda de manera creciente la definición de directrices y buenas prácticas en relación con las actividades de diseño y desarrollo vinculadas a la construcción de soluciones basadas en componentes Web. En esta charla ofreceremos una colección de principios que tienen por objetivo orientar a los equipos implicados en este tipo de proyectos.
En los últimos tiempos se viene demandando dentro de las comunidades de desarrollo la construcción de arquitecturas reactivas que sean capaces de hacer frente a parámetros de rendimiento y tiempo de respuesta no conocidos hasta el momento. Una arquitectura reactiva es un sistema responsive capaz de reaccionar a tiempo a los requisitos bajo demanda, diseñado para adaptarse elásticamente a sus fluctuaciones variantes, que presenta un comportamiento altamente tolerante a fallos y que se dirige por un procesamiento masivo de mensajes.
Pero más allá de todo esto, las arquitecturas reactivas se han convertido en un modelo de programación basado en transformaciones funcionales para dar soporte a sistemas dirigidos por eventos asíncronamente. En marco del desarrollo de soluciones para Front End, este tipo de aproximaciones está cogiendo tracción debido a lo bien que se adapta al modelo de interacción de la Web. En este contexto, los eventos responden a las interacciones del usuario sobre el agente navegador y la lógica de negocio se expresa como la transformación secuencial y progresiva de los mismos de forma encadenada. A lo largo de esta charla estudiaremos cómo funcionan este tipo de arquitecturas en contraposición con las clásicas soluciones MV* y presentaremos el modelo de desarrollo asociado.
Cada lenguaje, cada tecnología, cada paradigma de programación persigue siempre la reutilización de código. En la comunidad de desarrollo se habla frecuentemente de DRY (Don’t Repeat Yourself) o WORE (Write Once Run Everywhere). Pero estos manidos mantras se quedan frecuentemente en una mera declaración de principios.
El código desarrollado para su reutilización no es capaz de reubicarse en otros contextos arquitectónicos de aquellos para los que fue inicialmente diseñado. Las capacidades de meta-programación de JavaScript le convierten en un lenguaje flexible y lo suficientemente plástico como para adaptarse dinámicamente a cualquier solución construida.
En esta charla exploramos como construir programas que se modifiquen a si mismos para resolver estos problemas y hablaremos de modelos de programación basados en componentes de software.
Arquitectura de Componentes Web. Patrones de Acceso a DatosJavier Vélez Reyes
La mayor parte de los aplicativos que manejamos hoy en día corresponden con arquitecturas centradas en los datos. Modelos de información expuestos en forma de servicios que son explorados en profundidad. En este contexto, las arquitecturas de componentes Web se presentan como una solución idónea para llevar a cabo este proceso exploratorio de manera sencilla y declarativa. A lo largo de esta charla discutiremos este tipo de arquitecturas y presentaremos los patrones de diseño fundamentales que resuelven este tipo de escenarios.
Orientando a Componentes la Web
Charla Desarrollo de sobre Componentes Web en Polymer para HTML5 Spain Madrid 14/07/14
La Web está evolucionando a pasos agigantados en los últimos tiempos. Una de las direcciones de avance en este sentido apunta hacia su modularización. En lugar de construir pesadas aplicaciones monolíticas, parece estar más en sintonía con los principios arquitectónicos de la Web hacer un desarrollo dirigido por la construcción de componentes Web sencillos, atómicos y funcionales que fomenten su reutilización transversal y puedan utilizarse como etiquetas de autor personalizadas para articular soluciones elaboradas. Pero más allá de limitarnos a construir componentes Web y utilizarnos de manera conjunta en una página huesped, la orientación a componentes exige encontrar cierto grado de interoperabilidad entre los mismos para ofrecer una sensación de continuidad en su uso al usuario final.
De acuerdo a esta idea, en esta charla comenzaremos haciendo una revisión de la tecnología utilizada para la construcción de componentes Web según las especificaciones estándar de la W3C y del WWG, haciendo uso de la Plataforma de soporte Polymer de Google como implementación nuclear de referencia. Esto nos dará pie para presentar el problema de cómo puede abordarse la construcción de soluciones Web orientadas a componentes para ofrecer niveles de interoperabilidad adecuados. Ofreceremos, en este sentido, algunas soluciones arquitectónicas al respecto y presentaremos ejemplos de su aplicabilidad práctica en contextos realistas.
La Web está evolucionando a pasos agigantados en los últimos tiempos. Una de las direcciones de avance en este sentido apunta hacia su modularización. En lugar de construir pesadas aplicaciones monolíticas, parece estar más en sintonía con los principios arquitectónicos de la Web hacer un desarrollo dirigido por la construcción de componentes Web sencillos, atómicos y funcionales que fomenten su reutilización transversal y puedan utilizarse como etiquetas de autor personalizadas para articular soluciones elaboradas. Pero más allá de limitarnos a construir componentes Web y utilizarnos de manera conjunta en una página huesped, la orientación a componentes exige encontrar cierto grado de interoperabilidad entre los mismos para ofrecer una sensación de continuidad en su uso al usuario final.
De acuerdo a esta idea, en esta charla comenzaremos haciendo una revisión de la tecnología utilizada para la construcción de componentes Web según las especificaciones estándar de la W3C y del WWG, haciendo uso de la Plataforma de soporte Polymer de Google como implementación nuclear de referencia. Esto nos dará pie para presentar el problema de cómo puede abordarse la construcción de soluciones Web orientadas a componentes para ofrecer niveles de interoperabilidad adecuados. Ofreceremos, en este sentido, algunas soluciones arquitectónicas al respecto y presentaremos ejemplos de su aplicabilidad práctica en contextos realistas.
En esta sencilla y muy resumida presentación, se hace un repaso de las herramientas y arquitecturas a utilizar para publicar información con componente espacial en vía Web.
Geografía como plataforma: API REST vs OGC y Geodatabases - Conferencia Esri ...Esri
Presentación del equipo técnico de Esri España en la pasada conferencia.
Si quieres ver los vídeos y fotos de la conferencia, visita la web:
http://evento.esri.es/es/esri2012/
Se presentó como trabajo de investigación de la asignatura Programación Web de la carrera Ingeniería en Sistemas de la Universidad de Cuenca, realizar un documento en el cual se detallen las métricas y demás aspectos necesarios para poder elaborar un trade-off sobre las diferentes tecnologías web en la actualidad.
El mundo cambia. Los nuevos medios de interacción basados en texto e imagen, las interfaces orales y de realidad aumentada e inmersiva dibuja una nueva forma en la que los usuarios se acercan a los negocios. Como ingenieros debemos orientar a los clientes en este cambio. Nuestra labor como arquitectos es prepararnos tecnológicamente. En esta charla discutimos cómo podemos enfrentar este cambio y cómo debemos reorientar el diseño de nuestras arquitecturas para hacer frente a este nuevo paradigma de uso. Si quieres aprender a hacer el software del futuro esta es la charla que no te debes perder
En los últimos años se ha hablado mucho de los estilos arquitectónicos en boga para desarrollar las soluciones orientadas a servicios. Sin embargo, cuando diseñamos servicios caemos siempre en los mismos esquemas y los repetimos de proyecto a proyecto sin ponernos en cuestión su validez para cada problema en cuestión.
En esta charla haremos un recorrido de los fundamentales modelos de diseño de APIs de servicios que pueden desarrollarse para cada tipo de problema. Además ofreceremos técnicas y patrones de diseño aplicables para cada uno de estos modelos.
Tradicionalmente, los modelos de componentes utilizados en el mundo de front se utilizan como un mecanismo de modularidad para descomponer una solución. De forma más ambiciosa, se construyen sistemas de diseño basados en componentes en aras a aumentar la reutilización entre proyectos y mejorar la productividad en los desarrollos.
Sin embargo, para que la reutilización se convierta en una realidad constatable necesitamos cambiar nuestra aproximación al problema. Más que crear arquitecturas polimórficas que acepten distintos tipos de componentes. Necesitamos crear componentes que sean capaces de adaptarse plásticamente y de forma dinámica a cada contexto arquitectónico de uso.
En esta charla presentaremos una colección de técnicas y modelos de adaptación que pueden ser aplicados sobre nuestros sistemas de componentes con independencia del stack tecnológico en que estén implementados: Vue, React, Polymer, etc. Si perteneces al mundo del front y te gusta ver código esta charla te interesará.
La Web está cambiado. Es una realidad. En poco más de 20 años, esta plataforma ha evolucionado sus pragmáticas de uso impactando también el modelo cultural de nuestra sociedad. Primero fue un espacio virtual de recursos estáticos. Hoy un gran entramado de relaciones sociales donde se confunde lo virtual y lo real. ¿Internet es un reflejo de lo que somos o más bien nos hemos adaptado a como es Internet hoy en día por diseño?
Pero un nuevo cambio se vislumbra en el futuro inmediato. La Web no será una herramienta más a nuestro alcance para disfrute discrecional. Empezamos a vivir en una burbuja digital donde la Web llega a nosotros y nosotros la gestionamos de forma micro-interactiva y reactiva.
La pregunta que debemos hacernos en este nuevo escenario es, ¿Que papel jugamos como desarrolladores, diseñadores, especialista UX y personal técnico en esta nueva Web? ¿Cual es mi espacio de acción y mi responsabilidad? En esta charlase ofrece un decálogo de cambios para los que debemos prepararnos que ayudarán a responder a esta pregunta.
Esta charla es la Key Note del Keep Coding Connect 2017. Un evento para desarrolladores organizadas por una de las compañías referentes en formación técnica en este país.
NodeJS es una plataforma que permite programar servidores dedicados en Javascript de forma sencilla y eficaz. Pese a que Javascript no es un lenguaje con soporte a la concurrencia, el carácter no bloqueante de las operaciones que realizan accesos de entrada salida E/S permite avanzar los flujos de ejecución aumentando la productividad y la escalabilidad del sistema total. En efecto, los tiempos de espera en cada operación motivados por los accesos a disco son aprovechados para procesar nuevas peticiones entrantes en el servidor. Pese a sus innegables ventajas en productividad, el modelo de programación se complica. Dado que ahora las operaciones se liberan del flujo de control para retomarse posteriormente, ¿cómo podemos determinar cuándo una operación ha terminado? ¿Cómo podemos recuperar sus resultados? ¿Cómo gestionamos sus errores potenciales? A lo largo de este texto presentaremos diferentes modelos de programación que pueden ser empleado para dar respuesta a estas y otras preguntas en el marco de la programación asíncrona.
Escaneo y eliminación de malware en el equiponicromante2000
El malware tiene muchas caras, y es que los programas maliciosos se reproducen en los ordenadores de diferentes formas. Ya se trate de virus, de programas espía o de troyanos, la presencia de software malicioso en los sistemas informáticos siempre debería evitarse. Aquí te muestro como trabaja un anti malware a la hora de analizar tu equipo
Si bien los hospitales conjuntan a profesionales de salud que atienden a la población, existe un equipo de organización, coordinación y administración que permite que los cuidados clínicos se otorguen de manera constante y sin obstáculos.
Mario García Baltazar, director del área de Tecnología (TI) del Hospital Victoria La Salle, relató la manera en la que el departamento que él lidera, apoyado en Cirrus y Estela, brinda servicio a los clientes internos de la institución e impulsa una experiencia positiva en el paciente.
Conoce el Hospital Victoria La Salle
Ubicado en Ciudad Victoria, Tamaulipas, México
Inició operaciones en el 2016
Forma parte del Consorcio Mexicanos de Hospitales
Hospital de segundo nivel
21 habitaciones para estancia
31 camas censables
13 camillas
2 quirófanos
+174 integrantes en su plantilla
+120 equipos médicos de alta tecnología
+900 pacientes atendidos
Servicios de +20 especialidades
Módulos utilizados de Cirrus
HIS
EHR
ERP
Estela - Business Intelligence
1. Javier
Vélez
Reyes
@javiervelezreye
Javier.velez.reyes@gmail.com
Metaprogramación
Composi1va
En
JavaScript
Programación
Orientada
a
Componentes
Mayo
2015
JS
DAY
9
MAYO
2015
MADRID
2. @javiervelezreye
2
Autor
Metaprogramación
ComposiAva
En
JavaScript
Licenciado
en
informá<ca
por
la
UPM
desde
el
año
2001
y
doctor
en
informá<ca
por
la
UNED
desde
el
año
2009,
Javier
es
inves<gador
y
su
línea
de
trabajo
actual
se
centra
en
la
innovación
y
desarrollo
de
tecnologías
de
Componentes
Web.
Además
realiza
ac<vidades
de
evangelización
y
divulgación
en
diversas
comunidades
IT,
es
Polymer
Polytechnic
Speaker
y
co-‐organizador
del
grupo
Polymer
Spain
que
conforma
una
comunidad
de
interés
de
ámbito
nacional
en
relación
al
framework
Polymer
y
a
las
tecnologías
de
Componentes
Web.
I.
¿Quién
Soy?
II.
¿A
Qué
Me
Dedico?
javier.velez.reyes@gmail.com
@javiervelezreye
linkedin.com/in/javiervelezreyes
gplus.to/javiervelezreyes
jvelez77
javiervelezreyes
youtube.com/user/javiervelezreyes
Polymer
Polytechnic
Speaker
Co-‐organizador
de
Polymer
Spain
Evangelización
Web
Desarrollador
JS
Full
stack
Arquitectura
Web
Formación
&
Consultoría
IT
e-‐learning
3. Javier
Vélez
Reyes
@javiervelezreye
Javier.velez.reyes@gmail.com
1
Introducción
§ Qué
Es
La
Metaprogramación
§ Por
Qué
La
Metaprogramación
§ El
Proceso
De
La
Metaprogramación
§ La
Metaprogramación
Como
Paradigma
Introducción
Metaprogramación
Composi1va
En
JavaScript
4. @javiervelezreye
4
Introducción
Metaprogramación
ComposiAva
En
JavaScript
Qué
Es
La
Metaprogramación
La
metaprogramación
es
una
disciplina
de
programación
que
consiste
en
construir
programas
que
generan,
manipulan
o
modifican
otros
programas,
incluidos
ellos
mismos.
Definición
El
programa
toma
unos
datos
de
entrada
y
produce
unos
resultados
de
salida
de
acuerdo
a
un
proceso
de
transformación
f
[1, 2, 3,
4, 5]
[1, 4, 9,
16, 25]
Datos
Resultados
Programa
Programa
mf
function (x, y) {
return y > x;
}
function (x) {
function (y) {
return y > x;
}
}
Programación
Metaprogramación
El
metaprograma
toma
unos
datos
de
entrada
que
representan
un
programa
y
valores
de
configura-‐
ción
para
dirigir
el
proceso
de
construcción
de
otro
programa
5. @javiervelezreye
5
Introducción
Metaprogramación
ComposiAva
En
JavaScript
Qué
Es
La
Metaprogramación
En
términos
generales
se
puede
pensar
en
dos
grandes
familias
de
técnicas
de
metaprogramación.
La
programación
genera<va
y
la
programación
composi<va.
Tipos
De
Metaprogramación
La
programación
genera<va
confecciona
código
nuevo
a
par<r
de
datos
de
configuración
y
elementos
de
programas
Transformaciones
Léxicas
mf
Programación
GeneraAva
Transformaciones
SintácAcas
Transformaciones
SemánAcas
T.
Léxica
Código
de
entrada
planBllas
Código
de
salida
T.
SintácBca
Código
de
entrada
AST
Código
de
salida
T.
SemánBca
Código
de
entrada
mf
Código
de
salida
Código
original
6. @javiervelezreye
6
Introducción
Metaprogramación
ComposiAva
En
JavaScript
Qué
Es
La
Metaprogramación
En
términos
generales
se
puede
pensar
en
dos
grandes
familias
de
técnicas
de
metaprogramación.
La
programación
genera<va
y
la
programación
composi<va.
Tipos
De
Metaprogramación
La
programación
composi<va
elabora
nuevos
programas
preservando
la
estructura
original
del
programa
de
entrada
Programación
ComposiAva
Programación
ComposiBva
Se
seleccionan
los
componentes
adecuados
para
hacer
la
acBvidad
de
metaprogramación
deseada
mf
Los
componentes
se
conectan
entre
sí
para
formar
una
nueva
estructura
composiBva
7. @javiervelezreye
7
Introducción
Metaprogramación
ComposiAva
En
JavaScript
Qué
Es
La
Metaprogramación
Metaprogramación
vs
Programación
Orientada
a
Objetos
En
la
programación
orientada
a
objetos
la
variabilidad
entre
artefactos
debe
ser
absorbida
por
la
arquitectura
en
forma
de
puntos
de
extensión
polimórfica
Programación
O.
Objetos
La
diferencia
esencial
entre
la
programación
orientada
a
objetos
clásica
y
la
metaprogramación
radica
en
la
forma
en
que
<enen
ambas
aproximaciones
de
hacer
frente
a
los
problemas
de
alineamiento
arquitectónico.
En
la
metaprogramación
los
componentes
son
los
responsables
de
adaptarse
a
cada
contexto
arquitectónico
de
aplicación
por
medio
de
una
transformación
adapta<va
Metaprogramación
Base
A
B
C
Cliente
usa
Arquitectura
A
Arquitectura
B
8. @javiervelezreye
8
Introducción
Metaprogramación
ComposiAva
En
JavaScript
Por
Qué
La
Metaprogramación
En
términos
generales,
podemos
resumir
en
cuatro
los
obje<vos
principales
de
la
metaprogramación.
Automa<zación,
reu<lización,
mantenibilidad
y
extensibilidad.
Todos
ellos
promueven,
en
mayor
o
menor
medida,
evidentes
mejoras
en
relación
a
aproximaciones
de
menor
flexibilidad.
AutomaAzación,
ReuAlización,
Mantenibilidad
&
Extensibilidad
Automa1zación
Reu1lización
Extensibilidad
Mantenibilidad
El
uso
de
componentes
permite
una
adecuada
especialización
de
responsabilidades
que
fomenta
la
mantenibilidad
por
susBtución
de
partes
La
automaBzación
persigue
la
idea
de
construir
soQware
a
través
de
procesos
de
confección
que
minimizan
los
esfuerzos
de
desarrollo
El
carácter
adaptaBvo
o
generaBvo
de
los
componentes
les
confiere
una
mayor
capacidad
evoluBva
lo
que
facilita
la
extensibilidad
global
del
sistema
La
plasBcidad
contractual
de
los
componentes
se
regenera
o
adapta
para
permiBr
que
estos
encajen
fácilmente
en
diversos
contextos
de
explotación
arquitectónica
9. @javiervelezreye
9
Introducción
Metaprogramación
ComposiAva
En
JavaScript
El
Proceso
De
La
Metaprogramación
El
proceso
de
construcción
por
metaprogramación
de
un
compo-‐
nente
atraviesa
un
conjunto
de
fases
conceptuales
con
propósitos
diferenciales
y
caracterís<cos.
Ciclo
De
Elaboración
Nivel
de
dominio
Nivel
de
proyecto
Descomposición
diseñada
Selección
Adaptación
Composición
Encapsulación
Componentes
Componente
C.
Adaptado
Colaboración
C.
Encapsulado
C.
Contextualizado
Contextualización
Abstracción
Análisis
10. @javiervelezreye
10
Introducción
Metaprogramación
ComposiAva
En
JavaScript
El
Proceso
De
La
Metaprogramación
La
selección
consiste
en
determinar
las
variantes
específicas
de
cada
<po
de
componente
que
formarán
parte
del
proceso
construc<vo.
La
selección
está<ca
es
aquella
que
se
realiza
enteramente
antes
del
<empo
de
ejecución.
Por
el
contrario,
la
selección
dinámica
implica
que
el
metaprograma
inyecta
lógica
de
negocio
para
ar<cular
la
selección
en
<empo
de
ejecución
pudiendo
hacer
ésta
dinámicamente
cambiante.
Selección
Selección
Selección
Está1ca
La
selección
estáBca
se
resuelve
antes
del
Bempo
de
ejecución
de
manera
que
las
variantes
seleccionadas
quedan
definiBva-‐
mente
fijadas
Selección
Dinámica
La
ventaja
de
la
selección
dinámica
es
que
permite
dar
soporte
a
escenarios
donde
las
variantes
uBlizadas
pueden
cambiar
durante
el
Bempo
de
ejecución
11. @javiervelezreye
11
Introducción
Metaprogramación
ComposiAva
En
JavaScript
El
Proceso
De
La
Metaprogramación
La
adaptación
es
el
proceso
mediante
el
cual
un
componente
se
adapta
para
resolver
las
impedancias
que
presenta
con
el
contexto
arquitectónico
de
explotación.
La
adaptación
sintác<ca
se
centra
en
adaptar
el
contrato
del
componente
mientras
que
la
adaptación
semán<ca
persigue
modificar
el
comportamiento
del
artefacto
a
los
requerimientos
del
proyecto.
Tanto
estandarizar
los
componentes
como
trabajar
con
componentes
proto<po
evita
frecuentemente
la
adaptación.
Adaptación
Adaptación
sintác1ca
&
semán1ca
Un
ejemplo
de
adaptación
sintácBca
consiste
en
cambiar
los
nombres
de
los
métodos
de
un
componente.
La
decoración
por
aspectos
del
comportamiento
de
un
método
es
un
ejemplo
de
adaptación
semánBca
Estandarización
&
Proto1pos
La
estandarización
de
contratos
y
comporta-‐
mientos
evita
la
adaptación.
Asimismo
cuando
los
componentes
son
directamente
operaBvos
se
posibilita
la
ausencia
ocasional
de
adaptación
Proyecto
A
Proyecto
B
Proyecto
C
Adaptación
12. @javiervelezreye
12
Introducción
Metaprogramación
ComposiAva
En
JavaScript
El
Proceso
De
La
Metaprogramación
La
composición
es
un
ejercicio
de
transformación
en
el
que
un
componente
al
que
llamaremos
núcleo
se
enriquece
por
la
adquisición
de
cierta
lógica
parcial
que
reside
en
otro
u
otros
componentes
llamados
extensiones.
En
el
marco
de
esta
relación
binaria
es
posible
analizar
el
grado
de
dependencia
que
<enen
cada
una
de
estas
partes
entre
sí
para
caracterizar
el
<po
de
composición.
Composición
Composición
Núcleo
Dependiente
Autónomo
Dependiente
Autónomo
Extensión
Composición
CooperaBva
Composición
Subordinada
Composición
Subordinante
Composición
Autónoma
Proyecto
A
13. @javiervelezreye
13
Introducción
Metaprogramación
ComposiAva
En
JavaScript
El
Proceso
De
La
Metaprogramación
La
encapsulación
es
un
proceso
mediante
el
cual
se
establecen
nuevas
fronteras
arquitectónicas
en
el
marco
de
una
composición
que
<enen
por
obje<vo
aislar
la
misma
del
contexto
de
explotación.
Este
aislamiento
permite
la
protección
de
la
información.
Por
extensión
consideraremos
que
todo
mecanismo
que
garan<ce
esta
protección
es
una
forma
débil
de
encapsulación.
Encapsulación
Encapsulación
Proyecto
B
Proyecto
A
Encapsulación
Fuerte
La
encapsulación
fuerte
es
el
proceso
mediante
el
cual
se
levantan
unas
fronteras
arquitectónicas
nuevas
en
el
marco
de
una
relación
composiBva
Encapsulación
Débil
Por
extensión,
consideraremos
que
cualquier
mecanismo
que
proporcione
protección
de
información
en
el
marco
de
la
composición
es
una
forma
de
encapsulación
débil
14. @javiervelezreye
14
Introducción
Metaprogramación
ComposiAva
En
JavaScript
El
Proceso
De
La
Metaprogramación
La
contextualización
es
la
fase
úl<ma
del
proceso
composi<vo
mediante
la
cual
se
dota
al
componente
de
unas
condiciones
ambientales
de
contexto
que
condicionarán
su
comportamiento
durante
el
<empo
de
ejecución.
Cuando
estas
condiciones
ambientales
se
fijan
antes
del
<empo
de
ejecución
hablamos
de
contextualización
está<ca.
La
variante
dinámica
permite
ar<cular
recontextualizaciones
en
<empo
de
ejecución.
Contextualización
Contextualización
Contextualización
Está1ca
La
contextualización
estáBca
resuelve
las
condiciones
ambientales
de
contexto
antes
de
que
el
componente
entre
en
el
Bempo
de
ejecución.
Contextualización
Dinámica
La
contextualización
dinámica
permite
restablecer
recurrentemente
el
contexto
de
ejecución
lo
que
ofrece
mayores
oportu-‐
nidades
de
adaptación
Estado
Lógica
A
B
C
15. @javiervelezreye
15
Introducción
Metaprogramación
ComposiAva
En
JavaScript
La
Metaprogramación
Como
Paradigma
En
relación
al
concepto
de
componente
se
pueden
describir
tres
ejes
dimensionales.
Los
obje<vos
determinan
los
propósitos
perseguidos,
los
mecanismos
caracterizan
las
capacidades
na<vas
del
lenguaje
y
los
principios
de
diseño
ofrecen
directrices
generales
de
actuación.
Ejes
Dimensionales
Principios
Mecanismos
C
Auto
Reut
Ctx
Ref
Ext
Sust Her
Man
Int
Del
Ext
Adap
ObjeAvos
Pol
Los
objeBvos
responden
a
qué
nuevas
caracterísBcas
estruc-‐
turales
y
funcionales
persigue
el
paradigma
¿Que?
Los
principios
ofrecen
directrices
acerca
de
cómo
proceder
para
aplicar
adecuadamente
los
mecanismos
del
lenguaje
¿Cómo?
Los
mecanismos
son
las
capacidades
del
lenguaje
que
permiten
alcanzar
los
objeBvos
perseguidos
¿Con
qué?
16. @javiervelezreye
16
Introducción
Metaprogramación
ComposiAva
En
JavaScript
La
Metaprogramación
Como
Paradigma
En
torno
a
los
tres
ejes
dimensionales
se
pueden
establecer
sendos
planos
de
ac<vidad.
Las
técnicas
indican
cómo
aplicar
los
mecanismos
del
lenguaje,
los
patrones
presentan
soluciones
a
problemas
recurrentes
y
los
modelos
arquitectónicos
ofrecen
restricciones
que
determinan
como
proceder.
Planos
De
AcAvidad
Principios
Mecanismos
C
Auto
Reut
Ctx
Ref
Ext
Sust Her
Man
Int
Del
Ext
Adap
N
o
s
e
p
u
e
Programadores
N
o
s
e
p
Diseñadores
N
o
s
e
p
Arquitectos
Plano
Tecnológico
ObjeAvos
Patrones
de
Diseño
Pol
Los
modelos
y
restricciones
arquitectónicas
proporcionan
directrices
generales
que
determinan
cómo
construir
soluciones
soQware
basadas
en
metaprogramación
Modelos
&
Restricciones
El
diseño
define
formas
canónicas
de
aplicar
los
mecanismos
del
lenguaje
para
problemas
recurrentes
Patrones
de
Diseño
Las
técnicas
indican
cómo
aplicar
los
mecanismos
del
lenguaje
en
el
proceso
de
metaprogramación
para
alcanzar
los
objeBvos
Técnicas
17. Javier
Vélez
Reyes
@javiervelezreye
Javier.velez.reyes@gmail.com
2
JavaScript como
Lenguaje De
Metaprogramación
§ Introducción
§ Capacidades
de
JavaScript
En
El
Modelo
de
Objetos
§ Capacidades
de
JavaScript
En
El
Modelo
Funcional
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
Composi1va
En
JavaScript
18. @javiervelezreye
18
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Introducción
JavaScript
es
un
lenguaje
que
permite
ar<cular
técnicas
de
composición
dinámica
donde
la
fase
de
composición
y
ejecución
coexisten
durante
el
<empo
de
producción
de
la
solución
soaware.
Esto
permite
que
los
componentes
de
adapten
recurrentemente
a
las
condiciones
ambientales
cambiantes
de
ejecución.
Composición
Dinámica
Fase
de
Composición
mf
mf
Fase
de
Ejecución
En
ejecución,
los
cambios
en
las
condiciones
ambientales
provocan
transformaciones
en
los
componentes
para
adaptarse
a
las
mismas
Durante
la
fase
de
composición
se
construyen
por
técnicas
composiBvas
los
componentes
que
formarán
parte
del
programa
19. @javiervelezreye
19
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Introducción
El
modelo
de
componentes
en
JavaScript
es
dual
y
combinado.
Es
posible
operar
dentro
del
espacio
de
objetos
o
con
las
álgebras
funcionales.
De
hecho
todo
objeto
da
acceso
a
los
métodos
miembros
que
potencialmente
incluye
y
toda
función
es
candidata
a
explotar
o
retornar
como
respuesta
una
estructura
de
datos
basada
en
objetos.
Modelo
De
Componente
en
JavaScript
JavaScript
Modelo
de
Objetos
Modelo
Funcional
Delegación
Herencia
Polimorfismo
Ligadura
Dinámica
Orden
Superior
Clausuras
Evaluación
Parcial
var position = {
x: 1,
y: 1,
step: function (i, j){
return Position (this.x+i, this.y+j)
}
};
Modelo
de
objetos
Modelo
de
Funciones
var Position = function (x, y) {
return {
x: x,
y: y,
step: function (i, j){
return Position (this.x+i, this.y+j)
}
};
}
El
modelo
de
funciones
permite
generar
nuevos
objetos
como
resultado
de
su
ejecución
El
modelo
de
objetos
conBene
métodos
miembro
cuyas
funciones
manejadoras
operan
en
el
espacio
funcional
20. @javiervelezreye
20
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
De
Objetos
Los
objetos
son
uno
de
los
dos
ciudadanos
de
primera
categoría
dentro
de
este
modelo.
En
JavaScript
un
objeto
es
un
mero
agregador
de
propiedades
organizado
como
un
diccionario
cuyos
valores
pueden
ser
<pos
primi<vos
o
funciones
que
ejecutan
en
el
contexto
del
objeto.
Los
Objetos
En
La
Composición
Objetos
Abiertos
var o = {
};
var o = {
x : 1,
y : 1,
z : 1
};
var o = {
x : 1,
y : 1
};
o.x = 1;
o.y = 1;
o.z = 1;
delete o.z
Podemos
ampliar
y
reducir
la
carga
semánBca
del
objeto
a
través
de
operaciones
de
modificación
sobre
el
mismo
El
objeto
en
JavaScript
es
un
mero
agregador
de
caracterísBcas
funcionales
y
de
estado
pero
no
consBtuye
un
clasificador
estricto
Objetos
como
agregadores
Objetos
abiertos
o
{
p1: v1,
...
pn: vn,
m1: function (){},
...
mn: function (){}
}
21. @javiervelezreye
21
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
De
Objetos
Por
medio
de
la
delegación
se
ar<culan
esquemas
de
colaboración
entre
objetos
de
manera
que
los
algoritmos
se
distribuyen
entre
el
ecosistema
de
objetos
par<cipantes.
Esto
permite
ar<cular
una
adecuada
división
de
responsabilidades
en
las
fases
preliminares
de
diseño.
La
Delegación
En
La
Composición
Dynamic
Binding
var a = {
d: b,
m: function (){
d.n();
}
};
var b = {
n: function (){
...
}
}
b.n = function () {
...
};
El
enlace
dinámico
permite
resolver
la
localización
del
método
llamado
justo
antes
de
la
invocación
lo
que
se
alinea
con
el
modelo
de
objetos
abiertos
var b = {
};
Enlace
dinámico
b
{
n: function (){
...;
}
}
El
esquema
de
delegación
impone
una
parte
estáBca,
que
determina
el
nombre
del
método
a
invocar
y
otra
dinámica
que
informa
del
objeto
donde
reside
dicho
método
a
{
d: B,
m: function (){
d.n();
}
}
Delegación
22. @javiervelezreye
22
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
De
Objetos
Otra
relación
de
delegación
implícita
entre
objetos
se
marca
por
medio
de
la
cadena
de
proto<pado.
Todo
objeto
se
vincula
a
un
proto<po
en
el
que
delega
la
búsqueda
de
una
propiedad
cuando
ésta
no
se
encuentra
en
el
propio
objeto.
Las
clases
son
proto<pos
de
objetos
con
lo
que
este
concepto
se
convierte
en
un
rol.
La
Herencia
En
La
Composición
Dado
que
las
clases
se
representan
como
objetos
protoBpo,
las
propiedades
anteriores
se
aplican
a
la
relación
de
herencia
Proto1pos
En
JavaScript
la
herencia
es
un
Bpo
especial
de
delegación.
Dado
que
las
clases
se
representan
como
protoBpos
los
conceptos
de
clase
y
objeto
son
meros
roles
en
torno
a
la
relación
de
herencia
Herencia
o
{
n: function (){
this.m();
}
}
p
[[prototype]]
{
m: function (){
...
}
}
La
herencia
es
una
forma
de
delegación
fuerte
a
través
de
la
cadena
de
protoBpado.
Debido
al
carácter
abierto
de
los
protoBpos
es
la
forma
más
dinámica
de
delegación
Heredar
es
Delegar
var p = {
m: function (){
...
}
}
p.m = function () {
...
};
var p = {
};var o = Object.create(p);
o.n = function (){
this.m();
};
ProtoApos
como
Clases
23. @javiervelezreye
23
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
De
Objetos
A
diferencia
de
otros
lenguajes
donde
el
polimorfismo
se
soporta
sobre
el
sistema
de
<pos,
en
JavaScript
el
polimorfismo
sólo
puede
interpretarse
en
términos
de
la
conformidad
a
un
contrato
establecido
por
convenio.
Esta
conformidad
puede
ser
total
o
parcial.
El
Polimorfismo
En
La
Composición
Duck
Typing
Para
garanBzar
que
o
es
compaBble
con
el
protocolo
de
c,
se
debe
imponer
la
existencia
de
un
método
m
en
o.
La
metaprogramación
puede
transformar
o
en
este
senBdo
Duck
Typing
Los
objetos
a
y
b
resultan
conformes
a
un
contrato
definido
por
la
existencia
del
método
m.
Esto
es
una
forma
de
polimorfismo
débil
que
no
está
arBculada
a
través
de
herencia
ni
de
definición
de
interfaces
como
en
la
OOP
clásica
Conformidad
Contractual
b
{
m: function () {},
y: function () {}
}
var o = {
};
c.m(o);
var c = {
m: function (o){
o.m();
}
};
var o = {
m: function () {}
};
c.m(o);
a
{
m: function () {},
x: function () {}
}
o.m = function () {
...
};
24. @javiervelezreye
24
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
De
Objetos
A
través
del
polimorfismo
débil
que
ofrece
JavaScript
es
posible
alcanzar
cotas
de
expresividad
de
mayor
abstracción.
Esto
es
una
propiedad
muy
conveniente
para
la
definición
de
metaprogramas
que
deben
operar
en
términos
de
alta
generalidad.
El
siguiente
ejemplo
muestra
un
esquema
que
opera
a
nivel
abstracto.
La
Abstracción
En
La
Composición
Abstracción
Los
algoritmos
se
pueden
expresar
en
términos
abstractos
asumiendo
que
cada
objeto
parBcipante
incluirá
una
versión
polimórfica
de
los
métodos
implicados
Abstracción
Los
objetos
a
y
b
resultan
conformes
a
un
contrato
que
incluye
los
métodos
m
y
n.
El
objeto
c
es
un
artefacto
con
conformidad
parcial
a
dicho
contrato
que
sin
embargo
no
puede
usarse
en
aquellos
protocolos
donde
se
requiera
m
Conformidad
Parcial
a
{
m: function () {},
n: function () {}
}
os[2].m = function () {
...
};
var os = [a, b, c];
app.all (os);
var app = {
all: function (os){
for (o in os)
o.m();
}
};
var os = [a, b, c];
app.all (os);
b
{
m: function () {},
n: function () {}
}
c
{
m: function () {},
}
25. @javiervelezreye
25
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
De
Objetos
Los
métodos
del
modelo
de
objetos
se
diferencian
de
las
funciones
en
el
uso
de
un
parámetro
implícito
–
this
–
que
referencia
al
contexto
donde
dicho
método
debe
ejecutarse.
Dicho
contexto
puede
ser
alterado
por
diversos
mecanismos
explícitos
o
implícitos
del
lenguaje.
La
Contextualización
En
La
Composición
Puntero
Implícito
this
Las
capacidades
de
recontextualización
que
ofrece
JavaScript
permiten
arBcular
diversos
esquemas
de
conexión
composiBva
que
condicionan
la
variante
funcional
que
se
va
a
invocar
en
cada
caso
Recontextualización
bind
permite
especificar
que
el
método
m
debe
ejecutarse
en
el
contexto
del
objeto
b.
Esto
Bene
repercusiones
acerca
de
a
quien
afecta
el
código
dentro
de
m
y
permite
arBcular
composiciones
interesantes
Contextualización
a
{
m: function () {
return this.n();
}.bind (b)
}
b
{
n: function () {}
}
var o = {
m: function () {...},
n: function (){
this.m();
}
};
var m = function () {...};
var o = {
n: function (){
(function () {
this.m();
})();
}
};
var o1 = {
n: function (){
this.m();
}.bind(o2)
};
var o2 = {
m: function () {...}
};
26. @javiervelezreye
26
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
De
Objetos
La
mayoría
de
los
metaprogramas
hacen
uno
de
las
capacidades
reflexivas
del
lenguaje.
Una
arquitectura
reflexiva
es
aquella
que
ofrece
al
programador
ciertos
metadatos
para
permi<rle
descubrir
las
caracterís<cas
de
los
elementos
del
entorno
de
ejecución.
A
con<nuación
resumimos
las
capacidades
esenciales
de
reflexión
en
JavaScript
sobre
el
modelo
de
objetos.
La
Reflexión
En
La
Composición
A
B
{
p1: v1,
...
pn: vn,
m1: function (){},
...
mn: function (){}
}
Object.keys (o),
Object.getOwnPropertyNames (o),
Object.freeze (o)
Object.seal (o)
Object.preventExtensions (o)
Object.isFrozen (o)
Object.isSeal (o)
Object.isExtensible (o)
Reflexividad
a
Nivel
de
Objeto
Object.defineProperty (o, p, {})
Object.defineProperties (o, {})
Object.getOwnPropertyDescriptor (o, p)
o.hasOwnProperty (p)
o.propertyIsEnumerable (p)
Reflexividad
a
Nivel
de
Propiedad
Object.getPrototypeOf (o)
o1.isPrototypeOf (o2)
o.prototype
o.constructor
o.__proto__
Reflexividad
a
Nivel
de
Proto1po
27. @javiervelezreye
27
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
Funcional
Los
lenguajes
que
permiten
recibir
como
parámetros
de
una
función
otra
función
se
dice
que
operan
en
orden
superior.
Este
es
el
caso
de
JavaScript
y
gracias
a
ello
se
pueden
definir
metaprogramas
que
transforman
a
otras
funciones
genéricas
pasadas
como
parámetro.
El
Orden
Superior
En
La
Composición
fn
gn
mf
in
out
El
metaprograma
mf
recibe
como
parámetro
una
función
cualquiera
fn
y
la
transforma
en
otra
función
gn
con
la
misma
esencia
que
la
entrada
Funciones
paramétricas
El
orden
superior
permite
definir
esquemas
algorítmicos
agnósBcos
de
la
lógica
interna
de
la
función
genérica
que
se
recibe
como
parámetro
Orden
Superior
Orden
Superior
function maybe (fn) {
return function () {
var args = [].slice.call(arguments);
var callable = arguments.length >= fn.length &&
args.every(function (p) {
return (p !== null);
});
if (callable) return fn.apply(this, args);
};
}
28. @javiervelezreye
28
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
Funcional
JavaScript
ofrece
dos
métodos
equivalentes
para
invocar
dinámicamente
a
una
función
como
parte
de
un
algoritmo
de
metaprogramación.
Esto
es
especialmente
potente
si
la
función
es
pasada
como
parámetro
como
un
ejercicio
de
orden
superior.
La
Invocación
Dinámica
En
La
Composición
fn
gn
mf
in
out
La
función
recibida
como
parámetro
en
mf
es
invocada
dinámicamente
a
través
de
los
métodos
call
o
apply
para
definir
el
metaprograma
Invocación
mediante
call
o
apply
La
invocación
dinámica
permite
inyectar
en
esquemas
de
transformación
la
lógica
pasada
como
parámetro
Invocación
Dinámica
Invocación
Dinámica
fn.call
fn.apply
function provided (pn) {
return function (fn) {
return function () {
if (pn.apply(this, arguments))
return fn.apply(this, arguments);
};
};
}
29. @javiervelezreye
29
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
Funcional
En
JavaScript
es
posible
retornar
una
función
como
resultado
de
otra
función.
Esto
permite
a
los
metaprogramas
definir
esquemas
de
transformación
que
evalúen
parte
de
los
parámetros
formales
de
una
función
de
entrada
y
generen
una
función
a
la
salida
con
el
resto
de
parámetros
pendientes
de
evaluar.
La
Evaluación
Parcial
En
La
Composición
fn
mf
in
out
La
función
recibida
como
parámetro
en
mf
transforma
la
función
de
entrada
fn
de
3
parámetros
para
generar
otra
función
a
la
salida
donde
cada
parámetro
se
evalúa
en
fases
consecuBvas
de
invocación.
A
este
proceso
se
le
llama
currificación
Evaluación
por
fases
La
evaluación
parcial
permite
definir
esquemas
donde
la
evaluación
de
parámetros
se
distribuye
entre
el
proveedor
y
el
cliente
de
manera
que
este
úlBmo
dispone
de
menos
grados
de
liberad
para
operar
y
lo
hace
sobre
un
esquema
de
configuración
establecido
por
el
proveedor
Evaluación
Parcial
Evaluación
Parcial
Evaluación
parcial
fn1
fn2
fn3
Proveedor
Cliente
function first () {
var fn = arguments [0];
var params = [].slice.call(arguments, 1);
return function () {
var args = [].slice.call(arguments);
return fn.apply(this, params.concat(args));
};
}
30. @javiervelezreye
30
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
Funcional
De
forma
similar,
los
métodos
call
y
apply
también
permiten
intervenir
discrecionalmente
en
el
valor
que
se
proporcionará
a
las
funciones
invocadas
dinámicamente
así
como
el
contexto
this
en
el
que
dicha
invocación
debe
evaluarse.
La
Intervención
Paramétrica
En
La
Composición
fn
gn
mf
in
out
El
metaprograma
mf
Bene
la
oportunidad
de
cambiar
o
alterar
los
parámetros
actuales
que
recibirá
la
función
invocada
fn
Los
parámetros
en
fn
se
alteran
La
invocación
dinámica
permite
además
recontextualizar
la
evaluación
de
una
función
alterando
el
valor
de
this,
que
en
otros
lenguajes
se
considera
un
puntero
constante.
Este
es
un
ejemplo
de
conexión
entre
el
modelo
de
objetos
y
el
funcional
Intervención
Paramétrica
Intervención
Paramétrica
Alteración
paramétrica
function arity (n) {
return function (fn) {
return function () {
var args = [].slice.call(arguments, 0, n-1);
return fn.apply(this, args);
};
};
}
31. @javiervelezreye
31
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
Funcional
Cada
función
retornada
por
un
metaprograma
man<ene
por
construcción
referencia
al
ámbito
léxico
donde
se
define.
Esto
permite
a
los
metaprogramas
condicionar
la
evaluación
de
una
función
sobre
un
espacio
de
variables
retenidas
en
dicho
ámbito
léxico.
La
Retención
Léxica
En
La
Composición
fn
mf
in
out
El
metaprograma
mf
genera
un
esquema
algorítmico
que
incluye
a
fn
donde
las
variables
libres,
que
no
son
parámetros
formales
ni
variables
locales
de
fn,
se
evalúan
en
el
contexto
léxico
definido
dentro
de
mf
Dis1ntos
entornos
de
retención
La
retención
léxica
ofrece
la
oportunidad
al
metaprograma
de
caracterizar
esquemas
de
comportamiento
funcional
que
dependan
de
los
valores
configurados
en
las
variables
retenidas
Retención
Léxica
Retención
Léxica
Retención
Léxica
fn'
var
x
=
1
var
y
=
3
function arity (db) {
return function () {
return {
load: function (id) { return db.find (id); },
save: function (id, o) { db.save (id, o); }
};
};
}
32. @javiervelezreye
32
JavaScript
Como
Lenguaje
De
Metaprogramación
Metaprogramación
ComposiAva
En
JavaScript
Capacidades
De
JavaScript
En
El
Modelo
Funcional
De
manera
similar
a
como
estudiábamos
en
el
modelo
de
objetos,
el
espacio
de
funciones
de
JavaScript
también
proporciona
una
considerablemente
rica
arquitectura
reflexiva
que
permite
conocer
ciertas
propiedades
y
metadatos
de
los
objetos
función.
Esto
no
sólo
permite
ar<cular
reflexividad
sino
introspección
sobre
funciones
ajenas.
La
Reflexión
En
La
Composición
Object
FuncAon
function add (x, y) {
return x + y;
}
Function.length
Function.name
Function.prototype
Function.apply
Function.call
Function.bind
Function.toString
Reflexividad
a
Nivel
de
Función
Reflexividad
a
Nivel
de
Objeto
Toda
función
es
en
realidad
un
Bpo
de
objeto
JavaScript
que
dispone
de
atributos
y
métodos
miembro
para
caracterizar
una
función.
Esto
permite
operar
con
las
funciones
sobre
el
modelo
de
reflexión
de
objetos
de
JavaScript
33. Javier
Vélez
Reyes
@javiervelezreye
Javier.velez.reyes@gmail.com
3
Técnicas De
Metaprogramación
Compositiva
§ Técnicas
de
Adición
Composi<va
§ Técnicas
de
Extensión
Composi<va
§ Técnicas
de
Intercesión
Composi<va
§ Técnicas
de
Delegación
Composi<va
Técnicas
De
Metaprogramacion
Composi1va
Metaprogramación
Composi1va
En
JavaScript
34. @javiervelezreye
34
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Introducción
La
metaprogramación
composi<va
se
caracteriza
por
el
hecho
de
que
man<ene
la
estructura
esencial
de
los
componentes.
Todo
ejercicio
metaprogramá<co
en
este
sen<do
se
reduce
a
un
conjunto
de
ac<vidades
de
intervención
puntual
que
pretenden
adaptar,
conectar
o
contextualizar
código
de
los
componentes.
La
Metaprogramación
ComposiAva
Como
Intervención
El
conjunto
potencial
de
intervenciones
sobre
un
modelo
de
componentes
queda
impuesto
por
las
capacidades
metaprogramá<cas
del
lenguaje
y
el
modelo
seleccionado.
A
lo
largo
de
este
capítulo
nos
centraremos
en
objetos
aunque
es
fácil
hacer
una
adaptación
de
los
metaprogramas
para
que
operen
sobre
las
álgebras
funcionales.
Diremos
que
cada
punto
de
intervención
dentro
de
un
componente
es
un
code
holder
mientras
que
el
conjunto
de
todos
ellos
conforman
el
contrato
de
composición
sobre
modelo
el
componente.
Code
Holders
&
Contratos
De
Composición
Transformación
restringida
Intervención
puntual
Contrato
de
composición
Code
holder
o
punto
de
intervención
Componente
35. @javiervelezreye
35
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Introducción
Sobre
los
puntos
de
intervención
definidos
por
cada
uno
de
los
code
holders
es
posible
realizar
ac<vidades
de
metaprogramación
relacionadas
con
la
inyección
de
código.
Las
posibles
variantes
de
inyección
de
código
se
describen
a
par<r
de
la
definición
de
un
conjunto
de
operadores
o
primi<vas
de
composición
propias
de
cada
<po
de
code
holder.
Inyección
De
Código
&
PrimiAvas
De
Composición
Los
programas
encargados
de
llevar
a
cabo
el
proceso
de
inyección
de
código
sobre
cada
uno
de
los
code
holders
del
modelo
de
componentes
se
llaman
metaprogramas.
Estos
algoritmos
u<lizan
los
operadores
de
composición
para
garan<zar
que
los
procesos
de
intervención
son
conformes
con
los
diferentes
<pos
de
code
holders.
A
lo
largo
de
este
capítulo
describiremos
los
code
holders
en
JavaScript
sobre
el
modelo
de
objetos
y
las
operación
de
composición
vinculadas
a
ellos.
Metaprogramas
&
Intervención
Código
inyectado
Metaprograma
composiAvo
Proceso
de
inyección
de
código
mf
36. @javiervelezreye
36
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Adición
Las
técnicas
adi<vas
persiguen
ampliar
la
lógica
de
un
componente
con
nueva
funcionalidad.
De
esta
manera
el
componente
se
adapta
a
nuevos
contextos
arquitectónicos
donde
la
lógica
adicionada
es
requerida.
Definición
Los
puntos
de
intervención
en
este
caso
reflejan
el
carácter
abierto
de
los
objetos
en
JavaScript
con
lo
que
es
posible
alterar
el
conjunto
de
caracterís<cas
de
los
mismos.
Code
Holders
Componente
original
Adición
metaprogramáBca
Objeto
{
p1: v1,
...
pn: vn,
m1: function (){},
...
mn: function (){}
}
Holders
de
Propiedad
Holders
de
Método
miembro
37. @javiervelezreye
37
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Adición
Los
operadores
de
composición
fundamentales
que
hacen
uso
de
técnicas
adi<vas
permiten
añadir,
borrar,
actualizar
y
renombrar
las
caracterís<cas
–
métodos
y
propiedades
–
de
un
objeto.
Operadores
De
Composición
Por
Adición
Los
operadores
fundamentales
se
centran
en
operar
sobre
el
conjunto
de
caracterísBcas
de
un
componente
que
funciona
como
núcleo.
Operadores
fundamentales
de
Adición
mp.add (o, 'x', 1);
mp.remove (o, 'x')
mp.update (o, 'x', 1);
mp.add (o, 'x', 1);
mp.rename (o, 'x', 'y');
mp.update (o, 'x', 5);
{}
{ x: 1 }
{}
{}
{ x: 1 }
{ y: 1 }
{ y: 5 }
Operador
o
mp.add = function add (core, key, value) {
core[key] = value;
return core;
};
mp.remove = function remove (core, key) {
delete core[key];
return core;
};
mp.update = function update (core, key, value) {
if (key in core)
mp.add (core, key, value);
return core;
};
mp.rename = function rename (core, oKey, nKey) {
if (oKey in core && oKey !== nKey) {
mp.add (core, nKey, core[oKey]);
mp.remove (core, oKey);
} return core;
};
38. @javiervelezreye
38
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Adición
Como
extensión
a
los
operadores
de
adición
se
pueden
incluir
primi<vas
que
permiten
copiar
y
mover
propiedades
de
un
objeto
a
otro
o
extender
un
objeto
core
con
las
capacidades
de
otro
como
extensión.
Operadores
De
Composición
Por
Adición
Los
operadores
fundamentales
se
comple-‐
mentan
con
otro
conjunto
de
operadores
que
implican
un
núcleo
y
una
extensión
Otros
operadores
de
Adición
mp.copy = function copy (core, ext, key) {
if (key in ext)
mp.add (core, key, ext[key]);
return core;
};
mp.move = function move (core, ext, key) {
mp.copy (core, ext, key);
mp.remove (core, key);
return core;
};
mp.extend = function extend (core, ext, ctx) {
var keys = Object.getOwnPropertyNames (ext);
keys.forEach (function (key) {
mp.copy (core, ext, key);
mp.bind (core, key, ctx || core);
});
return core;
};
mp.copy (o2, o1, 'y');
mp.remove (o2, 'y');
mp.move (o2, o1, 'x');
mp.extend (o1, o2);
{ y: 5 } {}
{ y: 5 } { y: 5 }
{ y: 5 } {}
{} { y: 5 }
{x: 0} {y: 0}
{x: 0, y: 0} {y: 0}
Operador
o1 o2
39. @javiervelezreye
39
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Extensión
Las
técnicas
extensivas
<enen
por
objeto
reformular
las
capacidades
funcionales
del
componente
por
medio
de
la
especialización
semán<ca.
Este
<po
de
técnicas
se
encuentra
estrechamente
vinculado
a
la
herencia
por
proto<pos
como
mecanismo
del
lenguaje.
Definición
Sobre
una
jerarquía
de
herencia
es
posible
alterar
la
posición
rela<va
de
los
elementos
o
reescribir
la
semán<ca
de
los
métodos
miembros
del
hijo.
Además
se
puede
operar
sobre
los
enlaces
de
la
cadena
de
proto-‐
<pado.
Code
Holders
Componente
original
Extensión
metaprogramáBca
Objeto
{
p1: v1,
...
pn: vn,
m1: function (){},
...
mn: function (){}
}
Holders
de
Movimiento
Holders
de
sobrescritura
ProtoApo
[[Prototype]]
Holder
de
Enlace
a
ProtoBpo
40. @javiervelezreye
40
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Extensión
Los
operadores
fundamentales
que
hacen
uso
de
técnicas
extensivas
están
relacionados
con
la
alteración
de
la
cadena
de
proto<pado.
Es
posible
añadir,
borrar
o
inver<r
el
sen<do
de
esta
relación.
Operadores
De
Composición
Por
Extensión
Mediante
estrategias
reconstrucBvas
es
posible
cambiar
dinámicamente
el
valor
de
la
relación
de
protoBpado
entre
objetos
Operadores
fundamentales
de
Extensión
mp.getPrototype = function (core) {
return Object.getPrototypeOf (core);
};
mp.setPrototype = function (core, proto) {
var ch = Object.create (proto);
mp.extend (ch, core);
return ch;
};
mp.removePrototype = function (core) {
return mp.setPrototype (core, null);
};
mp.reversePrototype = function (core) {
var proto = mp.getPrototype (core);
return mp.setPrototype (proto, core);
};
mp.setPrototype(o, p);
mp.removePrototype (o);
mp.reversePrototype (o);
o -> p
o
o <- p
Operador
o p
41. @javiervelezreye
41
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Extensión
Los
operadores
de
copia
y
movimiento
por
metaprogra-‐
mación
permiten
mover
y
copiar
ascendente
y
descenden-‐
temente
caracterís<cas
presentes
entre
un
proto<po
y
cada
uno
de
sus
objetos
hijos.
Operadores
De
Composición
Por
Extensión
Las
operaciones
de
copia
y
movimiento
de
caracterísBcas
por
la
cadena
de
protoBpado
permiten
alterar
la
semánBca
definida
por
la
relación
jerárquica
entre
objetos
Operadores
fundamentales
de
Extensión
Operador
o p
mp.copyUp = function (core, key) {
var proto = mp.getPrototype (core);
mp.copy (proto, core, key);
return core;
};
mp.copyDown = function (core, key, child) {
var proto = mp.getPrototype (core);
mp.copy (core, proto, key);
return core;
};
mp.moveUp = function (core, key) {
var proto = mp.getPrototype (core);
mp.move (proto, core, key);
return core;
};
mp.moveDown = function (core, key, child) {
var proto = mp.getPrototype (core);
mp.move (core, proto, key);
return core;
};
mp.copyUp (o, 'x');
mp.copyDown (p, 'x', o);
mp.moveUp (o, 'x');
mp.moveDown (p, 'x', o);
o{x} -> p, o{x} -> p{x}
o -> p{x}, o{x} -> p{x}
o{x} -> p, o -> p{x}
o -> p{x}, o{x} -> p
42. @javiervelezreye
42
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Intercesión
La
intercesión
permite
inyectar
lógica
de
decoración
de
manera
entrelazada
con
el
código
original
del
componente.
El
propósito
de
este
<po
de
técnicas
es
ampliar
la
semán<ca
del
mismo
sin
extender
su
contrato.
Definición
En
cuanto
a
propiedades
se
puede
inyectar
código
para
que
se
ejecute
antes
y
después
de
acceder
a
las
mismas
tanto
para
su
lectura
como
para
su
escritura.
En
los
métodos
y
funciones,
existe
similarmente
decoración
anterior
y
posterior
a
la
invocación,
pero
además
también
es
posible
inyectar
código
que
se
ejecutará
cuando
el
método
explícitamente
lo
demande.
Code
Holders
Componente
original
Intercesión
metaprogramáBca
Objeto
{
p1: v1 ,
pn: vn ,
m: function (){
<<code>>
}
}
Holder
before
de
acceso
Holder
before
de
invocación
Holder
aQer
de
invocación
Holder
around
de
invocación
Holder
aQer
de
acceso
Función
in
out
H.
before
H.
aQer
H.
around
43. @javiervelezreye
43
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Intercesión
Los
operadores
de
intercesión
fundamentales
permiten
decorar
la
invocación
de
métodos
inyectando
lógica
funcional
que
se
ejecuta
antes
o
después
de
la
ac<vación
del
método.
Operadores
De
Composición
Por
Intercesión
Los
operadores
fundamentales
de
intercesión
permiten
inyectar
lógica
funcional
que
se
ejecutará
antes
o
después
del
método
Operadores
fundamentales
de
Intercesión
Operador
o
mp.before = function before (core, key, ext) {
var fn = core[key];
core[key] = function () {
var args = [].slice.call (arguments);
var out = ext.apply (this, args);
return fn.apply (this, args.concat (out));
};
return core;
};
mp.after = function after (core, key, ext) {
var fn = core[key];
core[key] = function () {
var args = [].slice.call (arguments);
var out = fn.apply (this, args);
ext.apply (this, args.concat (out));
return out;
};
return core;
};
mp.before (o, 'f', g);
mp.after (o, 'f', g);
{f: function() {...} }
f, g
g, f
44. @javiervelezreye
44
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Intercesión
Adicionalmente,
y
como
una
especialización
de
los
operadores
anteriores,
se
puede
decorar
un
método
en
before
para
condicionar
su
ejecución
en
función
del
resultado
emi<do
por
una
extensión
de
guarda.
Operadores
De
Composición
Por
Intercesión
Los
operadores
de
guarda
uBlizan
técnicas
de
intercesión
para
condicionar
la
ejecución
de
un
método
en
función
del
resultado
emiBdo
por
cierto
predicado
lógico
Operadores
fundamentales
de
Intercesión
Operador
o
mp.provided = function provided (core, key, ext) {
var fn = core[key];
core[key] = function () {
if (ext.apply (this, arguments))
return fn.apply (this, arguments);
};
return core;
};
mp.except = function except (core, key, ext) {
var fn = core[key];
core[key] = function () {
if (!ext.apply (this, arguments))
return fn.apply (this, arguments);
};
return core;
};
mp.provided (o, 'f', p);
mp.except (o, 'f', p);
{f: function() {...} }
f sii p es true
f sii p es false
45. @javiervelezreye
45
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Intercesión
Asimismo
es
posible
conceder
a
un
método
el
control
acerca
de
cuando
se
ejecutará
cierta
decoración
proporcionada
por
el
cliente
en
el
contexto
de
su
esquema
algorítmico
que
es
recibido
como
parámetro
en
la
función
original.
Operadores
De
Composición
Por
Intercesión
En
este
caso
el
código
core,
f,
manBene
referencias
explícitas
a
una
función
de
decoración,
r,
pasada
por
convenio
como
primer
argumento
Operador
explícito
de
Intercesión
Operador
o
mp.around = function around (core, key, ext) {
var fn = core[key];
core[key] = function () {
var args = [].slice.call(arguments);
args = [ext.bind(this)].concat(args);
return fn.apply (this, args);
};
return core;
};
En
ejecución,
en
el
esquema
de
decoración
se
susBtuye
r
por
g
La
extensión,
g,
se
antepone
como
primer
parámetro
a
los
argumentos
de
la
función
decorada
f
mp.around (o, 'f', g);
{f: function(r) {
r(); ... r ();
}
}
g, ..., g
46. @javiervelezreye
46
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Intercesión
Los
operadores
de
acceso
a
propiedades
para
lectura
y
escritura
en
before
permiten
inyectar
código
que
se
ejecutará
antes
del
acceso
a
las
propiedades.
Operadores
De
Composición
Por
Intercesión
Se
decoran
los
métodos
de
acceso
y
modificación
a
propiedades
get
y
set
y
se
manBene
una
variable
oculta
para
soportar
el
estado
de
la
propiedad.
Operador
explícito
de
Intercesión
Operador
o
mp.beforeGetAtt = function (core, key, ext) {
Object.defineProperty (core, '_' + key, {
value: core[key],
writable: true,
enumerable: false,
configurable: false
});
Object.defineProperty (core, key, {
get: function () {
ext.call (this, core['_' + key]);
return core['_' + key];
}
});
return core;
};
mp.beforeGetAtt (o, 'x', f)
{x: 0}
o.x -> f, 0
Primero
se
define
una
propiedad
privada
de
igual
nombre
que
la
clave
key
pero
prefijando
un
_
Esta
propiedad
privada
permite
dar
soporte
a
la
implementación
de
intercesor
de
lectura
get
47. @javiervelezreye
47
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Intercesión
Los
operadores
de
acceso
a
propiedades
para
lectura
y
escritura
en
before
permiten
inyectar
código
que
se
ejecutará
antes
del
acceso
a
las
propiedades.
Operadores
De
Composición
Por
Intercesión
Se
decoran
los
métodos
de
acceso
y
modificación
a
propiedades
get
y
set
y
se
manBene
una
variable
oculta
para
soportar
el
estado
de
la
propiedad.
Operador
explícito
de
Intercesión
Operador
o
mp.beforeSetAtt = function (core, key, ext) {
Object.defineProperty (core, '_' + key, {
value: core[key],
writable: true,
enumerable: false,
configurable: false
});
Object.defineProperty (core, key, {
set: function (v) {
ext.call (this, core['_' + key], v);
core['_' + key] = v;
}
});
return core;
};
mp.beforeSetAtt (o, 'x', f)
{x: 0}
o.x = 3 -> f, {x: 3}
Primero
se
define
una
propiedad
privada
de
igual
nombre
que
la
clave
key
pero
prefijando
un
_
Esta
propiedad
privada
permite
dar
soporte
a
la
implementación
de
intercesor
de
escritura
set
48. @javiervelezreye
48
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Intercesión
Similarmente,
los
operadores
de
acceso
a
propiedades
para
lectura
y
escritura
en
aaer
permiten
inyectar
código
que
se
ejecutará
después
del
acceso
a
las
propiedades.
Operadores
De
Composición
Por
Intercesión
Se
decoran
los
métodos
de
acceso
y
modificación
a
propiedades
get
y
set
y
se
manBene
una
variable
oculta
para
soportar
el
estado
de
la
propiedad.
Operador
explícito
de
Intercesión
Operador
o
mp.afterGetAtt (o, 'x', f)
{x: 0}
o.x -> 0, f
mp.afterGetAtt = function (core, key, ext) {
Object.defineProperty (core, '_' + key, {
value: core[key],
writable: true,
enumerable: false,
configurable: false
});
Object.defineProperty (core, key, {
get: function () {
var out = core['_' + key];
ext.call (this, core['_' + key]);
return out;
}
});
return core;
};
De
manera
similar,
primero
se
define
una
propiedad
privada
de
igual
nombre
que
la
clave
key
pero
prefijando
un
_
para
dar
soporte
a
la
implementación
del
get
en
aQer
49. @javiervelezreye
49
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Intercesión
Similarmente,
los
operadores
de
acceso
a
propiedades
para
lectura
y
escritura
en
aaer
permiten
inyectar
código
que
se
ejecutará
después
del
acceso
a
las
propiedades.
Operadores
De
Composición
Por
Intercesión
Se
decoran
los
métodos
de
acceso
y
modificación
a
propiedades
get
y
set
y
se
manBene
una
variable
oculta
para
soportar
el
estado
de
la
propiedad.
Operador
explícito
de
Intercesión
Operador
o
mp.afterSetAtt (o, 'x', f)
{x: 0}
o.x = 3 -> {x: 3}, f
De
manera
similar,
primero
se
define
una
propiedad
privada
de
igual
nombre
que
la
clave
key
pero
prefijando
un
_
para
dar
soporte
a
la
implementación
del
set
en
aQer
mp.afterSetAtt = function (core, key, ext) {
Object.defineProperty (core, '_' + key, {
value: core[key],
writable: true,
enumerable: false,
configurable: false
});
Object.defineProperty (core, key, {
set: function (nv) {
var ov = core['_' + key];
core['_' + key] = nv;
ext.call (this, ov, nv);
}
});
return core;
};
50. @javiervelezreye
50
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Delegación
Las
técnicas
basadas
en
delegación
ar<culan
estrategias
composi<vas
que
permiten
dispersar
la
lógica
de
un
servicio
entre
varios
componentes
con
iden<dad
propia
dentro
de
la
arquitectura
pero
estableciendo
fachadas
de
desacopla-‐
miento.
Definición
Los
puntos
de
intervención
en
esta
familia
de
técnicas
coinciden
con
los
de
la
intercesión.
La
diferencia
estriba
en
este
caso
en
que
los
metaprogramas
inyectan
código
dirigido
a
establecer
esquemas
que
delegan
en
otra
lógica.
Code
Holders
Objeto
{
p1: v1 ,
pn: vn ,
m: function (){
<<code>>
}
}
Holder
before
de
acceso
Holder
before
de
invocación
Holder
aQer
de
invocación
Holder
around
de
invocación
Holder
aQer
de
acceso
Componente
original
Delegación
metaprogramáBca
Función
in
out
H.
before
H.
aQer
H.
around
51. @javiervelezreye
51
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Delegación
Este
<po
de
operadores
ar<culan
procesos
de
composición
por
delegación
interna
y
externa
mediante
la
construcción
de
métodos
proxy
añadidos
al
core.
Operadores
De
Composición
Por
Delegación
La
delegación
interna
permite
generar
un
método
de
proxy
que
delega
en
otro
método
del
mismo
objeto.
La
delegación
externa
se
produce
entre
objetos
diferentes
Operador
fundamentales
de
Delegación
Operador
o1 [o2]
mp.innerDelegate = function (core, oKey, nKey, ctx) {
var context = ctx || core;
core[nKey] = function () {
var args = [].slice.call (arguments);
var out = core[oKey].apply (context, args);
return out === core ? this : out;
};
return core;
};
mp.outerDelegate = function (core, ext, key, ctx) {
var context = ctx || ext;
core[key] = function () {
var args = [].slice.call (arguments);
var out = ext[key].apply (context, args);
return out === ext ? this : out;
};
return core;
};
mp.innerDelegate(o1,'f','g')
mp.outerDelegate(o1,o2,'f')
{f}
{g:function(){o1.f()}
f}
{} {f}
{f:function(){o2.f()}}
{f}
52. @javiervelezreye
52
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Delegación
A
par<r
de
los
operadores
anteriores
se
definen
los
operadores
de
forwarding
y
proxy
en
forwarding
que
contextualizan
la
invocación
en
el
delegado.
Operadores
De
Composición
Por
Delegación
El
forwarding
es
una
modalidad
de
delegación
débil
contextualizada
en
el
delegado.
Es
lo
que
se
conocer
por
delegación
convencionan
en
los
lenguajes
de
OOP
Operador
fundamentales
de
Delegación
Operador
o1 [o2]
mp.forward = function (core, ext, key) {
return mp.outerDelegate (core, ext, key, ext);
};
mp.forwardProxy = function (core, ext) {
if (typeof(ext) === 'string') {
ext = core[ext];
}
if (ext) {
var keys = Object.keys (ext);
keys.forEach (function (key) {
if (typeof (ext[key]) === 'function')
mp.forward (core, ext, key);
});
}
return core;
};
mp.forward (o1,o2,'f')
o1.f()
{x:1}{x:3,
f(){return this.x}}
3
53. @javiervelezreye
53
Técnicas
De
Metaprogramacion
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Técnicas
De
Metaprogramación
Por
Delegación
Similarmente,
los
operadores
fundamentales
pueden
u<lizarse
para
ar<cular
técnicas
de
delegación
contextual-‐
lizadas
en
el
core.
Operadores
De
Composición
Por
Delegación
La
delegación
es
la
forma
más
fuerte
y
dinámica
de
vinculación
composiBva.
En
ella
el
contexto
de
evaluación
permanece
en
el
objeto
core
Operador
fundamentales
de
Delegación
Operador
o1 [o2]
mp.delegate = function (core, ext, key) {
mp.outerDelegate (core, ext, key, core);
};
mp.delegateProxy = function (core, ext) {
if (typeof(ext) === 'string') {
ext = core[ext];
}
if (ext) {
var keys = Object.keys (ext);
keys.forEach (function (key) {
if (typeof (ext[key]) === 'function')
mp.delegate (core, ext, key);
});
}
};
mp.delegate (o1,o2,'f')
o1.f()
{x:1}{x:3,
f(){return this.x}}
1
54. Javier
Vélez
Reyes
@javiervelezreye
Javier.velez.reyes@gmail.com
4
Patrones De
Metaprogramación
Compositiva
§ Patrones
de
Selección
§ Patrones
de
Adaptación
§ Patrones
de
Composición
§ Patrones
de
Encapsulación
§ Patrones
de
Contextualización
Patrones
De
Metaprogramación
Composi1va
Metaprogramación
Composi1va
En
JavaScript
55. @javiervelezreye
55
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Introducción
A
con<nuación
presentamos
un
breve
catálogo
de
patrones
de
meta
programación
que
hacen
uso
de
las
técnicas
vistas
en
este
texto.
El
catálogo
distribuye
los
patrones
en
relación
a
la
fase
del
proceso
de
composición
donde
se
aplican.
El
obje<vo
no
es
hacer
una
revisión
exhaus<va
de
patrones
sino
servir
de
base
de
ejemplo
para
la
opera<va
diaria
en
técnicas
de
metaprogramación.
De
hecho,
muchos
de
los
patrones
aquí
presentados
son
una
adaptación
metaprogramá<ca
de
patrones
clásicos
de
la
orientación
a
objetos.
Patrones
Basados
En
Técnicas
ComposiAvas
Selección
§ Singleton
§ Clone
§ Recruiter
§ Builder
§ Locator
§ Rename
§ Observe
§ Dummy
§ Idempotent
§ Delay
§ Throele
Adaptación
§ Broadcast
§ Balancer
§ Dispatcher
§ Filter
§ Chain
§ Fluent
Composición
Encapsulación
§ Hide
§ Self
§ Hungarian
§ ProtoBfy
§ Proxify
§ Record
§ Sink
§ Trace
Contextualización
§ Cache
§ Undo
56. @javiervelezreye
56
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Selección
Los
patrones
de
selección
persiguen
definir
estrategias
de
localización,
construcción
y
recuperaciones
de
componentes
para
emplearlos
en
el
contexto
de
aplicación
en
curso.
La
lógica
de
estos
patrones
permite
encontrar
los
componentes
adecuados
en
virtud
de
las
condiciones
ambientales.
Singleton
function singleton (obj) {
return function () {
return mp.forwardProxy ({}, obj);
};
}
Este
patrón
es
una
adaptación
del
clásico
patrón
singleton
desarrollada
a
par<r
de
técnicas
de
metaprogramación.
Se
construye
un
objeto
con
todos
los
métodos
del
original
que
delega
en
éste.
A
p ()
q ()
p ()
q ()
p ()
q ()
B
Singleton
Los
objetos
A
y
B
se
construyen
dinámicamente
para
delegar
en
un
único
componente
de
manera
que
la
lógica
corresponde
a
un
patrón
singleton
El
metaprograma
uBliza
la
operación
de
proxy
de
forwarding
para
obtener
objetos
que
hacen
forwarding
al
objeto
único
57. @javiervelezreye
57
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Selección
Los
patrones
de
selección
persiguen
definir
estrategias
de
localización,
construcción
y
recuperaciones
de
componentes
para
emplearlos
en
el
contexto
de
aplicación
en
curso.
La
lógica
de
estos
patrones
permite
encontrar
los
componentes
adecuados
en
virtud
de
las
condiciones
ambientales.
Clone
Se
clona
un
objeto
pasado
como
parámetro
para
preservar
el
estado
del
mismo.
Este
patrón
es
ú<l
en
componentes
que
operan
entre
niveles
de
una
arquitectura
de
capas.
Core
p ()
q ()
p ()
q ()
Clone
El
patrón
crea
un
clon
de
un
objeto
pasado
como
parámetro
y
lo
devuelve
como
resultado
function clone (obj) {
return function () {
return mp.extend ({}, obj);
};
}
El
metaprograma
consiste
esencialmente
en
invocar
el
operador
de
extensión
sobre
un
objeto
vacío
que
se
convierte
en
el
resultado
una
vez
recibe
los
métodos
y
atributos
del
parámetro
o
58. @javiervelezreye
58
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Selección
Los
patrones
de
selección
persiguen
definir
estrategias
de
localización,
construcción
y
recuperaciones
de
componentes
para
emplearlos
en
el
contexto
de
aplicación
en
curso.
La
lógica
de
estos
patrones
permite
encontrar
los
componentes
adecuados
en
virtud
de
las
condiciones
ambientales.
Recruiter
Los
componentes
reclutadores
seleccionan
de
entre
una
colección
de
objetos
a
aquellos
que
cumplen
las
condiciones
impuestas
por
una
función
de
filtro.
Recruiter
El
reclutador
evalúa
cada
función
y
criba
aquellos
objetos
que
verifican
una
función
de
filtro
pasada
como
parámetro.
Todos
los
componentes
[A,
B,
C]
deben
tener
un
contrato
común
function recruiter (fn) {
return function (objs) {
var out = {};
Object.keys (objs[0]).forEach (function (k) {
mp.add (out, k, function () {
var args = [].slice.call (arguments);
return objs.filter (function (obj) {
return fn(obj[k].apply (this, args));
});
});
});
return out;
};
}
p ()
p ()
p ()
p ()
A
B
C
fn
[A, C]
59. @javiervelezreye
59
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Selección
Los
patrones
de
selección
persiguen
definir
estrategias
de
localización,
construcción
y
recuperaciones
de
componentes
para
emplearlos
en
el
contexto
de
aplicación
en
curso.
La
lógica
de
estos
patrones
permite
encontrar
los
componentes
adecuados
en
virtud
de
las
condiciones
ambientales.
Builder
Para
construir
objetos
por
partes
podemos
adaptar
el
patrón
builder
propio
de
la
orientación
a
objetos
clásica
pero
haciendo
uso
de
la
operación
de
extensión.
Builder
El
patrón
permite
empezar
por
la
definición
opcional
de
un
protoBpo
para
el
objeto
y
luego
ir
añadiendo
nuevos
objetos
que
se
agregan
como
extensiones
con
lógica
de
sobrescritura
function builder (proto) {
var out = Object.create (proto || null);
return {
add : function (obj) {
mp.extend (out, obj);
return this;
},
create : function () { return out; }
};
}
p ()
p ()
p ()
A
B
C
60. @javiervelezreye
60
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Selección
Los
patrones
de
selección
persiguen
definir
estrategias
de
localización,
construcción
y
recuperaciones
de
componentes
para
emplearlos
en
el
contexto
de
aplicación
en
curso.
La
lógica
de
estos
patrones
permite
encontrar
los
componentes
adecuados
en
virtud
de
las
condiciones
ambientales.
Locator
Asimismo
resulta
interesante
localizar
una
colección
de
métodos
de
una
colección
de
componentes
y
conformar
un
nuevo
componente
incorporando
dichos
método
debidamente
contextualizados.
Locator
El
patrón
permite
empezar
por
la
definición
opcional
de
un
protoBpo
para
el
objeto
y
luego
ir
añadiendo
nuevos
objetos
que
se
agregan
como
extensiones
con
lógica
de
sobrescritura
function locator (objs) {
return function (keys) {
var out = {};
keys.forEach (function (k) {
mp.add (out, k, objs.filter (function (obj) {
return (k in obj);
})[0][k]);
mp.bind (out, k, out);
});
return out;
};
}
p ()
q ()
A
B
C
r ()
s ()
u ()
v ()
p ()
s ()
v ()
61. @javiervelezreye
61
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Adaptación
La
adaptación
es,
tal
vez,
la
fase
del
proceso
de
composición
más
relevante
diferencialmente
con
respecto
a
aproximaciones
anteriores.
Las
arquitecturas
no
son
responsables
de
absorber
la
variabilidad
sino
que
son
los
propios
componentes
los
que
se
adaptan
para
alinearse
a
las
restricciones
arquitectónicas
por
medio
de
la
aplicación
de
metaprogramas.
Alias
El
patrones
de
alias
adapta
sintác<camente
el
contrato
de
un
componente
para
que
se
ajuste
a
las
necesidades
impuestas
por
el
contexto
arquitectónico.
Los
nuevos
métodos
a
y
b
incluidos
en
O
descansan
en
una
delegación
interna
sobre
los
métodos
anteriores
p
y
q.
Esto
permite
encajar
el
componente
en
contextos
que
requieren
a
y
b
como
operaciones
directrices
function alias (obj, trd) {
Object.keys (trd).forEach (function (k) {
mp.innerDelegate (obj, k, trd[k]);
});
return obj;
}
p ()
q ()
p ()
q ()
O'
a ()
b ()
{ a: 'p',
b: 'q' }
O
El
metaprograma
recoge
la
información
de
traducción
en
el
objeto
de
configura-‐
ción
trd
y
uBliza
operaciones
de
delega-‐
ción
interna
para
realizar
la
adaptación
62. @javiervelezreye
62
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Adaptación
La
adaptación
es,
tal
vez,
la
fase
del
proceso
de
composición
más
relevante
diferencialmente
con
respecto
a
aproximaciones
anteriores.
Las
arquitecturas
no
son
responsables
de
absorber
la
variabilidad
sino
que
son
los
propios
componentes
los
que
se
adaptan
para
alinearse
a
las
restricciones
arquitectónicas
por
medio
de
la
aplicación
de
metaprogramas.
Observe
Se
transforman
los
métodos
y
propiedades
de
manera
que
su
ejecución
y
acceso
dispara
un
evento
para
escuchadores.
Este
patrón
es
una
adaptación
del
clásico
patrón
observador-‐observable
de
la
orientación
a
objetos
uBlizando
técnicas
metaprogramáBcas
x
y
p ()
q ()
O'
O
function observe (obj, emitter) {
Object.keys(obj).forEach (function (k) {
if (typeof (obj[k]) === 'function')
mp.before (obj, k, function () {
emitter.emit ('CALL');
});
else {
mp.beforeAtt (obj, k, {
get: function () { emitter.emit ('GET'); },
set: function () { emitter.emit ('SET'); }
});
}
});
return obj;
}
x
y
p ()
q ()
e
Se
uBlizan
operadores
de
intercesión
para
decorar
métodos
y
accesos
de
propiedad
para
disparar
eventos
63. @javiervelezreye
63
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Adaptación
La
adaptación
es,
tal
vez,
la
fase
del
proceso
de
composición
más
relevante
diferencialmente
con
respecto
a
aproximaciones
anteriores.
Las
arquitecturas
no
son
responsables
de
absorber
la
variabilidad
sino
que
son
los
propios
componentes
los
que
se
adaptan
para
alinearse
a
las
restricciones
arquitectónicas
por
medio
de
la
aplicación
de
metaprogramas.
Dummy
Un
componente
incluye
un
método
de
desco-‐
nexión
que
anula
la
invocación
de
métodos.
Este
patrón
resulta
ú<l
para
entornos
de
pruebas.
La
transformación
incluyen
métodos
públicos
para
acBvar
o
desacBvar
el
funcionamiento
de
los
métodos
originales
del
componente
El
metaprograma
incluye
métodos
y
variables
de
flag
para
soportar
el
estado
de
acBvación
que
se
controla
desde
la
intercesión
de
los
métodos
function dummy (obj) {
mp.add (obj, 'off', false);
mp.add (obj, 'start', function () { this.off = false; });
mp.add (obj, 'stop' , function () { this.off = true; });
Object.keys(obj).forEach (function (k) {
if (typeof (obj[k]) === 'function')
mp.provided (obj, k, function () {
return !this.off;
});
});
return obj;
}
p ()
q ()
p ()
q ()
O'
start ()
stop ()
O
64. @javiervelezreye
64
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Adaptación
La
adaptación
es,
tal
vez,
la
fase
del
proceso
de
composición
más
relevante
diferencialmente
con
respecto
a
aproximaciones
anteriores.
Las
arquitecturas
no
son
responsables
de
absorber
la
variabilidad
sino
que
son
los
propios
componentes
los
que
se
adaptan
para
alinearse
a
las
restricciones
arquitectónicas
por
medio
de
la
aplicación
de
metaprogramas.
Idempotent
Un
componente
incluye
un
método
de
desco-‐
nexión
que
anula
la
invocación
de
los
demás
métodos.
Resulta
ú<l
en
las
capas
de
backend.
Se
incluye
estado
para
garanBzar
que
cada
método
se
ejecute
una
sola
vez.
El
método
reset()
permite
reconfigurar
al
componente
para
volver
a
su
estado
inicial
p ()
q ()
p ()
q ()
O'
reset ()
O
function idempotent (obj) {
mp.add (obj, 'fired', {});
mp.add (obj, 'reset', function () { this.fired = {}; });
Object.keys(obj).forEach (function (k) {
if (typeof (obj[k]) === 'function') {
mp.after (obj, k, function () {
this.fired[k] = true;
});
mp.except (obj, k, function () {
return this.fired[k];
});
}
});
return obj;
}
65. @javiervelezreye
65
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Adaptación
La
adaptación
es,
tal
vez,
la
fase
del
proceso
de
composición
más
relevante
diferencialmente
con
respecto
a
aproximaciones
anteriores.
Las
arquitecturas
no
son
responsables
de
absorber
la
variabilidad
sino
que
son
los
propios
componentes
los
que
se
adaptan
para
alinearse
a
las
restricciones
arquitectónicas
por
medio
de
la
aplicación
de
metaprogramas.
Throgle
El
patrón
throfle
transforma
los
métodos
de
un
objetos
de
manera
que
se
descarte
toda
invocación
subsiguiente
en
un
lapso
de
<empo.
Es
especialmente
ú<l
para
controlar
manejadores
vinculados
a
eventos
demasiado
frecuentes.
Se
decora
cada
uno
de
los
métodos
del
componente
para
garanBzar
que
nuevas
invocaciones
serán
descartadas
en
los
subsiguientes
instantes
a
cada
invoca-‐
ción
legal
function throttle (obj, ms) {
Object.keys(obj).forEach (function (k) {
mp.add (obj, k, (function (fn) {
var throttling;
return function () {
if (!throttling) {
throttling = setTimeout (function () {
throttling = void 0;
}, ms);
return fn.call(obj, arguments);
}
};
})(obj[k]));
}); return obj;
}
p ()
q ()
p ()
q ()
O'
O
< 3000 ms
Se
uBliza
una
intercesión
mediante
adición
para
vincular
la
llamada
a
cada
método
a
la
función
de
Bmeout
de
JavaScript
y
arBcular
el
descarte
66. @javiervelezreye
66
Patrones
De
Metaprogramación
Composi<va
Metaprogramación
ComposiAva
En
JavaScript
Patrones
de
Adaptación
La
adaptación
es,
tal
vez,
la
fase
del
proceso
de
composición
más
relevante
diferencialmente
con
respecto
a
aproximaciones
anteriores.
Las
arquitecturas
no
son
responsables
de
absorber
la
variabilidad
sino
que
son
los
propios
componentes
los
que
se
adaptan
para
alinearse
a
las
restricciones
arquitectónicas
por
medio
de
la
aplicación
de
metaprogramas.
Delay
El
patrón
delay
transforma
los
métodos
de
un
componente
en
asíncronos
para
provocar
un
retardo
de
<empo
constante
indicado
por
parámetro.
Se
decora
cada
uno
de
los
métodos
del
componente
para
garanBzar
que
la
invocación
a
cada
método
se
retarda
un
intervalo
de
Bempo
p ()
q ()
p ()
q ()
O'
O
3000 ms
Al
igual
que
antes,
se
uBliza
una
intercesión
mediante
adición
para
vincular
la
llamada
a
cada
método
a
la
función
de
Bmeout
de
JavaScript
y
arBcular
el
retardo
p ()
q ()
function delay (obj, ms) {
Object.keys(obj).forEach (function (k) {
mp.add (obj, k, (function (fn) {
return function () {
var args = [].slice (arguments-1);
var cb = arguments[arguments.length-1];
setTimeout (function () {
cb (fn.call(obj, args));
}, ms);
};
})(obj[k]));
});
return obj;
}