On Mon, 2007-05-07 at 17:35 -0400, Claudio Saavedra wrote:
> On Fri, 2007-05-04 at 10:28 -0400, Alejandro Valdes Jimenez wrote:
> > Adjunto un ejemplo que hice de gobject para que alguien si tiene un
> > tiempecito le de una miradita... quiero saber si está bien
> > implementado
> > y si es un buen ejemplo.
>
> Le eché una mirada rápida, no soy experto en GObject, pero tengo algunos
> comentarios, ojalá te sean útiles:
> [lista de comentarios útiles]
Yo agregaría lo siguiente:
- Aprender y acostumbrarse a usar g_assert, g_return_if_fail y afines.
Si PersonaMainApp será parte de una biblioteca independiente, que puede
ser utilizada por otras aplicaciones, entonces usar g_return_if_fail o
g_return_val_if_fail.
Si es parte de la misma aplicación, entonces usar g_assert.
La idea es verificar los parámetros punteros que recibe cada
función/método; antes de realizar cualquier operación. Esto es
para atrapar los errores tan pronto como sucedan.
Así, por ejemplo, está definida:
void
persona_main_app_agregar_persona (PersonaMainApp *obj, gchar *nombre,
gint edad)
{
obj->nombre = g_string_new (nombre);
obj->edad = edad;
}
¿Qué sucede si obj es nulo? ¿O no corresponde al tipo? Lo mismo
con nombre.
Lo correcto sería:
void
persona_main_app_agregar_persona (PersonaMainApp *obj, gchar *nombre,
gint edad)
{
g_assert (PERSONA_IS_MAIN_APP (obj));
g_assert (nombre != NULL);
obj->nombre = g_string_new (nombre);
obj->edad = edad;
}
Algo similar ocurre en otras funciones.
--
Germán Poó Caamaño
Concepción - Chile