martes, 21 de diciembre de 2010

TUTORIAL: Desarrollo de aplicaciones para bada (X)

Fundamentos de bada

Antes de empezar a entrar en más detalles del desarrollo de aplicaciones para bada, es bueno que veamos las peculiaridades de la plataforma bada y las diferencias más significativas entre el C++ estándar y el C++ de bada SDK.

La  plataforma bada

La paltaforma bada está escrita en C++ (todos los frameworks, componentes de alto nivel y las librerías), con un poco de código en C (interfaces de kernel, componentes de bajo nivel).
La UI de bada, las aplicaciones nativas, etc. que incorporan los teléfonos como parte de la plataforma contienen código 100% C++.
Sin embargo, a la hora de desarrollar aplicaciones, los usuarios pueden optar entre C++, Flash y Webkit (el navegador nativo Dolfin está basado en Webkit, con soporte para HTML 5).

C++ es un lenguaje potente, soportado por estándares y herramientas como Eclipse IDE y el compilador GNU C++.
Sus principales inconvenientes son:
- Gestión de memoria: el programador es el responsable de liberar la memoria que no esté en uso
- Gestión de excepciones: el mecanismo estándar de gestión de excepciones consume mucha memoria
- Falta de tipos string y array nativos

Para intentar mejorar estos aspectos, bada impone algunas limitaciones a los desarrolladores limitando el uso de algunas características de C++.

En particular:

1. El código de plataforma de bada usa una construcción en 2 fases:


Los dos pasos son los siguientes:
- Reservar memoria: reservar memoria dinámicamente para el nuevo objeto
- Completar la construcción: debería incluir la creación de todos los objetos que requieran reserva de memoria dinámica 

De esta manera, si algo fuera mal se podría capturar una excepción consultando la variable r, de tipo result.

2. Existe una política de propiedad: la aplicación siempre es responsable de eliminar la memoria que se reserve y los objetos puestos en memoria por la plataforma (los retornados por los métodos de la plataforma cuyo nombre acaba en N, por ejemplo SearchN()). En resumen:

- Por cada new debe haber un delete y una asignación a null. Ejemplo:

a = new Clase();
trabajar_con_a();
delete a;
a = null;

- Por cada ...N() debe haber un delete y una asignación a null. Ejemplo:

a = SearchN();
trabajar_con_a();
delete a;
a = null;

3. No se usan los strings nativos de C++, la plataforma bada proporciona una clase String

4. No se usan los arrays nativos de C++, la plataforma bada proporciona una clase Array

5. No se da soporte a las excepciones estándar de C++, bada proporciona su propio modelo de excepciones

El problema de la construcción de objetos

En C++, como en C, la memoria se puede clasificar en:
- Memoria estática, asignada por el compilador y parte del ejecutable en tiempo de ejecución
- Memoria de pila, reservada y liberada en tiempo de ejecución por el sistema operativo
- Memoria basada en heap, reservada y liberada dinámicamente por el programa

Las pérdidas de memoria son causadas cuando los programas reservan memoria para algún objeto y por algún motivo no la liberan cuando finalizan su tarea. Este problema es particularmente serio en dispositivos móviles, que pueden estar encendidos mucho tiempo y que cuentan con poca memoria, entre otros aspectos.
En C++ la reserva de memoria heap puede efectuarla el programador explícitamente mediante llamadas a new o new[], o el compilador como parte de la creación de objetos de C++.
Los destructores deben programarse con cuidado.
El primer problema de los destructores es que en C++, cuando falla el constructor, el destructor no se invoca.

Los objetos C++ se crean cuando se invoca al operador new en el constructor de una clase. La memoria reservada para un objeto en C++ debe ser liberada con una llamada a delete, que a su vez invoca al destructor de la clase.
Pero si falla el constructor, como el objeto es null, el destructor no puede ser invocado, ya que intentar eliminar un objeto null resultaría en una excepción "null pointer". En estos casos ni el programa ni el sistema tienen manera de liberar la memoria "huérfana".

Otro problema relacionado con la memoria es que, a veces, los métodos del framework necesitan que el framework reserve memoria para un objeto y luego lo devuelva a la aplicación invocante. Sin embargo, una vez el objeto es deveuelto per el framework, y el objeto pasa a ser propiedad del invocante, el framework es incapaz de saber cuando ese objeto ha finalizado su trabajo. Para solucionar esto, se sigue la convención de poner una "N" al final del nombre del método del framework, para que sepamos que debemos hacer un delete del objeto que nos devuelva, como he explicado antes.

Gestión de excepciones

En bada, los errores pueden ser capturados y gestionados, o propagados.

- Devolviendo un valor de resultado:


- Consultando el "último resultado":


- Haciendo una llamada a la macro "TryCatch", que permite en una sola instrucción capturar y tratar la excepción:



Clases e interfaces

C++ permite herencia múltiple, pero bada no.
Las interfaces en bada tienen las siguientes características:

- Una clase interface siempre es abstracta, es decir, contiene solo métodos virtuales puros, o sea que no puede ser instanciada directamente (no puedes hacer new)
- La clase derivada es responsable de implementar los métodos de la interface
- Se deben implementar todos los métodos de la interface
- Los nombres de las clases interface deben empezar siempre por I (por ejemplo IActionEventListener).
- Las clases derivadas deben evitar usar la palabra clave virtual en la declaración de herencia, por lo que es preferible esto...:

 public class MyClass : public Osp::Ui::IActionEventListener { … };


... a esto:

public class MyClass : virtual public Osp::Ui::IActionEventListener { //... };


Sistema de ficheros y rutas por defecto en los teléfonos bada


Ruta
Descripción
Permisos
/Home
Directorio “Home” de la aplicación
r/w
/Home/Share
Utilizado para compartir datos temporales con otras aplicaciones
r/w
/Share/[appid]
Utilizado para consultar datos temporales de otras aplicaciones
r
/Res
Utilizado para consultar ficheros de recursos, como el fichero del icono de la aplicación
r
/Share/AppControl/[appcontrol-name]
Utilizado para consultar datos proporcionados por un control de la aplicación por su nombre
r
/Media/{Images,Sounds,Videos, Themes,Others}
Utilizado para consultar imágenes, sonido, vídeo, etc.
r
/Storagecard/Media/{Images,Sounds, Videos,Themes,Others}
Utilizado para consultar imágenes, vídeo, etc. de una memoria extrena
r


Vía: Introduction to bada - A developer's guide

1 comentario:

Frezeer dijo...

Gracias por los tutoriales de Bada, esperando con ancia los demas, Feliz Año.

Publicar un comentario