Paquetes y namespace
Mar 16, 2009 | Español | By Crysfel | 6 Comments | Read in EnglishEs importante tener en cuenta que otros desarrolladores o usuarios pueden utilizar nuestro código, además de que necesitamos crear código que pueda ejecutarse con alguna otra librería sin tener ningún problema.
En mi experiencia me ha tocado trabajar en proyectos donde las variables están declaradas en el “global scope” generando problemas realmente extraños y difíciles de rastrear, es en esos momentos cuando te das cuenta de la importancia de empaquetar nuestras aplicaciones.
JavaScript no tiene un palabra reservada que nos permita empaquetar nuestros objetos como en lenguajes Java o C#, pero tomando en cuenta que los objetos pueden alojar otros objetos podemos solucionar este problema de la siguiente manera.
//Se crea el objeto com
var com = {};
//se le agrega el objeto quizzpot
com.quizzpot = {};
//se crea el "paquete"
com.quizzpot.tutorial = {};
//Se agrega un constructor de objetos
com.quizzpot.tutorial.Person = function(options){
this.name = options.name;
}
//se crea una instancia
var p = new com.quizzpot.tutorial.Person({name:'John'});
//se imprime en consola
console.debug(p);
De esta manera se crea un espacio robusto de nombres, con esto nos evitaremos que alguien más cree un objeto “Person” y sobrescriba el nuestro.
Si cada vez que creamos una función constructora creamos todo el paquete podemos sobrescribir paquetes existentes, para evitar esto debemos verificar si el paquete ya existe, de ser así utilizar el existente y agregar los que sean necesarios, eso lo hacemos de la siguiente manera:
//verificamos si existe la variable "com" para usarla,
//si no existe creamos un objeto vacío
var com = com || {};
//hacemos el mismo procedimiento
com.quizzpot = com.quizzpot || {};
com.quizzpot.tutorial = com.quizzpot.tutorial || {};
//creamos el constructor del objeto
com.quizzpot.tutorial.User = function(options){
this.nickname = options.nickname;
}
//se crea una instancia
var p = new com.quizzpot.tutorial.Person({name:'John'});
var u = new com.quizzpot.tutorial.User({nickname:'stock'});
//se imprime en consola
console.debug(u);
console.debug(p);
Para evitar todo el proceso de comparar la existencia de los objetos a la hora de formar los paquetes, podemos utilizar una herramienta de Ext JS, de la siguiente manera:
Ext.namespace('com.quizzpot.tutorial');
//o bien el siguiente atajo
Ext.ns('com.quizzpot.tutorial');
De esta manera creamos el paquete deseado y si existe no lo sobrescribe, simplemente utiliza el anterior.
Conclusiones
Aunque en JavaScript no exista una palabra reservada para crear paquetes, como es el caso de otros lenguajes, si podemos implementar esta técnica ya que sí se puede alojar un objeto dentro de otro objeto. Es importante recordar que al definir el nombre de los “paquetes”, debemos verificar si existen para no sobreescribirlos.
Cualquier sugerencia, duda o comentario es bienvenido y por supuesto los votos en Digg o en tu red social favorita.







Es muy importante, para cuando se esta empezando, uno ve los ejemplos y se pregunta para que es la instrucción Ext.ns(‘com.quizzpot.tutorial’); .
Saludos y gracias.