viernes, 26 de noviembre de 2010

Lecciones: Herencia de Clases en JavaScript para webOS (parte 2 de 3)

Traducir / Translate

Continuamos esta serie de artículos sobre la herencia de clases en JavaScript para webOS. Realmente trataremos de explicar el manejo de la herencia de forma práctica en Mojo, el framework de JavaScript utilizado en HP webOS. 


En la parte 1 vimos la creación de clases y métodos de distintas formas. La más práctica es usando los mecanismos del framework Prototype.


Nota: Existen distintos tipos de mecanismos para trabajar la herencia de clases en JavaScript. La forma nativa es usando el prototipo de las funciones. Muchos piensan que es la mejor manera debido a que se usa una funcionalidad nativa del lenguaje y también porque facilita la legibilidad del código (con esto último no estoy de acuerdo). Mojo utiliza este mecanismo en los ejemplos que vienen en el SDK, pero también cuenta con el framework Prototype dentro de sus librerías. Personalmente prefiero este último mecanismo, que demuestra su justo valor en proyectos medianos y grandes donde el beneficio de la herencia de clases se hace más patente. También creo que es una manera más limpia de definir clases y métodos, y agrega alguna funcionalidad adicional que no es nativa del mecanismo de prototipos. Profundizaré en esto último en este artículo. Dicho todo esto, queda a elección del programador el mecanismo que quiera utilizar para conseguir sus fines.

Nota 2: JavaScript no tiene multi-herencia, aunque se las puede arreglar muy bien para simularla. Es un tema difícil y controvertido. Rara vez me he topado con la necesidad de crear una clase con varios padres. Lo cierto es que Prototype permite sólo un padre en la creación de una clase hija. Y en mi opinión, eso es acertado.


Parte 2: Llamadas a métodos de la clase padre, visibilidad de las propiedades y otras rutinas de uso común en herencia de clases.

Una clase hija no necesita llamar a métodos de la clase padre a menos que, en su definición, haya reescrito un método de ésta última. Hecho eso, es lícito que la clase hija pueda llamar al método dentro de la clase padre, y no el método propio. Para hacer eso, Prototype sugiere una forma muy ordenada:


ClasePadre = Class.create();
ClasePadre.addMethod({ 
  metodo1 : function(a) { return a*a; }
});
ClaseHija = Class.create(ClasePadre);
ClaseHija.addMethod({
   metodo1 : function($super,a,b) { return $super(a) * b; }
});


La clase hija claramente reescribe el metodo1, pero en su definición notamos cosas especiales:

  • El primer parámetro es $super, que es una referencia del método de la clase padre que estamos reemplazando. Por eso es que la llamada $super(a) funciona, que es el método del padre.
  • Es importante notar que en el uso del método de la clase hija NO es necesario inventarse un parámetro para poner en la posición de $super. Eso es automático!
  • No es necesario que la nueva definición sea idéntica a la original. De aquí que hayamos agregado un parámetro nuevo b, como ejemplo.

Ejemplo de llamada al método de la clase hija:



a = new ClaseHija();
b = a.metodo1(2,3);
//en b se almacena 12.


Es importante mencionar que en los constructores de las clases hijas se recomienda llamar a los de las clases padres. El método especial que inicializa una clase en Prototype es initialize:


ClasePadre.addMethod({
   initialize : function(value1) { this.value1 = value1; }
});
ClaseHija.addMethod({
   initialize : function(value1,value2) {
      $super(value1); //equivale a llamar al método initialize de la clase padre.
      this.value2 = value2;
   }
});


Ahora vamos a hablar de visibilidad de las propiedades. Ejemplo:


ClasePadre.Class.create({
   privada : 0, //propiedad privada
   initialize : function() {
      this.publica = 1; //propiedad publica
   }
});
ClasePadre.estatica = 2; //propiedad estática.
ClasePadre.addMethod({
   privilegiada = function() { if (0 <= privada) this.publica = privada; }
});


Aqui vemos varios niveles de visibilidad:

  • La variable "privada" sólo puede accederse desde dentro del código de ClasePadre. No es posible acceder a ella desde ninguna clase hija ni desde el exterior de la clase padre.
  • La  variable "publica" es visible desde todos los sitios. Es importante el uso del comando this.
  • La variable "estatica" no es parte ninguna instancia ni de la clase padre ni de las clases hijas. Sólo es accesible através de la ClasePadre directamente: ClasePadre.estatica = 2;

Ahora os dejo varias rutinas interesantes para aplicarlas a objetos:

//retorna un arreglo con los nombres de las propiedades de un objeto:
function propertyNamesToArray(obj) {
var res = []; //arreglo inicial vacio
if (undefined == obj || null == obj) return res; //no es un objeto
for (var prop in obj) res.push(prop); //ciclo por las propiedades
return res;
}

//retorna TRUE si el objeto es una instancia de una clase con métodos definidos.
function hasMembers(obj) {
//based in http://phrogz.net/js/hasOwnProperty.html
var res = true;
try {
for(var prop in obj) {
if (obj.hasOwnProperty(prop)) return true;
}
return false;
} catch(e) {
res = false;
}
return res;
}


Nos vemos en la parte 3!

Homebrew: Kernels de recuperación de webOS 2.0.0 y 2.0.1 ya están disponibles en Preware

Traducir / Translate

webos-internals acaba de informar que los kernels de recuperación de webOS 2.0.0 y 2.0.1 ya están disponibles en Preware 1.4.5 o superior. 


Naturalmente sólo funcionan en teléfonos Palm Pre 2. Aún se espera que HP libere la actualización a 2.0 para el resto de los teléfonos antes de fin de año.

jueves, 25 de noviembre de 2010

Noticias: Código fuente de webOS 2.0 liberado por HP

Traducir / Translate


HP ha liberado el código fuente de su sistema operativo webOS 2.0. (release 2.0.0)

La ruta a los ficheros es http://opensource.palm.com/2.0.0/index.html

HP continua dando pruebas de su compromiso con la comunidad Open Source.

miércoles, 24 de noviembre de 2010

Nuevo Foro para usuarios de HP webOS en Castellano

Traducir / Translate

¡Estrenamos nuevo foro de usuarios para complementar nuestro blog sobre HP webOS en Castellano!

La dirección es foro.webosencastellano.com

Esperamos que toda la comunidad, tanto usuarios como desarrolladores, se beneficie de esta poderosa herramienta de comunicación y entre todos promovamos este fantástico sistema operativo.

lunes, 22 de noviembre de 2010

Noticias: Enyo - El nuevo framework para HP webOS

Traducir / Translate

El viernes se celebró el Developer Day de HP webOS en Nueva York, y una de las mayores novedades fue la presentación de un nuevo framework de programación en JavaScript para webOS: Enyo, el cual reemplazará al actual Mojo aproximadamente en un año, aunque éste seguirá teniendo soporte, pero irá desapareciendo con el tiempo. La promesa es que Enyo estará disponible desde el 1ro de Enero de 2011.

Técnicamente Enyo proviene del equipo de desarrollo de Ares, el entorno de programación online que Palm puso a disposición de todos los desarrolladores, a partir del cual ya no es necesario instalar todo el entorno localmente en un PC sino que es posible desarrollar aplicaciones completas para webOS a través de dicho portal. Internamente, todas las aplicaciones actualmente desarrolladas con Ares ya tienen una versión de Enyo (OpusJS, que es como se le conocía anteriormente) dentro de su código JavaScript.

Es mucho más eficiente que Mojo (¡el arranque de la aplicación se reduce a la séptima parte del tiempo!) y ha sido especialmente diseñado para dispositivos con poca memoria RAM. Es mucho más sencillo/facil de usar y totalmente orientado a objetos. El rendering también es increíblemente más rápido (¡la aceleración de video por hardware ya viene incluida!). En el vídeo se ha presentado inclusive una aplicación de email para demostrar las bondades del nuevo framework en pleno funcionamiento.


Otra cosa muy importante es que se adapta más fácilmente a dispositivos con una pantalla mucho mayor que la de un teléfono Palm Pre, que será idóneo para los futuros dispositivos que HP ha dicho que pondrá en el mercado próximamente (tablets con webOS!, etc.).





Aquí teneis el video (en Inglés) de la presentación realizada en el Developer Day presentado por Matthew McNulty, Director de herramientas y frameworks para webOS en HP, y Scott Miles, Arquitecto de Ares y Enyo en HP.



Fuentes:
PowerPDA: Enyo: El nuevo entorno de trabajo de webOS
Precentral: Preview: Enyo app framework for webOS