2011-06-02 21 views
6

¿Qué herramientas se pueden utilizar para transmitir conceptos como el alcance y cierre de variables de JavaScript claramente en algo similar a los diagramas de secuencia UML? Por ejemplo, ¿cómo puede código como el siguiente: (the Infamous Loop Problem)Diagramas para las funciones de JavaScript

var arr = []; 
for(var i=0; i<10; i++) { 
    arr.push(function() { alert(i); }); 
} 
for(var j=arr.length;j--;) { 
    arr[j](); 
} 

... se explicará claramente en un diagrama similar a ésta:

A blank UML sequence diagram

+5

Ese código no hace lo que usted cree. Cada alerta alertará el último valor de 'i'. Es el clásico problema de la función en un bucle. –

+0

Su ejemplo alertará '10' en cada iteración. Ver http://stackoverflow.com/questions/5555464/javascript-closure-of-loop – lawnsea

+3

@lawnsea @Matt Ball - Lo usé exactamente por esa razón; porque es el ejemplo clásico. –

Respuesta

6

el código es un arbitraria ejemplo. El código no tiene nada que ver con la pregunta, simplemente demuestra un código a menudo engañoso que podría beneficiarse de su descripción.

No se puede describir el cierre y el alcance en UML. Simplemente no hay soporte para eso, de todos modos no en diagramas de secuencia. Los cierres en JavaScript son un poco como definir una clase en Java o C#, no lo pones en tu UML. Hmm, no puedo explicar esto muy bien ...

Cierres es algo que tienes que entender intrínsecamente como un programador de JavaScript.

En qué debe enfocarse su UML son las entidades y su interacción. No es un lenguaje 'peculiar' (si se quiere) como la necesidad de cierres.

Estoy a favor de describir el código engañoso, pero un diagrama UML no es el lugar adecuado. Ponlo en los comentarios en el código fuente. Si alguien quiere saber cómo funciona esta función, mirará el código fuente. Si él no quiere saber, no lo molestes con eso.

+1

Especialmente porque la pregunta pide "explicar claramente" esta es la respuesta correcta. No puedes. Al extender sus diagramas UML con notación personalizada que no sea UML, podría representarlos. Pero no así. – Kissaki

+0

+1 - "No" es una respuesta justa ... ¿pero alguna idea sobre cómo transmitir la interacción de esas entidades? Incluso en un formato no UML? –

+0

¿Usa un diagrama de secuencia (UML)? Así es como describes la interacción de la entidad. – Halcyon

6

Me gustan los diagramas de Dmitry Soshnikov utilizados en JavaScript. The Core para explicar el contexto de ejecución y las cadenas de alcance. En los comentarios, dice que se hicieron en Visio (no es que la herramienta sea lo importante aquí, sino los conceptos que las estructuras ayudan a transmitir).

puedo ver cómo diagramas similar podría ser usado para demostrar cómo cada función creada en el código de ejemplo, termina por acceder a una variable i en el mismo ámbito, y cómo en una versión fija del código, cada función se lleva alrededor otro elemento a la cabeza de su cadena de alcance, con una variable que mantiene el valor actual de i en el momento en que se cerró el alcance que lo contiene.

+0

Esto parece interesante. Esperaba algo más secuencial, pero esto parece muy prometedor. +1 –

0

Los cierres de JavaScript son anonymous objects. Representarlos en los diagramas de secuencia es complicado, pero creo que se puede hacer así:

JavaScript Closure UML

En este caso, el principal ámbito de aplicación crea el cierre en un bucle y luego recurre a ellos. El cierre es anónimo y pertenece a la clase general 'Cierre'.

En otros casos, el cierre podría ser creado, nombrado, pasa a otro objeto y luego se invoca de ese objeto:

enter image description here

+0

Los cierres no tienen que ser anónimos. Cualquier función que devuelva una función interna (u objeto con una referencia a una función interna) creará un cierre – Ryan

2

Sé que esto ya está contestada, pero aquí es un buen ejemplo de el uso de diagramas de objetos para explicar las funciones, los cierres, los objetos en JavaScript

https://howtonode.org/object-graphs

Los gráficos se construyen con archivos de texto (en notación de puntos) y luego son generados automáticamente usando Gra phViz

El autor, Tim Caswell, ha incluido enlaces a los archivos de origen en su cuenta de GitHub

enter image description here

Cuestiones relacionadas