Comprensión de variables, matrices, bucles y nulos la analogía de las notas post-it

Que hace var En realidad, y por qué no se configura myObject = null en realidad eliminar el objeto? Estas preguntas se relacionan con un concepto fundamental en la codificación, relevante si su idioma de elección es AS3, JavaScript o C #, y puede entenderse utilizando algunos elementos comunes del armario de papelería..


Qué es una variable?

Empecemos con lo básico. Supongamos que quieres guardar la edad de tu amigo Bill:

 var ageOfBill: Number = 24;

(Voy a usar AS3 para estos ejemplos, pero los conceptos básicos son los mismos en JavaScript y C #.

En JavaScript, la sintaxis es casi la misma, pero no especificamos que la edad sea un número:

 var ageOfBill = 24;

En C # no usamos el var palabra clave, pero sí especificamos el tipo de la variable:

 ageOfBill corto = 24;

No lo suficientemente diferente como para ser confuso, espero.

Entonces, ¿qué está pasando aquí? Piénsalo de esta manera:

  • var (o corto, en C #) significa "obtener una nueva nota de Post-it".
  • ageOfBill significa "escribir ageOfBill en la parte superior, en la pluma ".
  • = 24 significa "escribir 24 en la nota, a lapiz.

¿Y si más tarde nos damos cuenta de que Bill es en realidad más joven de lo que pensábamos??

 var ageOfBill = 24; // ... más tarde ... ageOfBill = 20;

Esto solo significa que encontramos nuestro ageOfBill nota, borrar 24, y escribe 20 en lugar de eso.

Nosotros podría escribir var otra vez:

 var ageOfBill: Number = 24; // ... más tarde ... var ageOfBill: Number = 20;

... pero este no es un buen código, porque var dice, "obtener una nueva nota de Post-it". Si hace esto, el compilador usualmente descubrirá lo que quiere decir, es decir, que desea cambiar lo que está escrito en el documento existente. ageOfBill Nota post-it en lugar de obtener una nueva, pero probablemente se quejará.

 Advertencia: # 3596: Definición de variable duplicada.

Depende del idioma y de tu entorno de codificación..

Entonces, ¿podemos pedirle al compilador que obtenga una nueva nota Post-it y escriba una etiqueta en el lápiz, sin escribir nada en el lápiz? Tal vez podríamos hacer esto por el amigo de Bill, Marty, cuya edad desconocemos:

 var ageOfMarty: Number;

En realidad (en AS3, al menos) esto obtendrá una nueva nota Post-it, escriba ageOfMarty en la parte superior, en la pluma ... y luego escriba un valor inicial predeterminado de 0 allí a lápiz

Entonces, en otras palabras, no podemos tener una nota Post-it como esta sin que tome algún valor.

De acuerdo, ¿qué tal si queremos guardar la edad del mejor amigo de Bill, Ted, que sabemos que es la misma edad??

 var ageOfTed: Number = ageOfBill;

Lo que pasa aquí es que la computadora mira el ageOfBill Post-it, luego copia el número escrito en lápiz en un nuevo Post-it, en el que escribe ageOfTed en la parte superior en la pluma.

Esto es solo una copia, sin embargo; Si luego cambiamos el valor de ageOfBill no afectará ageOfTed:

 ageOfBill = 21;

¡Asi que! Eso es bastante sencillo, e incluso puede ser intuitivo. Ahora hablemos del primer punto común de dolor: las matrices..


¿Qué es una matriz?

Piense en una matriz como una carpeta de anillas.

(Iba a decir un rolodex ...

... pero me di cuenta de que nunca había visto uno en la vida real.

Cada hoja dentro de la carpeta es como una de esas notas Post-it, excepto sin la etiqueta escrita con lápiz en la parte superior. En su lugar, nos referimos a cada hoja por el nombre de la carpeta y el número de página de la hoja.

Supongamos que tenemos una selección de todos nuestros amigos, sin ningún orden en particular. Quién está en la primera página (página # 0)?

 traza (amigos [0]);

(rastro() simplemente escribe la línea en la salida de depuración; en JavaScript, puedes usar console.log () y en C # podrías usar Console.WriteLine () para el mismo propósito.)

Es bill!

Entonces, ahora, ¿qué hace la siguiente línea?

 var firstFriend: String = friends [0];

Recibe una nueva nota de Post-it (debido a la var palabra clave), escribe primer amigo en la parte superior con lápiz, luego copia lo que está escrito en la primera página de la carpeta en esa nota con lápiz.

(Recuerda, Cuerda solo significa un pedazo de texto.)

Podemos sobrescribir lo que está escrito en cualquier página del cuaderno, al igual que con las Notas Post-it:

 amigos [0] = "Kyle";

... y por supuesto esto no afecta a la primer amigo Publícalo.

El cuaderno es una analogía adecuada, porque, al igual que con una matriz, saca páginas, agrega nuevas y las reorganiza. Pero recuerde, las páginas individuales actúan como las notas Post-it, excepto que no tienen sus propias etiquetas de rotuladores, solo los números de página..

Todavía bastante sencillo, espero. Así que aquí hay una pregunta interesante: ¿qué sucede cuando haces lo siguiente??

 var listOfNames: Array = friends;

Uh ...


No puedes escribir eso en un post-it

He engañado un poco aquí, porque hablé un montón de arreglos sin explicar cómo creamos uno en primer lugar. Así que vamos a abordar eso ahora.

Supongamos que escribe:

 amigos var: Array = ["Bill", "Marty", "Ted"];

… Lo que pasa?

Bueno como siempre, var amigos Significa que obtenemos una nueva nota de Post-it y escribimos. amigos en la parte superior, en la pluma:

¿Pero qué escribimos en él a lápiz??

Es una pregunta trampa: no escribimos. cualquier cosa.

Ver, Formación significa, "obtener una nueva carpeta de anillas". Y ["Bill", "Marty", "Ted"] significa "poner tres páginas en la carpeta, con estos nombres":


No puedes ver las páginas de "Marty" y "Ted", pero están totalmente ahí.

¿Y entonces? ¡Es sencillo! Pegamos el amigos Post-it nota a la portada de la carpeta:

Ahora, cuando escribimos:

 traza (amigos [0]);

… Sabemos que tenemos que encontrar el Post-it etiquetado amigos, luego mire lo que esté escrito en la primera página (página 0) de la carpeta en la que está pegado.

En realidad, hay muy pocos tipos de variables en las que un valor se escribe en una nota Post-it a lápiz. En AS3, los únicos tipos de este tipo (llamados "primitivos") son:

  • Número
  • Cuerda
  • En t
  • uint
  • Booleano

Para todo lo demas - Objeto, Clip de película, XML, y así sucesivamente: pegamos la nota Post-it en el artículo mismo.

(Los detalles son un poco diferentes en JavaScript y C #, pero en general se aplica la misma idea).

Así que volvamos a nuestra pregunta anterior. Cuando escribimos:

 var listOfNames: Array = friends;

… lo que pasa?

Una vez más, sabemos que var listOfNames significa "obtener una nueva nota de Post-it y escribir listOfNames en la parte superior de la pluma ". Y ahora sabemos que Formación significa que pegaremos la nota Post-it a algo (una carpeta), en lugar de escribir algo en el Post-it a lápiz.

Anteriormente, cuando hemos hecho algo similar, hemos copiado el contenido de una nota Post-it en otra. Entonces, aquí deberíamos obtener una nueva carpeta nueva y copiar todas las páginas del amigos aglutinante?

¡En realidad no! Todo lo que hacemos es pegar este nuevo. listOfNames Nota post-it en la misma carpeta que la amigos Nota adhesiva.

Ahora, amigos y listOfNames cada uno se refiere a la exactamente la misma matriz. Así que si escribimos:

 listOfNames [0] = "Emmett";

… entonces amigos [0] será además ser Emmett, porque listOfNames [0] y amigos [0] ¡Refiérase exactamente a la misma página en exactamente la misma carpeta! Y debido a que esa página solo contiene una Cadena (que es un tipo "primitivo", recuerde), entonces hemos borrado todo lo que estaba escrito en esa página previamente y escrito Emmett en lugar de eso.


Entonces que hace nulo Media?

Visto asi, nulo Es bastante fácil de entender. Esta declaración:

 amigos = nulo;

... solo significa, "quitar el amigos Nota de post-it de lo que está pegado actualmente a ".

los amigos Post-it todavia existe, Simplemente no está pegado a nada. Así que si escribes:

 traza (amigos [0]);

o

 amigos [0] = "Henry";

... entonces obtendrá un error, porque está intentando hacer referencia a la primera página del cuaderno que amigos El post-it está pegado a - pero no está pegado a nada!

Así que, para ser claros, establecer amigos = nulo no afecta a la carpeta en absoluto. Todavía se puede acceder a ella a través de listOfNames. E incluso puedes escribir:

 friends = listOfNames;

... para volver a la vieja situación:


Recolección de basura

Como dije, poniendo amigos = nulo no afecta directamente a la carpeta, pero puede tener un indirecto efecto.

Mira, si no hay notas Post-it pegadas en la carpeta, entonces no hay manera de que nadie acceda a la carpeta nunca más. Simplemente se recostará alrededor, totalmente inaccesible. Pero tener todas estas carpetas (y otros objetos) tirados, totalmente abandonados, es un verdadero desperdicio de espacio: están saturando la memoria de la computadora.

Ahí es donde el recolector de basura entra. Esta es una herramienta que comprueba periódicamente si hay objetos "perdidos" y los arroja a la basura. Una vez que se han ido, se han ido para siempre. Si una matriz se recolecta como basura, todas sus páginas también lo son..

Para la mayoría de los propósitos prácticos, esto no te afecta en absoluto; los objetos solo se recolectan en la basura si están perdidos y no pueden ser encontrados por su código. Si tiene muchos de estos dispositivos por ahí, es posible que note un ligero retraso de vez en cuando, cuando el recolector de basura haga su trabajo (se necesita un poco de tiempo para recolectar la basura de manera activa). El beneficio es que esto aclara más espacio (memoria) para su aplicación.

(Si desea saber más sobre este tema, lea las publicaciones de Daniel Sidhion sobre la recolección de basura y la agrupación de objetos).


Arreglos de objetos

Bueno, hay un concepto más que entender, y es el más complejo hasta ahora..

Considera este fragmento:

 var firstFriendDetails: Array = ["Bill", 20]; var secondFriendDetails: Array = ["Marty", 16]; var thirdFriendDetails: Array = ["Ted", 20]; var allFriends: Array = [firstFriendDetails, secondFriendDetails, thirdFriendDetails];

Como diablos hace ese trabajo?

Vamos a empezar con lo que sabemos. Las primeras tres líneas son fáciles; para cada uno nosotros:

  • Obtener una carpeta nueva.
  • Insertar una página con el nombre del amigo escrito en lápiz..
  • Para insertar otra página con la edad del amigo escrita en lápiz.
  • Obtenga un nuevo Post-it y escriba la etiqueta correspondiente en la parte superior con un bolígrafo..
  • Pegue el Post-it a la carpeta.

En cuanto a esta línea:

 var allFriends: Array = [firstFriendDetails, secondFriendDetails, thirdFriendDetails];

... vamos a necesitar un poco de cuerda y algo de cinta.

Podemos pensar que esa línea es equivalente a este fragmento:

 var allFriends: Array = []; allFriends [0] = firstFriendDetails; allFriends [1] = secondFriendDetails; allFriends [2] = thirdFriendDetails;

La primera línea es fácil: obtenga una carpeta nueva y una nota Post-it nueva, escriba todos los amigos en la nota Post-it, y péguela en la carpeta.

En cuanto a la segunda línea:

 allFriends [0] = firstFriendDetails;

Recuerda que dije que cada página en una carpeta es como una nota Post-it, excepto que no hay nada escrito en la pluma. Si la primera página fuera un Post-it, entonces simplemente lo pegaríamos al frente del firstFriendDetails carpeta, derecha?

... pero no puede ser tanto en el frente de esa carpeta y dentro de la otra carpeta. Entonces, en su lugar, usamos cadena:

Lo mismo para los otros dos:

Así que cuando queramos saber qué. todos los amigos [2] se refiere a, acabamos de abrir el todos los amigos enlazar a esa página y seguir la cadena - que, por supuesto, conduce a la ThirdFriendDetails aglutinante.

Del mismo modo, para todos los amigos [1] [0], Primero averiguamos qué carpeta todos los amigos [1] Se refiere a, y luego nos fijamos en la primera página de ese carpeta ... entonces todos los amigos [1] [0] es Marty!


Bucles

Ahora junte toda esa información y téngala en cuenta al leer este fragmento de código:

 amigos var: Array = ["Bill", "Marty", "Ted", "Emmett", "Henry"]; var currentIndex: int = 0; var currentFriend: String; while (currentIndex < 5)  currentFriend = friends[currentIndex]; trace(currentFriend);  var lastFriend:String = currentFriend; trace(lastFriend);

¿Qué pasa si modificamos el valor de amigo actual dentro del bucle?

 amigos var: Array = ["Bill", "Marty", "Ted", "Emmett", "Henry"]; var currentIndex: int = 0; var currentFriend: String; while (currentIndex < 5)  currentFriend = friends[currentIndex]; currentFriend = "Herbert"; trace(currentFriend);  trace(friends[0]);

¿Qué pasa si la matriz contiene objetos no primitivos (MovieClips, imágenes, matrices, objetos 3D, lo que sea)?

 var friends: Array = [firstFriend, secondFriend, thirdFriend, quarterFriend, fifthFriend]; var currentIndex: int = 0; var currentFriend: MovieClip; // o ": Image" o ": Object" o ": Array" o lo que sea mientras (currentIndex < 5)  currentFriend = friends[currentIndex]; currentFriend = sixthFriend;  //What is the value of friends[0] now?

Finalmente, ¿qué pasa si la matriz contiene otras matrices, que a su vez contienen primitivas?

 var firstFriendDetails: Array = ["Bill", 20]; var secondFriendDetails: Array = ["Marty", 16]; var thirdFriendDetails: Array = ["Ted", 20]; var fourthFriendDetails: Array = ["Emmett", 50]; var fifthFriendDetails: Array = ["Henry", 36]; var friends: Array = [firstFriendDetails, secondFriendDetails, thirdFriendDetails, fourthFriendDetails, fifthFriendDetails]; var currentIndex: int = 0; var currentFriend: Array; while (currentIndex < 5)  currentFriend = friends[currentIndex]; currentFriend[0] = "John"; currentFriend = ["Herbert", 29]; 

¿Qué te parece el valor de amigos [3] [0] será después de eso?


Otros Bits y Piezas

Aquí hay algunas otras notas importantes que debe saber:

Objetos

En AS3 y JavaScript, los objetos son como matrices, excepto que cada página es mencionada por una etiqueta en lugar de por su número de página. Así que puedes escribir:

 var detailsOfBill: Object = ; // "" significa "crear un objeto" detailsOfBill.title = "Esquire"; detailsOfBill.bandName = "Wyld Stallyns"; detailsOfBill.allNames = ["Bill", "S.", "Preston"];

… y esto es mas o menos como conseguir una carpeta nueva, pegando un detalles de la cuenta Post-it en el frente, y llenándolo con tres páginas. La primera página tiene la etiqueta. título escrito en la parte superior en la pluma y la palabra don escrito en ella a lapiz la segunda página tiene la etiqueta nombre de banda en la pluma y Wyld Stallyns a lapiz La tercera página tiene la etiqueta. todos los nombres pero no tiene nada escrito a lápiz; en cambio, una cadena la adjunta a otra carpeta normal, cuyas páginas no están etiquetadas: la primera página dice Cuenta, el segundo dice S., y el tercero dice Preston, todo a lapiz.

(Para hacer que las cosas sean aún más confusas, las matrices son técnicamente una forma especial de Objeto. ¡Y si crees que eso es malo, las funciones también se pueden ver como un tipo de Objeto! Pero ese es un tema para un artículo futuro ...)

Más sobre la recolección de basura

Dije que los objetos se recolectan como basura si no tienen notas Post-it pegadas a ellos, pero esto es una simplificación excesiva. Si una página de una carpeta apunta a un objeto a través de una cadena (es decir, si myArray [0] = myObject o similar), entonces ese objeto no será recolectado como basura. Lo mismo ocurre si una página de una carpeta apunta a otra carpeta (matriz), o si la página de una carpeta de objetos apunta a otra carpeta de objetos ... y así sucesivamente. Incluso se aplica si la única forma de acceder al objeto es a través de un Post-it pegado a una carpeta que tiene una página vinculada a otra carpeta, tantas capas de profundidad como desee..

Básicamente, el recolector de basura solo recolecta un artículo si no puede ser alcanzado a través de cualquier otra variable.

Esto explica por qué los objetos que están en la pantalla generalmente no pueden ser objetos recolectados. En AS3, si un MovieClip u otro tipo de DisplayObject está en la lista de visualización, entonces se agrega automáticamente a lo que es esencialmente una matriz oculta de objetos de visualización (a los que puede acceder a través de getChildAt ()). Existen estructuras similares en JavaScript y C #. Por lo tanto, si hay un gráfico en la pantalla y elimina todas las referencias a él de las variables, las matrices y los objetos, no se recogerá la basura hasta que lo elimine de la lista de visualización.


Alguna pregunta?

Espero que esto ayude a aclarar las cosas. Sin duda, es un concepto confuso cuando lo encuentras por primera vez: algunas variables realmente contienen un valor, mientras que otros simplemente contienen una referencia a un objeto. No se preocupe si no está 100% seguro de lo que está pasando; tendrá mucho más sentido después de un poco de práctica (¡y algunos errores!).

Sin embargo, si tiene alguna pregunta específica al respecto, solo incluya un comentario a continuación y haré lo mejor para responder.

Gracias por leer!