Vars de espacio de nombres entre clases

sinopsis

  1. ¿Cómo se declaran variables en un espacio de nombres mientras se usa el use ¿declaración? (es decir, sin declarar el espacio de nombres con el nombre de la variable)
  2. ¿Cómo hace referencia a las variables del espacio de nombres con la declaración de "uso" sin una referencia de contenedor? (es decir., trace(foo) más bien que trace(a.foo) [Parece un poco inútil si tengo que decir esto después de haber cambiado al espacio de nombres])

Explicación

Habiendo leído el libro de Grant Skinner "Guía completa para usar espacios de nombres", y otros artículos, como el de Jackson Dustan "Mejor programación orientada a objetos a través de espacios de nombres", me quedo con las preguntas anteriores sin respuesta. Siento que me falta un principio básico, pero parece que no puedo hacer que los espacios de nombres funcionen. Los siguientes ejemplos están escritos para usar con Flash IDE, así que suponga lo siguiente...


locus.as

package com.atriace {
    public namespace locus = "atriace.com";
}


testA.as

package com.atriace {
    public class testA {
        import com.atriace.locus;
        locus var foo:String = "Apple";

        public function testA() {}
    }
}


pruebaB.as

package com.atriace {
    public class testB {
        import com.atriace.locus;
        use namespace locus;

        public function testB() {
            trace(foo);
        }
    }
}


Clase de documento:

import com.atriace.testA;
import com.atriace.testB;

var a:testA = new testA();
trace(a.foo); // results in "Apple"

var b:testB = new testB(); // compile error: variable "foo" not defined.


Problema #1

En mi opinión, un espacio de nombres es poco más que un objeto para contener variables que tienen acceso a nivel de alcance. Ergo, global es un espacio de nombres visible para todas las funciones (ya que es el ámbito raíz), local es un espacio de nombres (específico de los ámbitos actual y secundario), y así sucesivamente. Si es verdadero, cambiar a un espacio de nombres con use debería permitirle simplemente declarar variables que existen tanto en el espacio de nombres local como en el personalizado. Por ejemplo:

use namespace locus
var bar:String = "test"; // this now *should* exist in both local & locus scope/namespace.

Como no conozco un método para iterar sobre un espacio de nombres como un objeto normal, no sé si esto es lo que sucede. Además, no he visto ningún caso en el que alguien haya declarado una variable de espacio de nombres personalizada de esta manera, por lo que asumo que las variables de espacio de nombres siempre deben definirse explícitamente.


Problema #2

Usted podría preguntar, "¿cuál es el objetivo aquí?" En pocas palabras, queremos un grupo dinámico de variables y métodos que cualquier clase nueva pueda agregar (dentro del mismo paquete). Al cambiar a este espacio de nombres antes de llamar a los métodos, podemos reducir la palabrería de nuestro código. Entonces, class.method() se vuelve justo method().

In pruebaB.as esperaríamos que ocurriera un error si nunca importamos el testA.as clase y lo instanciado; especialmente porque foo no es un miembro estático de la clase (ni queremos que lo sea). Sin embargo, dado que hemos instanciado foo al menos una vez, el espacio de nombres locus ahora debería tener una variable llamada foo, lo que significa que cuando pruebaB.as se crea una instancia y el constructor busca un valor para foo, el espacio de nombres ya tiene uno.

Obviamente, hay una falla en este pensamiento ya que el compilador de Flash se queja de que foo nunca ha sido declarado, y la única forma en que puedo hacer referencia foo de la clase de documento es haciendo referencia al contenedor (es decir, a.foo en lugar de simplemente cambiar al espacio de nombres con el uso y rastrear foo directamente).

Por el bien del argumento, ni la herencia ni los miembros estáticos son una solución a este dilema. Este es tanto un ejercicio para aprender mejores técnicas de código como una respuesta a la estructura de una gran clase de utilidad que tiene dependencias complicadas. Dada la ausencia de una variable/método, simplemente podría codificar a su alrededor.


Sé que no es un tema muy documentado, por lo que espero que algún sabio aquí pueda ver lo que me estoy perdiendo. La ayuda sería muy apreciada. :)

preguntado el 22 de mayo de 12 a las 20:05

Creo que todo está bien explicado aquí: leichtgewicht.at/718/mastering-as3-namespaces Evito copiar y pegar del contenido de otra persona :) -

Parece que desea usar espacios de nombres para obtener un estado mutable global (que es más anti-oop que oop) misko.hevery.com/code-reviewers-guide/…. Si vas a hacer esto, al menos usa Singleton, porque los desarrolladores que te siguen al menos tienen una mejor oportunidad de entender lo que hiciste y por qué. -

Es posible que hayas entendido mal qué son los espacios de nombres... :) -

1 Respuestas

"usar espacio de nombres" es para el lado del consumidor. Siempre debe incluir el espacio de nombres en cualquier declaración:

Mi espacio de nombres var foobar : uint;

Si desea agregar variables globales de paquete con espacio de nombres (no debería hacerlo como regla general), debe definir cada una de ellas en un archivo .as separado, ya que los paquetes solo permiten una definición visible públicamente por archivo en la parte superior. nivel.

En su ejemplo anterior, está utilizando espacios de nombres incorrectamente. Un espacio de nombres puede abarcar varias clases, pero no logra la funcionalidad entre clases que está buscando. Este es más el dominio de la programación orientada a aspectos.

Respondido 10 Jul 12, 16:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.