8663-Texto Del Artículo-42854-1-10-20150906
8663-Texto Del Artículo-42854-1-10-20150906
8663-Texto Del Artículo-42854-1-10-20150906
Resumen
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
18
Ranking RedMonk
I. Introducción
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
19
se pueden crear aplicaciones modulares utilizando (GRASP) alta cohesión y bajo acoplamiento [6]. La
herramientas como CommonJS, AMD y Servicios cohesión tiene relación con la estructura interna de
Web en JavaScript. los módulos, cuyos elementos deben estar
estrechamente relacionados y tener un objetivo
II. Sistemas modulares común. El acoplamiento tiene que ver con la relación
entre módulos de tal manera que la dependencia
En esta sección se definirán los sistemas modulares entre estos sea mínima [4]. De esta forma se
como sistemas de software mantenibles con garantiza que los módulos puedan ser agregados,
capacidad de evolucionar. retirados y modificados sin que haya un impacto
negativo en el sistema (figuras 3 y 4).
Los sistemas modulares y la ingeniería de software
basada en componentes (CBSE) surgen de la Representación gráfica de la baja cohesión y el
necesidad de constituir una ingeniería de software alto acoplamiento
madura, donde existan unidades funcionales que
puedan ser reutilizadas en la construcción de
sistemas de software con el fin de disminuir
esfuerzos, costos y otros recursos, emulando lo que
ocurre en otras ingenierías como la civil o la
electrónica. Dichas unidades funcionales se conocen
como módulos o componentes, tienen una
funcionalidad determinada y pueden integrarse para
conformar sistemas más complejos, como si de
ladrillos de un edificio se tratase.
Figura 3. Baja cohesión y alto acoplamiento [4]
Estos sistemas pueden ser creados con un enfoque de
abajo hacia arriba (bottom-up), donde se desarrollan Representación gráfica de la alta cohesión y el
primero los componentes y más adelante se bajo acoplamiento
combinan para generar el sistema [4]. Este método se
llama “composición” y es apropiado para trabajar
con modelos de proceso iterativos e incrementales,
tanto así que incluso existen métodos para mapear
requerimientos a componentes, como se evidencia en
[5], donde cada nueva iteración significa una
aproximación más cercana al sistema final (principio
del incremento) [5]. Sin embargo, también pueden
construirse por medio de un enfoque de arriba hacia
abajo (top-down) llamado “descomposición”, donde Figura 4. Alta cohesión y bajo acoplamiento [4]
primero se planifica el sistema y cómo interactúan
sus componentes antes de entrar a desarrollar cada
uno de manera individual [5]. En este enfoque se ve
cada módulo como una caja negra donde se ignoran En términos generales los componentes o módulos
sus detalles internos y solo se tiene en cuenta lo que dotan a los sistemas de software o aplicaciones la
requieren para funcionar y los servicios que proveen, capacidad de mantenerse, adaptarse al cambio y
de tal manera que puedan intercomunicarse. evolucionar sin importar su complejidad. Por lo tanto
en la sección IV se mostrará cómo crear este tipo de
Además los módulos o componentes deben estar en elementos en JavaScript.
capacidad de integrarse con nuevos componentes
provenientes de librerías y aplicaciones de terceras II. JavaScript, un lenguaje de scripting
partes, ser integrados en sistemas diferentes para el
que fueron creados o integrarse con otros En esta sección se definirá JavaScript con base en los
componentes para conformar un componente lenguajes de scripting.
compuesto. Para esto es necesario que se apliquen
los patrones de separación de responsabilidades Existen muchas dudas sobre las características que
debe tener un lenguaje de programación para ser
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
20
lenguaje de scripting. Esto se debe a que los ejecutables llamado script”. Esto significa que sin
recientes avances tecnológicos han desvanecido aún importar si el lenguaje es compilado, interpretado,
más la frontera entre los lenguajes tradicionales y orientado a objetos, procedimental, manejado por
dichos lenguajes. Hace una década esta tarea de una máquina virtual, con asignación de tipos de
taxonomía era menos compleja, los lenguajes datos dinámicos o estáticos, es posible realizar
tradicionales como C o Java eran propicios para el scripts.
desarrollo de aplicaciones o componentes y los de
scripting servían como intermediario, como una JavaScript es uno de los denominados lenguajes de
herramienta auxiliar que por su flexibilidad eran scripting (PHP, Perl, Ruby, Python, VBScript, etc.)
idóneos para unir componentes o en el caso de al que más se le ajusta esta definición por la forma
JavaScript contener pequeñas lógicas de negocio como fue sido utilizado durante muchos años y que
como validación de formularios, controles de poco a poco ha ido quedándose atrás a medida que
interfaz, etc. Ahora es posible crear aplicaciones su popularidad crece. Esto se debe a la también
completas y complejas con solo estos lenguajes, creciente popularidad de internet (al ser un lenguaje
llegando a competir con los tradicionales y principalmente desarrollado para aplicaciones Web)
alcanzando popularidad entre los desarrolladores, y según [10], al esfuerzo de los proveedores de
por lo que categorizarlos es una tarea más difícil. navegadores de crear motores de procesamiento más
Según [7], los lenguajes de scripting son potentes, junto con la posibilidad de crear
interpretados en lugar de compilados, las variables aplicaciones del lado del servidor con Node.js (Que
no necesitan ser declaradas y tienen una asignación funciona con el motor V8), además de robustecer la
de tipos dinámica en lugar de estática. Sin embargo, funcionalidad del lado del cliente con la llegada de
con el surgimiento de la compilación JIT (Just in frameworks como JQuery que suavicen las
Time) los lenguajes de programación compilados diferencias entre navegadores y AngularJS que den
pueden tener una flexibilidad similar a los que no lo una estructura al código siguiendo el patrón MVC.
son y en algunos lenguajes de programación
tradicionales, como Java, es posible la asignación de Esto ha propiciado que JavaScript llegue a terrenos
tipos de datos como si de objetos se tratasen (en insospechados como al de las aplicaciones móviles
algunos casos Java es considerado como un lenguaje mediante Phonegap, que en combinación con JQuery
de scripting). Mobile y Sencha pueden tener interfaces responsivas
que incluso parecen nativas al manejo de sistemas
Por otro lado, en [8] se presentan como embebidos (Arduino) y la creación de aplicaciones
características de los lenguajes de scripting, la Stand-alone por medio de NodeWebkit.
utilización de tipos de datos de alto nivel (arreglos,
listas, etc.) y el manejo de memoria por el recolector A pesar de estos avances, sigue siendo un lenguaje
de basura; pero estas características son estigmatizado sin razón. Un ejemplo de esto son las
convencionales, tanto en estos lenguajes como en los palabras de Miles Lines en [10], “Estéticamente no
tradicionales. Finalmente, se señala que los lenguajes me gusta JavaScript....Es una cuestión personal”, lo
de scripting tienen afinidad con el paradigma de que indica que no tiene una razón técnica para juzgar
programación procedimental, no obstante, en la el lenguaje, solo puede basarse en su estructura y es
actualidad esto ya no es tan cierto porque muchos por eso que creo que CoffieScript es como
han migrado hacia la programación orientada a JavaScript, pero con una sintaxis más limpia
objetos, como el caso de PHP, Python y Perl, además limitando un poco el control de los programadores
de otros que fueron creados bajo este paradigma, sobre la puntuación del lenguaje.
como Ruby que es tan orientado a objetos como el Esto es importante, porque da cuenta de que aún
mismo SmallTalk [7]. existen inconformidades provocadas por su
Como se puede ver, la ambigüedad abunda a la hora flexibilidad, que si bien permite abordar un problema
de determinar si un lenguaje de programación es de desde muchas perspectivas, también ha conducido a
scripting o no basándose solo en sus características, la implementación de malas prácticas (como las
tal vez porque lo que importa no es eso, sino cómo variables globales), por parte de desarrolladores
se utilice, lo que puede evidenciarse en la primera inconscientes, lo que a fin de cuentas genera la falsa
parte de la definición dada en [9], donde “Un concepción de que no es apto para desarrollar
lenguaje de scripting es un lenguaje de programación aplicaciones complejas y robustas. Para contradecir
simple usado para escribir una lista de comandos esto en la siguiente sección se muestran varias
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
21
Existen muchas formas de definir módulos en Como se puede apreciar hay un atributo counter que
JavaScript, tanto para la creación de la interfaz de por el simple hecho de estar fuera del return ya es
usuario (ComponentJS) como para la lógica de privado y no puede ser invocado fuera del módulo al
negocio, mediante frameworks (BackBone.js, que pertenece. Por el contrario, se definieron dos
Ember.js) como a través de código nativo (Patrones operaciones públicas, insertCounter que incrementa
de diseño, ES6), tanto para definición asíncrona del un contador y resetCounterque lo reinicia. El
lado del cliente (AMD) como síncrona del lado del resultado de ejecutar ambas operaciones se pone de
servidor (CommonJS), estandarizados tanto para la manifiesto en la figura 5.
creación de SOA (Servicios Web) como con otro
estilo arquitectónico, entre otros. A continuación se
trataran específicamente patrones para definición de
módulos, AMD, CommonJS, Servicios Web y ES6.
Figura 5. Resultado en consola de ejecutar las
A). Patrones para la definición de módulos funciones del módulo ‘TestMdoule’.
Los patrones de diseño orientados a la definición de El patrón módulo revelado es una variación del
módulos más importantes son el patrón módulo y el patrón módulo donde todos sus miembros son
módulo revelado. El primero tiene la intención de privados y donde hay unas interfaces públicas para
emular el encapsulamiento y visibilidad de una clase ciertas propiedades. El ejemplo anterior definido con
en los lenguajes de programación orientada a el patrón módulo revelado tendría la estructura
objetos, es decir la capacidad de definir métodos y presente en el gráfico 2 [12].
atributos de una clase como si fueran públicos (que
puedan ser usados por otros módulos) o privados 1 var testModule = (function () {
(que puedan ser usados solo por el mismo módulo). 2 var counter = 0;
En el gráfico 1 es posible ver la implementación de 3 function privateIncrementCounter() {
un módulo mediante dicho patrón [11]. 4 return counter++;
5 }
1 var testModule = (function () { 6 function privateResetCounter() {
2 var counter = 0; 7 console.log( "counter value prior to reset:
3 return { 8 " + counter );
4 incrementCounter: function () { 9 counter = 0;
5 return counter++; 1 }
0
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
22
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
23
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
24
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
25
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
26
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
27
proveerá ES6 de manera definitiva. Sin embargo como lo hace RequireJS. Traceur por su parte es un
como se mencionó antes, no es una versión de transpiler que compila de ES6 a ES5 lo que tiene
JavaScript actualmente soportada por los como ventaja que puedan ser implementadas otras
navegadores. Para solucionar este inconveniente es características (Además de los módulos) de la nueva
necesario utilizar otros recursos para poder ejecutar versión de JavaScript que aún no son soportadas por
módulos hechos en ES6 al menos por ahora. La el navegador [21].
primera opción es utilizar ES6 module-transpiler,
que toma los módulos definidos en ES6 y los Para su funcionamiento SystemJS debe ser cargado
compila en AMD o CommonJS para que puedan ser mediante las etiquetas <script>, luego es necesario
interpretados por el navegador (una guía para la declarar la función System.import (mediante las
instalación del ES6 module-transpiler se encuentra mismas etiquetas), que recibe como parámetro la
en (Franklin, JavaScript Playground, 2014)) (gráfico ruta del archivo JavaScript principal que carga los
14 y 15). Para el ejemplo anterior el resultado de la módulos. En el ejemplo esta función carga el archivo
compilación fue en CommonJS y se ejecutó por main.js y las dependencias del mismo, en este caso el
medio de Node.js, dando como resultado el que se módulo adder (gráfico 16). El resultado en la
puede ver en la figura 12. consola del navegador puede verse en la figura 13 y
la inyección de dependencias puede apreciarse en el
1 "use strict"; diagrama de secuencia en la figura 14.
2 var double = function(x) { 1 <script
3 return x + x; src="js/System/system.js"></script>
4 } 2 <script>
5 exports["double"] = double; 3 System.import('./js/ES6/main');
6 //# sourceMappingURL=adder.js.map 4 </script>
Gráfico 14. Resultado en CommonJS de compilar el Gráfico 16. Declaración del archivo ‘system.js
módulo ‘Adder con ES6 module-transpiler. mediante la etiqueta <script> y carga del archivo
‘main.js.
1 // 4
2 "use strict"; Resultado en consola de ejecutar la función double
3 var adder$$ = require("./adder"); por medio de SystemJS
4 console.log("El resultado de la
operación es: "
5 +adder$$["double"](2));
6 //# sourceMappingURL=app.js.map
Gráfico 15. Resultado en CommonJS de compilar el Figura 13. Resultado en consola de ejecutar la
script ‘main.js con ES6 module-transpiler. función ‘double’ del módulo ‘adder’ por medio de
Resultado en consola de ejecutar la función ‘double SystemJS.
por medio de ES6 module-transpiler
Diagrama de secuencia del sistema con el módulo
definido en ES6
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
28
Figura 14. Diagrama de secuencia del sistema con el para integrar componentes desarrollados en
módulo definido en ES6. lenguajes de servidor, pueda ser utilizado para
integrar componentes hechos enteramente en el
Además en ES6 se puede definir exportar solo un mismo lenguaje, demostrando que la creación de
recurso (objeto) por módulo similar a CommonJS, aplicaciones robustas con él es una realidad.
añadiendo el prefijo default al prefijo export.
También es posible importar módulos de manera Por otro lado, en los lenguajes de programación
condicional mediante la Programmatic Loader API y tradicionales para la creación de aplicaciones del
se pueden definir dependencias cíclicas entre lado del servidor (Java, .Net) existen modelos de
módulos [20]. componentes cuya función es estandarizar la
implementación, nombramiento, personalización,
A pesar de que hace falta un poco de trabajo extra composición, interoperabilidad, evolución y
para definir módulos en ES6 gracias a que ningún despliegue de componentes[23]. En JavaScript, por
navegador actualmente lo soporta (Y por unos meses su parte, no existe aún una definición de módulos o
seguirá siendo así), no dista mucho del trabajo que componentes estándar, pero se espera que esto
significa utilizar RequireJS por ejemplo; además cambie cuando ES6 sea soportado por los
cuando esta versión de JavaScript sea finalmente navegadores. Lo que tiene como principal objetivo
soportada, los módulos hechos ahora en ES6 serán mediar entre las distintas formas de crear módulos
migrados automáticamente [18]. Ya no serán (AMD, CommonJS, patrones, etc.) definiendo reglas
necesarias las herramientas intermediarias para su comunes y acabando por ende con El síndrome del
compilación e interpretación (ES6 module-transpiler salvaje oeste, al menos en este aspecto.
o SystemJS) y se tendrá una solución nativa (mejor
que el patrón módulo), lo que es sin duda es una Finalmente, aún en su versión ES6, JavaScript es
ventaja frente a APIs como AMD y CommonJS. permisivo en cuanto a que se pueden exportar más
que operaciones entre módulos, es decir se pueden
Como se mencionó antes existen muchas formas de compartir variables u objetos con estado. En ese
definir módulos que constituyan aplicaciones orden de ideas el estatus de componente estaría
mantenibles y con capacidad de evolución en reflejado más por las buenas prácticas del
JavaScript, sin embargo las anteriormente desarrollador que por el mismo lenguaje.
especificadas son las más utilizadas y sobre las que
existe mayor documentación. Sumado a esto, IV.Referencias
muestran de una manera clara que todo va
encaminado hacia el establecimiento de un estándar [1] S. Cass, “IEEE spectrum”, 19 de julio de 2014,
para definir módulos reutilizables en JavaScript [en línea]. Consultado el 14 de abril de 2014,
(exceptuando los servicios web que se incluyeron disponible en:
por la relevancia que está cobrando el estilo http://spectrum.ieee.org/computing/software/top-10-
arquitectónico SOA en la actualidad), objetivo que programming-languages
según la promesa se podrá conseguir en ES6.
[2] S. O'Grady, “RedMonk”, 14 de enero de 2014,
IV. Conclusiones [en línea]. Consultado el 14 de abril de 2014,
disponible en:
El concepto de componente o módulo ha venido http://redmonk.com/sogrady/2014/01/14/language-
cobrando trascendencia en los últimos años, gracias rankings-1-15/
a que son elementos que pueden constituir
aplicaciones o sistemas mantenibles, adaptables y [3] Tiobe, “Tiobe Software, the software quality
con capacidad de evolucionar sin importar su company”, abril de 2014, [en línea]. Consultado el
complejidad. En JavaScript existen multitud de 14 de abril de 2014, disponible en:
formas de crear aplicaciones con este tipo de http://www.tiobe.com/index.php/content/paperinfo/t
características mediante APIs (AMD, CommonJS y pci/index.html
todas las que surgieron a partir de CommonJS),
servicios web y de manera nativa (patrón módulo, [4] C. Ghezzi, D. Mandrioli y M. Jazayeri, “Software
sus derivados y ES6), lo que posibilita que ahora en Qualities and Principles”, Computer Science
lugar de ser un lenguaje de programación utilizado Handbook, Second Edition, Chapman & Hall/CRC,
http://revistas.udistrital.edu.co/ojs/index.php/tia
ISSN: 2344-8288 Volumen 1 No. 1 – Enero-Julio de 2014 – Revista TIA - Aplicaciones Modulares en JavaScript
29
[5] K. Lau, A. Nordin, F. Taweel and T. Rana, [16] C. Kankanamge, Web Service Testing with
“Constructing Component-based Systems Directly SOAPUI, Birmingham, Pack Publishing, 2012.
from Requirements using Incremental Composition”,
Proc. 36th EUROMICRO Conference on Software [17] M. Bolo, “Aquitectura de integración orientada
Engineering and Advanced Applications, 2010. a servicios”, INTERFACES, nº 1, pp. 19-46, 2006.
[6] C. Larman, Applying UML and patterns, Second [18] J. Franklin, “24 Ways to impress your friend”, 3
Edition, Prentice Hall, 2002. de diciembre de 2014, S.f., [en línea]. Consultado el
15 de mayo de 2014, disponible en:
[7] R. E. Noonan y . W. L. Bynum, “Scripting http://24ways.org/2014/javascript-modules-the-es6-
Lenguages”, Computer Science Handbook, Second way/
Edition, Chapman & Hall/CRC, pp. 2213-2230,
2004. [19] N. Stieglitz, “Wintellect Blogs”, 24 de marzo de
2014. S.f., [en línea]. Consultado el 15 de mayo de
[8] A. Kanavin, “An overview of scripting 2014, disponible en:
languages”, Lappeenranta, 2002. http://www.wintellect.com/devcenter/nstieglitz/5-
great-features-in-es6-harmony
[9] WebMonkey, “WebMonkey”, febrero de 2010,
[en línea]. Consultado el 27 de abril de 2014, [20] A. Rauschmayer, “2ality JavaScript and More”,
disponible en: 7 de septiembre de 2014. [en línea]. Consultado el 15
http://www.webmonkey.com/2010/02/scripting_lang de mayo de 2014, disponible en:
uage/ http://www.2ality.com/2014/09/es6-modules-
final.html
[10] P. Wayner, “InfoWorld”, 17 de octubre de
2011, [en línea]. Consultado el 28 de abril de 2014,
disponible en: [21] J. Franklin, “JavaScript Playground”, 8 de junio
http://www.infoworld.com/article/2620515/applicati de 2014. [en línea]. Consultado el 15 de mayo de
on-development/from-php-to-perl--what-s-hot-- 2014, disponible en:
what-s-not-in-scripting-languages.html?page=2 http://javascriptplayground.com/blog/2014/06/es6-
modules-today/
[11] A. Osmani, “Learning JavaScript Design
Patterns”, O'Reilly, 2014.
http://revistas.udistrital.edu.co/ojs/index.php/tia